diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..53e28a034d --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: Intel Corporation +# +# SPDX-License-Identifier: BSD-3-Clause + +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..5b13fae5a7 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,117 @@ +# SPDX-FileCopyrightText: Intel Corporation +# +# SPDX-License-Identifier: BSD-3-Clause + +on: + push: + branches: + - main + pull_request: + +env: + SPHINXOPTS: -q -W + +jobs: + checks: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: '3.10' + - run: pip install -r requirements.txt + - name: Checks + run: | + pre-commit run --all + + clang: + runs-on: ubuntu-latest + env: + CXX: clang++ + steps: + - uses: actions/checkout@v3 + - name: Build & test + run: | + #source /opt/intel/oneapi/setvars.sh + cmake -B build + make -j -C build all test + - uses: actions/upload-artifact@v3 + with: + name: log-clang-${{ env.CXX }} + path: build/Testing + + gcc: + runs-on: ubuntuy-latest + strategy: + fail-fast: false + matrix: + include: + - cxx: g++-10 + - cxx: g++-11 + - cxx: g++-12 + name: ${{ matrix.cxx }} + env: + CXX: ${{ matrix.cxx }} + steps: + - uses: actions/checkout@v3 + - name: Build & test + run: | + #source /opt/intel/oneapi/setvars.sh + cmake -B build + make -j -C build all test + cmake -B build-nofmt + make -j -C build-nofmt/examples/cpu all test + - uses: actions/upload-artifact@v3 + with: + name: log-gcc-${{ env.CXX }} + path: build/Testing + + icpx: + runs-on: ubuntu-latest + env: + CXX: icpx + steps: + - uses: actions/checkout@v3 + - name: Build & test + run: | + #source /opt/intel/oneapi/setvars.sh + cmake -B build -DENABLE_SYCL_MPI=on + make -j -C build all test + - uses: actions/upload-artifact@v3 + with: + name: log-icpx-${{ env.CXX }} + path: build/Testing + + publish: + needs: [checks, clang, gcc, icpx] + runs-on: dds-base + if: ${{ github.ref == 'refs/heads/main' }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: '3.10' + - run: pip install -r requirements.txt + - name: Build doc + run: | + make -C doc/spec html + - name: Checkout gh-pages + uses: actions/checkout@v3 + with: + ref: gh-pages + path: gh-pages + - name: Publish to github pages + run: | + rm -rf gh-pages/* + touch gh-pages/.nojekyll + + cp -r doc/spec/build/html gh-pages/spec + cp -r doc/spec/build/doxygen-html gh-pages/doxygen + + cd gh-pages + git config user.name github-actions + git config user.email github-actions@github.com + git add . + # Ignore errors because no updates returns an error status. + git commit --reset-author --amend -m "Update from github actions" + git push --force origin gh-pages diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000..16da31e05f --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,60 @@ +# SPDX-FileCopyrightText: Intel Corporation +# +# SPDX-License-Identifier: BSD-3-Clause + +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: + +- repo: https://github.com/pre-commit/mirrors-clang-format + rev: v15.0.4 + hooks: + - id: clang-format + +- repo: https://github.com/ambv/black + rev: 22.10.0 + hooks: + - id: black + +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: mixed-line-ending + - id: check-xml + - id: check-yaml + - id: check-case-conflict + - id: check-toml + - id: check-json + - id: check-added-large-files + args: ['--maxkb=800'] + +- repo: https://github.com/pycqa/flake8 + rev: 5.0.4 + hooks: + - id: flake8 + +- repo: https://github.com/pycqa/doc8 + rev: v1.0.0 + hooks: + - id: doc8 + +- repo: https://github.com/pycqa/isort + rev: 5.10.1 + hooks: + - id: isort + +- repo: https://github.com/fsfe/reuse-tool + rev: v1.0.0 + hooks: + - id: reuse + +- repo: local + hooks: + - id: sphinx + name: sphinx + entry: make -C doc/spec spelling linkcheck html + language: system + pass_filenames: false + always_run: true diff --git a/bench/devcloud/dr-bench-05ae8920514c49deb09dee3d94648622.json b/bench/devcloud/dr-bench-05ae8920514c49deb09dee3d94648622.json new file mode 100644 index 0000000000..e32f94383e --- /dev/null +++ b/bench/devcloud/dr-bench-05ae8920514c49deb09dee3d94648622.json @@ -0,0 +1,134 @@ +{ + "context": { + "date": "2023-12-01T02:48:36-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3800, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [2.06689,2.31787,24.0571], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "6000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "3", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "1" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.6165553901350177e+02, + "cpu_time": 5.6165532700000040e+02, + "time_unit": "ms", + "bytes_per_second": 2.1365408451373840e+12, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.3608734270749260e+03, + "cpu_time": 2.3596445299999968e+03, + "time_unit": "ms", + "bytes_per_second": 2.0331458454963010e+12, + "footprint": 3.2000000000000000e+10 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.1467817188989820e+03, + "cpu_time": 5.1372696359999918e+03, + "time_unit": "ms", + "bytes_per_second": 4.6631081928094995e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 9.2316018368905516e+03, + "cpu_time": 9.0834726950000113e+03, + "time_unit": "ms", + "bytes_per_second": 1.1814815513449133e+12, + "flops": 2.1933444641304083e+09, + "footprint": 3.5996591616000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.1385008794861028e+02, + "cpu_time": 5.1266339400000049e+02, + "time_unit": "ms", + "bytes_per_second": 1.8682491693881130e+12, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-0f326341f9d94ba29646527008f9397e.json b/bench/devcloud/dr-bench-0f326341f9d94ba29646527008f9397e.json new file mode 100644 index 0000000000..90cef0d3a8 --- /dev/null +++ b/bench/devcloud/dr-bench-0f326341f9d94ba29646527008f9397e.json @@ -0,0 +1,134 @@ +{ + "context": { + "date": "2023-12-01T02:42:03-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3710, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [2.88379,2.87305,35.7134], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.5516163100903964e+02, + "cpu_time": 5.5515669999999955e+02, + "time_unit": "ms", + "bytes_per_second": 7.2051088846499707e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.3124956898975342e+03, + "cpu_time": 2.3124854639999980e+03, + "time_unit": "ms", + "bytes_per_second": 6.9189318146184106e+11, + "footprint": 3.2000000000000000e+10 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.1613349071019511e+03, + "cpu_time": 4.1606854099999991e+03, + "time_unit": "ms", + "bytes_per_second": 1.9224600227073248e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 8.8141352109033178e+03, + "cpu_time": 8.7900688860000009e+03, + "time_unit": "ms", + "bytes_per_second": 4.1249411816401971e+11, + "flops": 7.6576878372033358e+08, + "footprint": 3.5997811200000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.0708981210029782e+02, + "cpu_time": 5.0706769800000018e+02, + "time_unit": "ms", + "bytes_per_second": 6.3105192091042615e+11, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-1255d1c30769449395d041799418a44b.json b/bench/devcloud/dr-bench-1255d1c30769449395d041799418a44b.json new file mode 100644 index 0000000000..4814090c1c --- /dev/null +++ b/bench/devcloud/dr-bench-1255d1c30769449395d041799418a44b.json @@ -0,0 +1,117 @@ +{ + "context": { + "date": "2023-12-01T03:08:33-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3619, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [142.663,118.33,79.1997], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "CPU", + "device_info0": "Intel(R) Xeon(R) Platinum 8480+, max_compute_units: 112", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "SHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "SHP_SYCL_CPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Reduce_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.8577399690809459e+03, + "cpu_time": 1.8487172580000006e+03, + "time_unit": "ms", + "bytes_per_second": 2.1531538679112689e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "DotProduct_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 7.3865799620094967e+03, + "cpu_time": 7.3686075740000024e+03, + "time_unit": "ms", + "bytes_per_second": 2.1660904075080569e+11, + "footprint": 3.2000000000000000e+10 + }, + { + "name": "Inclusive_Scan_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.1631580167999262e+04, + "cpu_time": 1.1597553164000004e+04, + "time_unit": "ms", + "bytes_per_second": 6.8778273325317871e+10, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "BlackScholes_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "BlackScholes_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.0471538821970993e+04, + "cpu_time": 4.0396294231000000e+04, + "time_unit": "ms", + "bytes_per_second": 4.9417443917755104e+10, + "footprint": 4.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-1931eb5d1d374795a0001e0bd3593fae.json b/bench/devcloud/dr-bench-1931eb5d1d374795a0001e0bd3593fae.json new file mode 100644 index 0000000000..aa448cdb68 --- /dev/null +++ b/bench/devcloud/dr-bench-1931eb5d1d374795a0001e0bd3593fae.json @@ -0,0 +1,86 @@ +{ + "context": { + "date": "2023-12-01T03:07:47-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3799, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [109.821,109.198,74.4443], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "CPU", + "device_info": "Intel(R) Xeon(R) Platinum 8480+, max_compute_units: 112", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "2", + "runtime": "SYCL", + "target": "MHP_SYCL_CPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.8118294787895607e+04, + "cpu_time": 1.7760385455999996e+04, + "time_unit": "ms", + "bytes_per_second": 2.0066893566766425e+11, + "flops": 3.7252896472957474e+08, + "footprint": 1.7998905600000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.0610982560803536e+03, + "cpu_time": 2.0606356890000015e+03, + "time_unit": "ms", + "bytes_per_second": 1.5525703301915973e+11, + "footprint": 1.6000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-1bbc05c89b3142469b1ed34d9e5c57f8.json b/bench/devcloud/dr-bench-1bbc05c89b3142469b1ed34d9e5c57f8.json new file mode 100644 index 0000000000..f60ef2186a --- /dev/null +++ b/bench/devcloud/dr-bench-1bbc05c89b3142469b1ed34d9e5c57f8.json @@ -0,0 +1,213 @@ +{ + "context": { + "date": "2023-12-01T03:11:36-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3000, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [92.9668,104.205,80.2827], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "CPU", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "56", + "runtime": "DIRECT", + "target": "MHP_DIRECT_CPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.0528119340009212e+03, + "cpu_time": 2.0527000079999993e+03, + "time_unit": "ms", + "bytes_per_second": 1.9485467391082523e+11, + "footprint": 1.4285714200000000e+08 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 7.8632067970901653e+03, + "cpu_time": 7.8629778639999977e+03, + "time_unit": "ms", + "bytes_per_second": 2.0347932354927905e+11, + "footprint": 5.7142857100000000e+08 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.3750288408972910e+04, + "cpu_time": 1.3749173764999994e+04, + "time_unit": "ms", + "bytes_per_second": 5.8180597832257156e+10, + "footprint": 2.8571428500000000e+08 + }, + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.4045541670832581e+03, + "cpu_time": 4.4044608720000015e+03, + "time_unit": "ms", + "bytes_per_second": 1.8163018767680823e+11, + "footprint": 2.8571428500000000e+08 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.4591662551080772e+03, + "cpu_time": 4.4590019729999995e+03, + "time_unit": "ms", + "bytes_per_second": 1.7940573511552335e+11, + "footprint": 2.8571428500000000e+08 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 6.4642623949062536e+03, + "cpu_time": 6.4642111510000004e+03, + "time_unit": "ms", + "bytes_per_second": 1.8563602878273984e+11, + "footprint": 4.2857142800000000e+08 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 6.3968053419699909e+03, + "cpu_time": 6.3965907470000047e+03, + "time_unit": "ms", + "bytes_per_second": 1.8759364023893250e+11, + "footprint": 4.2857142800000000e+08 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 7, + "per_family_instance_index": 0, + "run_name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.9712159749890143e+04, + "cpu_time": 1.9711895787000001e+04, + "time_unit": "ms", + "bytes_per_second": 1.8444345913036050e+11, + "flops": 3.4240741175190687e+08, + "footprint": 6.4281805700000000e+08 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 8, + "per_family_instance_index": 0, + "run_name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.2683754339010302e+03, + "cpu_time": 2.2683492609999976e+03, + "time_unit": "ms", + "bytes_per_second": 1.4109269357127237e+11, + "footprint": 5.7152000000000000e+08 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 9, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.2497487882982461e+04, + "cpu_time": 1.2497265677999991e+04, + "time_unit": "ms", + "bytes_per_second": 1.6003216156131293e+11, + "footprint": 7.1428571400000000e+08 + } + ] +} diff --git a/bench/devcloud/dr-bench-27a255afd4df46ddbdc52d067feeb958.json b/bench/devcloud/dr-bench-27a255afd4df46ddbdc52d067feeb958.json new file mode 100644 index 0000000000..ea5161eabe --- /dev/null +++ b/bench/devcloud/dr-bench-27a255afd4df46ddbdc52d067feeb958.json @@ -0,0 +1,181 @@ +{ + "context": { + "date": "2023-12-01T03:00:14-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3800, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [195.833,99.2056,53.0107], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "CPU", + "device_info0": "Intel(R) Xeon(R) Platinum 8480+, max_compute_units: 112", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "SHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "SHP_SYCL_CPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.8646866271095548e+03, + "cpu_time": 1.8501959899999995e+03, + "time_unit": "ms", + "bytes_per_second": 2.1451325610675870e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 7.3905101448925943e+03, + "cpu_time": 7.3666108349999995e+03, + "time_unit": "ms", + "bytes_per_second": 2.1649385071282553e+11, + "footprint": 3.2000000000000000e+10 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.2791255334911728e+04, + "cpu_time": 1.2748943330000004e+04, + "time_unit": "ms", + "bytes_per_second": 6.2542727750616104e+10, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.3128416599641369e+03, + "cpu_time": 6.6100220000038235e+00, + "time_unit": "ms", + "bytes_per_second": 1.8549255063693951e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.3243016421108987e+03, + "cpu_time": 6.0379869999991342e+00, + "time_unit": "ms", + "bytes_per_second": 1.8500097037853299e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 6.2428005789869521e+03, + "cpu_time": 6.3116660000019920e+00, + "time_unit": "ms", + "bytes_per_second": 1.9222142127031223e+11, + "footprint": 2.4000000000000000e+10 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 6.2416961680003942e+03, + "cpu_time": 6.4830270000015844e+00, + "time_unit": "ms", + "bytes_per_second": 1.9225543309078357e+11, + "footprint": 2.4000000000000000e+10 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 7, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.0670778174916413e+04, + "cpu_time": 9.4669509999931734e+00, + "time_unit": "ms", + "bytes_per_second": 4.9175356109450943e+10, + "footprint": 4.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-3b67dab7a52d48728f3ac9b1c65be965.json b/bench/devcloud/dr-bench-3b67dab7a52d48728f3ac9b1c65be965.json new file mode 100644 index 0000000000..da3917516b --- /dev/null +++ b/bench/devcloud/dr-bench-3b67dab7a52d48728f3ac9b1c65be965.json @@ -0,0 +1,134 @@ +{ + "context": { + "date": "2023-12-01T02:44:23-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3389, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [2.33691,2.49316,30.9614], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "3", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.8678983089047455e+02, + "cpu_time": 1.8677556899999990e+02, + "time_unit": "ms", + "bytes_per_second": 2.1414442001103511e+12, + "footprint": 2.6666666660000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 7.8309814293891316e+02, + "cpu_time": 7.8306104400000004e+02, + "time_unit": "ms", + "bytes_per_second": 2.0431666380861418e+12, + "footprint": 1.0666666666000000e+10 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.7300336490206105e+03, + "cpu_time": 1.7267569800000010e+03, + "time_unit": "ms", + "bytes_per_second": 4.6241875148086749e+11, + "footprint": 5.3333333330000000e+09 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.2536409489151224e+03, + "cpu_time": 3.1660738910000000e+03, + "time_unit": "ms", + "bytes_per_second": 1.1174493400730945e+12, + "flops": 2.0744727847891603e+09, + "footprint": 1.1999270400000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.7660868994339677e+02, + "cpu_time": 1.7595972499999846e+02, + "time_unit": "ms", + "bytes_per_second": 1.8119244307998706e+12, + "footprint": 1.0666720000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-3dad8cd026d44af98eb20bf90595f93c.json b/bench/devcloud/dr-bench-3dad8cd026d44af98eb20bf90595f93c.json new file mode 100644 index 0000000000..8f323d59fc --- /dev/null +++ b/bench/devcloud/dr-bench-3dad8cd026d44af98eb20bf90595f93c.json @@ -0,0 +1,117 @@ +{ + "context": { + "date": "2023-12-01T02:52:17-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3800, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [4.90234,3.4458,19.8945], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info0": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "SHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "SHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Reduce_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.5441771891002475e+02, + "cpu_time": 5.5434709100000032e+02, + "time_unit": "ms", + "bytes_per_second": 7.2147766270239844e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "DotProduct_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.3062339069814975e+03, + "cpu_time": 2.3054007839999995e+03, + "time_unit": "ms", + "bytes_per_second": 6.9377177881065491e+11, + "footprint": 3.2000000000000000e+10 + }, + { + "name": "Inclusive_Scan_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.1594624510100275e+03, + "cpu_time": 4.1581149100000021e+03, + "time_unit": "ms", + "bytes_per_second": 1.9233254523207413e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "BlackScholes_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "BlackScholes_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.6197639669901782e+03, + "cpu_time": 2.6190965850000011e+03, + "time_unit": "ms", + "bytes_per_second": 7.6342755500136938e+11, + "footprint": 4.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-47a547f0f82c4c6e881cc3d9b04de02f.json b/bench/devcloud/dr-bench-47a547f0f82c4c6e881cc3d9b04de02f.json new file mode 100644 index 0000000000..6608d68996 --- /dev/null +++ b/bench/devcloud/dr-bench-47a547f0f82c4c6e881cc3d9b04de02f.json @@ -0,0 +1,133 @@ +{ + "context": { + "date": "2023-12-01T02:38:35-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3800, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [5.06348,3.64062,44.063], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info0": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "SHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "SHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 9.2767433704822122e+02, + "cpu_time": 3.5146409999999850e+00, + "time_unit": "ms", + "bytes_per_second": 8.6237159749996985e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 9.3459736807634465e+02, + "cpu_time": 4.1861409999999211e+00, + "time_unit": "ms", + "bytes_per_second": 8.5598357894653333e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.4542426809764263e+03, + "cpu_time": 4.0649390000000452e+00, + "time_unit": "ms", + "bytes_per_second": 8.2517176513776953e+11, + "footprint": 2.4000000000000000e+10 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.4702525659040602e+03, + "cpu_time": 4.1476529999999734e+00, + "time_unit": "ms", + "bytes_per_second": 8.1618629875481189e+11, + "footprint": 2.4000000000000000e+10 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.4503114609444197e+03, + "cpu_time": 4.1543390000000624e+00, + "time_unit": "ms", + "bytes_per_second": 8.1622276672906848e+11, + "footprint": 4.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-4b2a5a23ba8945cb8e27660743b2b01c.json b/bench/devcloud/dr-bench-4b2a5a23ba8945cb8e27660743b2b01c.json new file mode 100644 index 0000000000..21c6060172 --- /dev/null +++ b/bench/devcloud/dr-bench-4b2a5a23ba8945cb8e27660743b2b01c.json @@ -0,0 +1,86 @@ +{ + "context": { + "date": "2023-12-01T03:06:38-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3036, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [159.696,113.046,72.7725], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "CPU", + "device_info": "Intel(R) Xeon(R) Platinum 8480+, max_compute_units: 112", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "MHP_SYCL_CPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.8323353646897627e+04, + "cpu_time": 2.8057506888000000e+04, + "time_unit": "ms", + "bytes_per_second": 1.2836682324157761e+11, + "flops": 2.3830474611679012e+08, + "footprint": 3.5997811200000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.2234370399226418e+03, + "cpu_time": 3.2130882019999945e+03, + "time_unit": "ms", + "bytes_per_second": 9.9272917707640289e+10, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-4d94d50f10a5440d9e71127a18ccb37f.json b/bench/devcloud/dr-bench-4d94d50f10a5440d9e71127a18ccb37f.json new file mode 100644 index 0000000000..3ffe60f234 --- /dev/null +++ b/bench/devcloud/dr-bench-4d94d50f10a5440d9e71127a18ccb37f.json @@ -0,0 +1,134 @@ +{ + "context": { + "date": "2023-12-01T02:50:19-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3675, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [3.42627,2.70752,21.9697], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "8000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "4", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "1" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.6175510802643703e+02, + "cpu_time": 5.6174769899999785e+02, + "time_unit": "ms", + "bytes_per_second": 2.8482162015778262e+12, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.3643713110717772e+03, + "cpu_time": 2.3643595180000007e+03, + "time_unit": "ms", + "bytes_per_second": 2.7068506414497388e+12, + "footprint": 3.2000000000000000e+10 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.1494293889559958e+03, + "cpu_time": 5.1441228399999945e+03, + "time_unit": "ms", + "bytes_per_second": 6.2142807645116064e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 9.2204183599029802e+03, + "cpu_time": 8.9897945809999983e+03, + "time_unit": "ms", + "bytes_per_second": 1.5772728695309468e+12, + "flops": 2.9281055746242824e+09, + "footprint": 3.5997811200000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.1413105293202989e+02, + "cpu_time": 5.1167924599999992e+02, + "time_unit": "ms", + "bytes_per_second": 2.4896375986245303e+12, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-504b793dae8f487da53338f4c4375989.json b/bench/devcloud/dr-bench-504b793dae8f487da53338f4c4375989.json new file mode 100644 index 0000000000..09d72ea72d --- /dev/null +++ b/bench/devcloud/dr-bench-504b793dae8f487da53338f4c4375989.json @@ -0,0 +1,182 @@ +{ + "context": { + "date": "2023-12-01T03:03:48-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3777, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [112.497,100.962,62.8032], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "CPU", + "device_info0": "Intel(R) Xeon(R) Platinum 8480+, max_compute_units: 112", + "device_info1": "Intel(R) Xeon(R) Platinum 8480+, max_compute_units: 112", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "SHP", + "numactl": "", + "rank": "0", + "ranks": "2", + "runtime": "SYCL", + "target": "SHP_SYCL_CPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.5048122539442868e+03, + "cpu_time": 9.6845947799999976e+02, + "time_unit": "ms", + "bytes_per_second": 2.6581389070400894e+11, + "footprint": 4.0000000000000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.0602420900029492e+03, + "cpu_time": 3.7317751040000003e+03, + "time_unit": "ms", + "bytes_per_second": 3.1619040582286987e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.0485001341903724e+04, + "cpu_time": 6.1815530639999988e+03, + "time_unit": "ms", + "bytes_per_second": 7.6299465676057495e+10, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.1075174429734507e+03, + "cpu_time": 7.7651490000008039e+00, + "time_unit": "ms", + "bytes_per_second": 2.5744022831116086e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.1934110898864596e+03, + "cpu_time": 7.9798829999973009e+00, + "time_unit": "ms", + "bytes_per_second": 2.5051582069518134e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.3504073669151376e+03, + "cpu_time": 7.4055979999982924e+00, + "time_unit": "ms", + "bytes_per_second": 2.7583623757306128e+11, + "footprint": 1.2000000000000000e+10 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.2855591999695043e+03, + "cpu_time": 9.0602880000005825e+00, + "time_unit": "ms", + "bytes_per_second": 2.8001013263532544e+11, + "footprint": 1.2000000000000000e+10 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 7, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.0143088417085510e+04, + "cpu_time": 1.3105503000005569e+01, + "time_unit": "ms", + "bytes_per_second": 9.9289640128054352e+10, + "footprint": 2.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-5855e60fafe3432297c3267e8844b853.json b/bench/devcloud/dr-bench-5855e60fafe3432297c3267e8844b853.json new file mode 100644 index 0000000000..80d2dce5be --- /dev/null +++ b/bench/devcloud/dr-bench-5855e60fafe3432297c3267e8844b853.json @@ -0,0 +1,136 @@ +{ + "context": { + "date": "2023-12-01T02:39:12-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3798, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [3.21729,3.33203,42.4629], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info0": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "device_info1": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "device_info2": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "device_info3": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "SHP", + "numactl": "", + "rank": "0", + "ranks": "4", + "runtime": "SYCL", + "target": "SHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.3325329298617777e+02, + "cpu_time": 1.9933230000002133e+00, + "time_unit": "ms", + "bytes_per_second": 3.4297479352088149e+12, + "footprint": 4.0000000000000000e+09 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.3419590093052662e+02, + "cpu_time": 1.8998169999999703e+00, + "time_unit": "ms", + "bytes_per_second": 3.4159436472686904e+12, + "footprint": 4.0000000000000000e+09 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.6309831208078140e+02, + "cpu_time": 2.2632049999997683e+00, + "time_unit": "ms", + "bytes_per_second": 3.3048900533942065e+12, + "footprint": 6.0000000000000000e+09 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.6253453299445562e+02, + "cpu_time": 2.3339540000000270e+00, + "time_unit": "ms", + "bytes_per_second": 3.3100295028125010e+12, + "footprint": 6.0000000000000000e+09 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 6.1424283089181984e+02, + "cpu_time": 5.8677320000000144e+00, + "time_unit": "ms", + "bytes_per_second": 3.2560412583020264e+12, + "footprint": 1.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-60577e0e78d947eea41d9663ea0e3669.json b/bench/devcloud/dr-bench-60577e0e78d947eea41d9663ea0e3669.json new file mode 100644 index 0000000000..f577cadc74 --- /dev/null +++ b/bench/devcloud/dr-bench-60577e0e78d947eea41d9663ea0e3669.json @@ -0,0 +1,134 @@ +{ + "context": { + "date": "2023-12-01T02:45:01-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3778, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [2.76758,2.58887,29.791], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "4", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.4087592093710325e+02, + "cpu_time": 1.4087091599999991e+02, + "time_unit": "ms", + "bytes_per_second": 2.8393780664517373e+12, + "footprint": 2.0000000000000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.9309943610959851e+02, + "cpu_time": 5.9309413599999948e+02, + "time_unit": "ms", + "bytes_per_second": 2.6976926676833613e+12, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.3147923870565719e+03, + "cpu_time": 1.3117010009999995e+03, + "time_unit": "ms", + "bytes_per_second": 6.0846108319121130e+11, + "footprint": 4.0000000000000000e+09 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.5449880020658366e+03, + "cpu_time": 2.4650086589999987e+03, + "time_unit": "ms", + "bytes_per_second": 1.4286035644367434e+12, + "flops": 2.6521105775434594e+09, + "footprint": 8.9994528000000000e+09 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.3530595807127114e+02, + "cpu_time": 1.3452668200000062e+02, + "time_unit": "ms", + "bytes_per_second": 2.3650104146296577e+12, + "footprint": 8.0000000000000000e+09 + } + ] +} diff --git a/bench/devcloud/dr-bench-6250900504ea40ecaedc31dd2cb5825f.json b/bench/devcloud/dr-bench-6250900504ea40ecaedc31dd2cb5825f.json new file mode 100644 index 0000000000..c8e63f9b4a --- /dev/null +++ b/bench/devcloud/dr-bench-6250900504ea40ecaedc31dd2cb5825f.json @@ -0,0 +1,133 @@ +{ + "context": { + "date": "2023-12-01T02:41:43-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3590, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [2.44043,2.79443,36.4048], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "4", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.3363383195950294e+02, + "cpu_time": 4.0231070000000813e+00, + "time_unit": "ms", + "bytes_per_second": 3.4241616177346631e+12, + "footprint": 4.0000000000000000e+09 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.3287898110275810e+02, + "cpu_time": 5.4413149999996691e+00, + "time_unit": "ms", + "bytes_per_second": 3.4352606500240532e+12, + "footprint": 4.0000000000000000e+09 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.7361330898735730e+02, + "cpu_time": 6.2352160000003209e+00, + "time_unit": "ms", + "bytes_per_second": 3.2118770159780547e+12, + "footprint": 6.0000000000000000e+09 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.7350632600031844e+02, + "cpu_time": 7.7625230000002432e+00, + "time_unit": "ms", + "bytes_per_second": 3.2127969902147710e+12, + "footprint": 6.0000000000000000e+09 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 6.6721946799791203e+02, + "cpu_time": 3.6261122000000867e+01, + "time_unit": "ms", + "bytes_per_second": 2.9975144550282500e+12, + "footprint": 1.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-66fbf2f1650d4e3f925b6bf0688b7b84.json b/bench/devcloud/dr-bench-66fbf2f1650d4e3f925b6bf0688b7b84.json new file mode 100644 index 0000000000..dd0e715d99 --- /dev/null +++ b/bench/devcloud/dr-bench-66fbf2f1650d4e3f925b6bf0688b7b84.json @@ -0,0 +1,134 @@ +{ + "context": { + "date": "2023-12-01T02:38:53-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3691, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [4.08936,3.49414,43.3667], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info0": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "device_info1": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "SHP", + "numactl": "", + "rank": "0", + "ranks": "2", + "runtime": "SYCL", + "target": "SHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.7125676499661682e+02, + "cpu_time": 2.3728100000000030e+00, + "time_unit": "ms", + "bytes_per_second": 1.6975883624837581e+12, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.7019346299559152e+02, + "cpu_time": 3.0029430000000357e+00, + "time_unit": "ms", + "bytes_per_second": 1.7014273122880500e+12, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 7.2705783096899427e+02, + "cpu_time": 4.7765499999998795e+00, + "time_unit": "ms", + "bytes_per_second": 1.6504876900929421e+12, + "footprint": 1.2000000000000000e+10 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 7.2930800494220853e+02, + "cpu_time": 4.4668640000000703e+00, + "time_unit": "ms", + "bytes_per_second": 1.6453953499318713e+12, + "footprint": 1.2000000000000000e+10 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.3184490349126627e+03, + "cpu_time": 4.6986640000001856e+00, + "time_unit": "ms", + "bytes_per_second": 1.5169338723301389e+12, + "footprint": 2.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-7800cee608ec44d699f9a435db3e65f1.json b/bench/devcloud/dr-bench-7800cee608ec44d699f9a435db3e65f1.json new file mode 100644 index 0000000000..27ef186248 --- /dev/null +++ b/bench/devcloud/dr-bench-7800cee608ec44d699f9a435db3e65f1.json @@ -0,0 +1,69 @@ +{ + "context": { + "date": "2023-12-01T03:11:20-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3782, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [107.614,107.566,80.9629], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "CPU", + "device_info": "Intel(R) Xeon(R) Platinum 8480+, max_compute_units: 112", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "MHP_SYCL_CPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Stencil2D_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Stencil2D_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.1855799399601656e+03, + "cpu_time": 3.1803619880000006e+03, + "time_unit": "ms", + "bytes_per_second": 1.0045266671411847e+11, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-7ca861e4d8f5486aa6185066cfd7d4b0.json b/bench/devcloud/dr-bench-7ca861e4d8f5486aa6185066cfd7d4b0.json new file mode 100644 index 0000000000..a6da798e9c --- /dev/null +++ b/bench/devcloud/dr-bench-7ca861e4d8f5486aa6185066cfd7d4b0.json @@ -0,0 +1,134 @@ +{ + "context": { + "date": "2023-12-01T02:45:33-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3785, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [3.54297,2.79004,28.9907], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "1" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.5363951008610945e+02, + "cpu_time": 5.5363853499999925e+02, + "time_unit": "ms", + "bytes_per_second": 7.2249178881360291e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.3046611520618158e+03, + "cpu_time": 2.3046508220000028e+03, + "time_unit": "ms", + "bytes_per_second": 6.9424522497313501e+11, + "footprint": 3.2000000000000000e+10 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.1552449670309843e+03, + "cpu_time": 4.1543743730000033e+03, + "time_unit": "ms", + "bytes_per_second": 1.9252775861530444e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 8.7966737679239213e+03, + "cpu_time": 8.7705582979999981e+03, + "time_unit": "ms", + "bytes_per_second": 4.1331292112451160e+11, + "flops": 7.6728883872124672e+08, + "footprint": 3.5997811200000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.0692690308589169e+02, + "cpu_time": 5.0692577499999913e+02, + "time_unit": "ms", + "bytes_per_second": 6.3125471947141943e+11, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-9736fe26172840069fdc275df840cbf9.json b/bench/devcloud/dr-bench-9736fe26172840069fdc275df840cbf9.json new file mode 100644 index 0000000000..276bbfd4b2 --- /dev/null +++ b/bench/devcloud/dr-bench-9736fe26172840069fdc275df840cbf9.json @@ -0,0 +1,133 @@ +{ + "context": { + "date": "2023-12-01T02:40:34-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3797, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [1.75879,2.82764,39.0518], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "2", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.7538095796464046e+02, + "cpu_time": 5.8109689999996661e+00, + "time_unit": "ms", + "bytes_per_second": 1.6828608437014954e+12, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.7353414393531943e+02, + "cpu_time": 5.1237479999990398e+00, + "time_unit": "ms", + "bytes_per_second": 1.6894241106915256e+12, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 7.3717815506481179e+02, + "cpu_time": 3.7706250000013597e+00, + "time_unit": "ms", + "bytes_per_second": 1.6278290285127854e+12, + "footprint": 1.2000000000000000e+10 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 7.4532339501341619e+02, + "cpu_time": 4.3830029999973874e+00, + "time_unit": "ms", + "bytes_per_second": 1.6100393574501970e+12, + "footprint": 1.2000000000000000e+10 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.2879471159133802e+03, + "cpu_time": 6.5052462000000588e+01, + "time_unit": "ms", + "bytes_per_second": 1.5528587899990361e+12, + "footprint": 2.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-982c908512be4f42896b0f5b4890b926.json b/bench/devcloud/dr-bench-982c908512be4f42896b0f5b4890b926.json new file mode 100644 index 0000000000..98183fb955 --- /dev/null +++ b/bench/devcloud/dr-bench-982c908512be4f42896b0f5b4890b926.json @@ -0,0 +1,135 @@ +{ + "context": { + "date": "2023-12-01T02:39:04-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3786, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [3.53369,3.39502,42.9067], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info0": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "device_info1": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "device_info2": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "SHP", + "numactl": "", + "rank": "0", + "ranks": "3", + "runtime": "SYCL", + "target": "SHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.1163578898584115e+02, + "cpu_time": 1.7084939999998383e+00, + "time_unit": "ms", + "bytes_per_second": 2.5670992494265386e+12, + "footprint": 5.3333333330000000e+09 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.1133390499648874e+02, + "cpu_time": 1.8784039999997226e+00, + "time_unit": "ms", + "bytes_per_second": 2.5695884295320244e+12, + "footprint": 5.3333333330000000e+09 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.8830343389668059e+02, + "cpu_time": 5.0915680000001018e+00, + "time_unit": "ms", + "bytes_per_second": 2.4574883498646587e+12, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.0738236808511351e+02, + "cpu_time": 4.5421920000001670e+00, + "time_unit": "ms", + "bytes_per_second": 2.3650802146098613e+12, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 8.4333098311327967e+02, + "cpu_time": 5.5361199999999222e+00, + "time_unit": "ms", + "bytes_per_second": 2.3715481110592041e+12, + "footprint": 1.3333333333000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-9bcab8ff6d954174bfc465788bba33e9.json b/bench/devcloud/dr-bench-9bcab8ff6d954174bfc465788bba33e9.json new file mode 100644 index 0000000000..81ab2c00a6 --- /dev/null +++ b/bench/devcloud/dr-bench-9bcab8ff6d954174bfc465788bba33e9.json @@ -0,0 +1,86 @@ +{ + "context": { + "date": "2023-12-01T02:53:04-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3793, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [2.9502,3.13232,19.0088], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info0": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "SHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "SHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Gemm_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Gemm_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.7745659003653083e+02, + "cpu_time": 3.7741401400000018e+02, + "time_unit": "ms", + "bytes_per_second": 8.1386842383721189e+09, + "flops": 1.0851578984496158e+13, + "footprint": 3.0720000000000000e+09 + }, + { + "name": "SyclSortFixture/Sort_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "SyclSortFixture/Sort_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 7.6249401105612128e+02, + "cpu_time": 7.6124128000000019e+02, + "time_unit": "ms", + "bytes_per_second": 1.0491885685658432e+10, + "footprint": 8.0000000000000000e+09 + } + ] +} diff --git a/bench/devcloud/dr-bench-9d00be9dc79741cbbfb02f0aaf274312.json b/bench/devcloud/dr-bench-9d00be9dc79741cbbfb02f0aaf274312.json new file mode 100644 index 0000000000..76e6c57482 --- /dev/null +++ b/bench/devcloud/dr-bench-9d00be9dc79741cbbfb02f0aaf274312.json @@ -0,0 +1,133 @@ +{ + "context": { + "date": "2023-12-01T02:39:21-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3361, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [2.87598,3.25488,42.0181], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 9.3012359001425682e+02, + "cpu_time": 4.0234730000001662e+00, + "time_unit": "ms", + "bytes_per_second": 8.6010075283408057e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 9.3045015894611788e+02, + "cpu_time": 4.0667689999995815e+00, + "time_unit": "ms", + "bytes_per_second": 8.5979887510162463e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.4788316269197792e+03, + "cpu_time": 4.1088970000018321e+00, + "time_unit": "ms", + "bytes_per_second": 8.1145140403809827e+11, + "footprint": 2.4000000000000000e+10 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.5049269669732180e+03, + "cpu_time": 3.9623049999946147e+00, + "time_unit": "ms", + "bytes_per_second": 7.9738088713600378e+11, + "footprint": 2.4000000000000000e+10 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.4765454599224972e+03, + "cpu_time": 4.3175810000022352e+00, + "time_unit": "ms", + "bytes_per_second": 8.0757653447742065e+11, + "footprint": 4.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-BlackScholes-CPU.csv b/bench/devcloud/dr-bench-BlackScholes-CPU.csv new file mode 100644 index 0000000000..b6af18cc77 --- /dev/null +++ b/bench/devcloud/dr-bench-BlackScholes-CPU.csv @@ -0,0 +1,8 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +76,BlackScholes_DR,BlackScholes,MHP_DIRECT_CPU,56,strong,0.16003216156131292,160.03216156131293,MHP,DIRECT,CPU,2000000000,56,56,1.0,12497.487882982461 +96,BlackScholes_DR,BlackScholes,MHP_DIRECT_CPU,112,strong,0.24000247484789544,240.00247484789546,MHP,DIRECT,CPU,2000000000,112,112,2.0,8333.247402000854 +35,BlackScholes_DR,BlackScholes,MHP_SYCL_CPU,1,strong,0.04902669621189425,49.02669621189425,MHP,SYCL,CPU,2000000000,1,56,1.0,40794.101061918685 +66,BlackScholes_DR,BlackScholes,MHP_SYCL_CPU,2,strong,0.09920903596072829,99.20903596072829,MHP,SYCL,CPU,2000000000,2,112,2.0,20159.454031905887 +142,BlackScholes_Reference,BlackScholes,Reference_CPU,1,strong,0.049417443917755106,49.4174439177551,SHP,SYCL,CPU,2000000000,1,56,1.0,40471.53882197099 +84,BlackScholes_DR,BlackScholes,SHP_SYCL_CPU,1,strong,0.049175356109450945,49.175356109450945,SHP,SYCL,CPU,2000000000,1,56,1.0,40670.77817491641 +53,BlackScholes_DR,BlackScholes,SHP_SYCL_CPU,2,strong,0.09928964012805436,99.28964012805436,SHP,SYCL,CPU,2000000000,2,112,2.0,20143.08841708551 diff --git a/bench/devcloud/dr-bench-BlackScholes-CPU.png b/bench/devcloud/dr-bench-BlackScholes-CPU.png new file mode 100644 index 0000000000..900af6113f Binary files /dev/null and b/bench/devcloud/dr-bench-BlackScholes-CPU.png differ diff --git a/bench/devcloud/dr-bench-BlackScholes-GPU.csv b/bench/devcloud/dr-bench-BlackScholes-GPU.csv new file mode 100644 index 0000000000..372960d805 --- /dev/null +++ b/bench/devcloud/dr-bench-BlackScholes-GPU.csv @@ -0,0 +1,10 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +152,BlackScholes_DR,BlackScholes,MHP_SYCL_GPU,1,strong,0.8075765344774206,807.5765344774206,MHP,SYCL,GPU,2000000000,1,56,1.0,2476.5454599224972 +22,BlackScholes_DR,BlackScholes,MHP_SYCL_GPU,2,strong,1.552858789999036,1552.8587899990362,MHP,SYCL,GPU,2000000000,2,112,2.0,1287.9471159133802 +147,BlackScholes_DR,BlackScholes,MHP_SYCL_GPU,3,strong,2.397058117688871,2397.058117688871,MHP,SYCL,GPU,2000000000,3,168,3.0,834.3560739062532 +4,BlackScholes_DR,BlackScholes,MHP_SYCL_GPU,4,strong,2.99751445502825,2997.51445502825,MHP,SYCL,GPU,2000000000,4,224,4.0,667.219467997912 +122,BlackScholes_Reference,BlackScholes,Reference_GPU,1,strong,0.7634275550013694,763.4275550013693,SHP,SYCL,GPU,2000000000,1,56,1.0,2619.7639669901782 +15,BlackScholes_DR,BlackScholes,SHP_SYCL_GPU,1,strong,0.8162227667290685,816.2227667290684,SHP,SYCL,GPU,2000000000,1,56,1.0,2450.3114609444197 +113,BlackScholes_DR,BlackScholes,SHP_SYCL_GPU,2,strong,1.5169338723301389,1516.933872330139,SHP,SYCL,GPU,2000000000,2,112,2.0,1318.4490349126627 +133,BlackScholes_DR,BlackScholes,SHP_SYCL_GPU,3,strong,2.3715481110592043,2371.548111059204,SHP,SYCL,GPU,2000000000,3,168,3.0,843.3309831132797 +58,BlackScholes_DR,BlackScholes,SHP_SYCL_GPU,4,strong,3.256041258302026,3256.0412583020266,SHP,SYCL,GPU,2000000000,4,224,4.0,614.2428308918198 diff --git a/bench/devcloud/dr-bench-BlackScholes-GPU.png b/bench/devcloud/dr-bench-BlackScholes-GPU.png new file mode 100644 index 0000000000..cfd7b973a2 Binary files /dev/null and b/bench/devcloud/dr-bench-BlackScholes-GPU.png differ diff --git a/bench/devcloud/dr-bench-DotProduct-CPU.csv b/bench/devcloud/dr-bench-DotProduct-CPU.csv new file mode 100644 index 0000000000..4214be11a8 --- /dev/null +++ b/bench/devcloud/dr-bench-DotProduct-CPU.csv @@ -0,0 +1,8 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +68,DotProduct_DR,DotProduct,MHP_DIRECT_CPU,56,strong,0.20347932354927906,203.47932354927906,MHP,DIRECT,CPU,2000000000,56,56,1.0,7863.206797090165 +88,DotProduct_DR,DotProduct,MHP_DIRECT_CPU,112,strong,0.3145914293880514,314.5914293880514,MHP,DIRECT,CPU,2000000000,112,112,2.0,5085.96182391983 +29,DotProduct_DR,DotProduct,MHP_SYCL_CPU,1,strong,0.21645868946359753,216.45868946359752,MHP,SYCL,CPU,2000000000,1,56,1.0,7391.710649107836 +60,DotProduct_DR,DotProduct,MHP_SYCL_CPU,2,strong,0.33470211226801505,334.70211226801507,MHP,SYCL,CPU,2000000000,2,112,2.0,4780.370189952039 +140,DotProduct_Reference,DotProduct,Reference_CPU,1,strong,0.2166090407508057,216.6090407508057,SHP,SYCL,CPU,2000000000,1,56,1.0,7386.579962009497 +78,DotProduct_DR,DotProduct,SHP_SYCL_CPU,1,strong,0.21649385071282554,216.49385071282552,SHP,SYCL,CPU,2000000000,1,56,1.0,7390.510144892594 +47,DotProduct_DR,DotProduct,SHP_SYCL_CPU,2,strong,0.3161904058228699,316.1904058228699,SHP,SYCL,CPU,2000000000,2,112,2.0,5060.242090002949 diff --git a/bench/devcloud/dr-bench-DotProduct-CPU.png b/bench/devcloud/dr-bench-DotProduct-CPU.png new file mode 100644 index 0000000000..2e1ead45f5 Binary files /dev/null and b/bench/devcloud/dr-bench-DotProduct-CPU.png differ diff --git a/bench/devcloud/dr-bench-DotProduct-GPU.csv b/bench/devcloud/dr-bench-DotProduct-GPU.csv new file mode 100644 index 0000000000..83f81ec1af --- /dev/null +++ b/bench/devcloud/dr-bench-DotProduct-GPU.csv @@ -0,0 +1,11 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +42,DotProduct_DR,DotProduct,MHP_SYCL_GPU,1,strong,0.6918931814618411,691.8931814618411,MHP,SYCL,GPU,2000000000,1,56,1.0,2312.4956898975342 +115,DotProduct_DR,DotProduct,MHP_SYCL_GPU,1,weak,0.694245224973135,694.245224973135,MHP,SYCL,GPU,2000000000,1,56,1.0,2304.6611520618158 +37,DotProduct_DR,DotProduct,MHP_SYCL_GPU,2,weak,1.3586457430666643,1358.6457430666644,MHP,SYCL,GPU,4000000000,2,112,2.0,2355.28651698207 +100,DotProduct_DR,DotProduct,MHP_SYCL_GPU,2,strong,1.3625164578560522,1362.5164578560523,MHP,SYCL,GPU,2000000000,2,112,2.0,1174.2977420747145 +24,DotProduct_DR,DotProduct,MHP_SYCL_GPU,3,weak,2.033145845496301,2033.145845496301,MHP,SYCL,GPU,6000000000,3,168,3.0,2360.873427074926 +124,DotProduct_DR,DotProduct,MHP_SYCL_GPU,3,strong,2.043166638086142,2043.1666380861418,MHP,SYCL,GPU,2000000000,3,168,3.0,783.0981429389132 +105,DotProduct_DR,DotProduct,MHP_SYCL_GPU,4,strong,2.6976926676833615,2697.6926676833614,MHP,SYCL,GPU,2000000000,4,224,4.0,593.0994361095985 +135,DotProduct_DR,DotProduct,MHP_SYCL_GPU,4,weak,2.706850641449739,2706.8506414497388,MHP,SYCL,GPU,8000000000,4,224,4.0,2364.371311071777 +120,DotProduct_Reference,DotProduct,Reference_GPU,1,strong,0.6937717788106549,693.771778810655,SHP,SYCL,GPU,2000000000,1,56,1.0,2306.2339069814975 +7,DotProduct_DR,DotProduct,SHP_SYCL_GPU,1,strong,0.6943473283595865,694.3473283595864,SHP,SYCL,GPU,2000000000,1,56,1.0,2304.322252927856 diff --git a/bench/devcloud/dr-bench-DotProduct-GPU.png b/bench/devcloud/dr-bench-DotProduct-GPU.png new file mode 100644 index 0000000000..784a2472c1 Binary files /dev/null and b/bench/devcloud/dr-bench-DotProduct-GPU.png differ diff --git a/bench/devcloud/dr-bench-Gemm-GPU.csv b/bench/devcloud/dr-bench-Gemm-GPU.csv new file mode 100644 index 0000000000..665b88adcb --- /dev/null +++ b/bench/devcloud/dr-bench-Gemm-GPU.csv @@ -0,0 +1,3 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +16,Gemm_Reference,Gemm,Reference_GPU,1,strong,0.008138684238372119,8.138684238372118,SHP,SYCL,GPU,2000000000,1,56,1.0,377.4565900365308 +5,Gemm_DR,Gemm,SHP_SYCL_GPU,1,strong,0.007988543681173039,7.988543681173039,SHP,SYCL,GPU,2000000000,1,56,1.0,384.55069191646544 diff --git a/bench/devcloud/dr-bench-Gemm-GPU.png b/bench/devcloud/dr-bench-Gemm-GPU.png new file mode 100644 index 0000000000..035ac9f5f4 Binary files /dev/null and b/bench/devcloud/dr-bench-Gemm-GPU.png differ diff --git a/bench/devcloud/dr-bench-Inclusive_Scan-CPU.csv b/bench/devcloud/dr-bench-Inclusive_Scan-CPU.csv new file mode 100644 index 0000000000..b283668662 --- /dev/null +++ b/bench/devcloud/dr-bench-Inclusive_Scan-CPU.csv @@ -0,0 +1,8 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +69,Inclusive_Scan_DR,Inclusive_Scan,MHP_DIRECT_CPU,56,strong,0.05818059783225716,58.180597832257156,MHP,DIRECT,CPU,2000000000,56,56,1.0,13750.28840897291 +89,Inclusive_Scan_DR,Inclusive_Scan,MHP_DIRECT_CPU,112,strong,0.08911746410425118,89.11746410425118,MHP,DIRECT,CPU,2000000000,112,112,2.0,8976.916118979168 +30,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_CPU,1,strong,0.06267067555967894,62.670675559678934,MHP,SYCL,CPU,2000000000,1,56,1.0,12765.140839086536 +61,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_CPU,2,strong,0.08086283985697457,80.86283985697456,MHP,SYCL,CPU,2000000000,2,112,2.0,9893.295875027305 +141,Inclusive_Scan_Reference,Inclusive_Scan,Reference_CPU,1,strong,0.06877827332531787,68.77827332531787,SHP,SYCL,CPU,2000000000,1,56,1.0,11631.580167999262 +79,Inclusive_Scan_DR,Inclusive_Scan,SHP_SYCL_CPU,1,strong,0.0625427277506161,62.5427277506161,SHP,SYCL,CPU,2000000000,1,56,1.0,12791.255334911728 +48,Inclusive_Scan_DR,Inclusive_Scan,SHP_SYCL_CPU,2,strong,0.0762994656760575,76.2994656760575,SHP,SYCL,CPU,2000000000,2,112,2.0,10485.001341903724 diff --git a/bench/devcloud/dr-bench-Inclusive_Scan-CPU.png b/bench/devcloud/dr-bench-Inclusive_Scan-CPU.png new file mode 100644 index 0000000000..ea7ad8460f Binary files /dev/null and b/bench/devcloud/dr-bench-Inclusive_Scan-CPU.png differ diff --git a/bench/devcloud/dr-bench-Inclusive_Scan-GPU.csv b/bench/devcloud/dr-bench-Inclusive_Scan-GPU.csv new file mode 100644 index 0000000000..211630ca7a --- /dev/null +++ b/bench/devcloud/dr-bench-Inclusive_Scan-GPU.csv @@ -0,0 +1,11 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +43,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,1,strong,0.1922460022707325,192.24600227073248,MHP,SYCL,GPU,2000000000,1,56,1.0,4161.334907101951 +116,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,1,weak,0.19252775861530444,192.52775861530444,MHP,SYCL,GPU,2000000000,1,56,1.0,4155.244967030984 +38,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,2,weak,0.3105489567652584,310.5489567652584,MHP,SYCL,GPU,4000000000,2,112,2.0,5152.166720075083 +101,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,2,strong,0.31033256920851066,310.3325692085107,MHP,SYCL,GPU,2000000000,2,112,2.0,2577.8796020036316 +25,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,3,weak,0.46631081928095,466.31081928094994,MHP,SYCL,GPU,6000000000,3,168,3.0,5146.781718898982 +125,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,3,strong,0.4624187514808675,462.4187514808675,MHP,SYCL,GPU,2000000000,3,168,3.0,1730.0336490206105 +106,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,4,strong,0.6084610831912113,608.4610831912113,MHP,SYCL,GPU,2000000000,4,224,4.0,1314.792387056572 +136,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,4,weak,0.6214280764511606,621.4280764511607,MHP,SYCL,GPU,8000000000,4,224,4.0,5149.429388955996 +121,Inclusive_Scan_Reference,Inclusive_Scan,Reference_GPU,1,strong,0.19233254523207413,192.33254523207412,SHP,SYCL,GPU,2000000000,1,56,1.0,4159.4624510100275 +8,Inclusive_Scan_DR,Inclusive_Scan,SHP_SYCL_GPU,1,strong,0.1912648973745623,191.26489737456228,SHP,SYCL,GPU,2000000000,1,56,1.0,4182.6807269988785 diff --git a/bench/devcloud/dr-bench-Inclusive_Scan-GPU.png b/bench/devcloud/dr-bench-Inclusive_Scan-GPU.png new file mode 100644 index 0000000000..58c0cc2df0 Binary files /dev/null and b/bench/devcloud/dr-bench-Inclusive_Scan-GPU.png differ diff --git a/bench/devcloud/dr-bench-Reduce-CPU.csv b/bench/devcloud/dr-bench-Reduce-CPU.csv new file mode 100644 index 0000000000..c2eb4498af --- /dev/null +++ b/bench/devcloud/dr-bench-Reduce-CPU.csv @@ -0,0 +1,8 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +67,Reduce_DR,Reduce,MHP_DIRECT_CPU,56,strong,0.19485467391082523,194.85467391082523,MHP,DIRECT,CPU,2000000000,56,56,1.0,2052.811934000921 +87,Reduce_DR,Reduce,MHP_DIRECT_CPU,112,strong,0.31081941470019453,310.8194147001945,MHP,DIRECT,CPU,2000000000,112,112,2.0,1286.9208970933362 +28,Reduce_DR,Reduce,MHP_SYCL_CPU,1,strong,0.21465724602838435,214.65724602838435,MHP,SYCL,CPU,2000000000,1,56,1.0,1863.4358140750003 +59,Reduce_DR,Reduce,MHP_SYCL_CPU,2,strong,0.3283334833848912,328.3334833848912,MHP,SYCL,CPU,2000000000,2,112,2.0,1218.2735549121476 +139,Reduce_Reference,Reduce,Reference_CPU,1,strong,0.21531538679112688,215.31538679112688,SHP,SYCL,CPU,2000000000,1,56,1.0,1857.739969080946 +77,Reduce_DR,Reduce,SHP_SYCL_CPU,1,strong,0.2145132561067587,214.5132561067587,SHP,SYCL,CPU,2000000000,1,56,1.0,1864.6866271095548 +46,Reduce_DR,Reduce,SHP_SYCL_CPU,2,strong,0.26581389070400896,265.81389070400894,SHP,SYCL,CPU,2000000000,2,112,2.0,1504.8122539442868 diff --git a/bench/devcloud/dr-bench-Reduce-CPU.png b/bench/devcloud/dr-bench-Reduce-CPU.png new file mode 100644 index 0000000000..253186ee70 Binary files /dev/null and b/bench/devcloud/dr-bench-Reduce-CPU.png differ diff --git a/bench/devcloud/dr-bench-Reduce-GPU.csv b/bench/devcloud/dr-bench-Reduce-GPU.csv new file mode 100644 index 0000000000..9bed35ebf1 --- /dev/null +++ b/bench/devcloud/dr-bench-Reduce-GPU.csv @@ -0,0 +1,11 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +41,Reduce_DR,Reduce,MHP_SYCL_GPU,1,strong,0.7205108884649971,720.510888464997,MHP,SYCL,GPU,2000000000,1,56,1.0,555.1616310090396 +114,Reduce_DR,Reduce,MHP_SYCL_GPU,1,weak,0.7224917888136029,722.4917888136029,MHP,SYCL,GPU,2000000000,1,56,1.0,553.6395100861095 +36,Reduce_DR,Reduce,MHP_SYCL_GPU,2,weak,1.4271992451952922,1427.1992451952922,MHP,SYCL,GPU,4000000000,2,112,2.0,560.5384130444459 +99,Reduce_DR,Reduce,MHP_SYCL_GPU,2,strong,1.4368887518570235,1436.8887518570234,MHP,SYCL,GPU,2000000000,2,112,2.0,278.37924090020414 +23,Reduce_DR,Reduce,MHP_SYCL_GPU,3,weak,2.136540845137384,2136.540845137384,MHP,SYCL,GPU,6000000000,3,168,3.0,561.6555390135018 +123,Reduce_DR,Reduce,MHP_SYCL_GPU,3,strong,2.141444200110351,2141.444200110351,MHP,SYCL,GPU,2000000000,3,168,3.0,186.78983089047455 +104,Reduce_DR,Reduce,MHP_SYCL_GPU,4,strong,2.8393780664517374,2839.378066451737,MHP,SYCL,GPU,2000000000,4,224,4.0,140.87592093710325 +134,Reduce_DR,Reduce,MHP_SYCL_GPU,4,weak,2.8482162015778263,2848.2162015778263,MHP,SYCL,GPU,8000000000,4,224,4.0,561.755108026437 +119,Reduce_Reference,Reduce,Reference_GPU,1,strong,0.7214776627023984,721.4776627023984,SHP,SYCL,GPU,2000000000,1,56,1.0,554.4177189100247 +6,Reduce_DR,Reduce,SHP_SYCL_GPU,1,strong,0.721602498208321,721.6024982083211,SHP,SYCL,GPU,2000000000,1,56,1.0,554.3218059709698 diff --git a/bench/devcloud/dr-bench-Reduce-GPU.png b/bench/devcloud/dr-bench-Reduce-GPU.png new file mode 100644 index 0000000000..9d1bdc2937 Binary files /dev/null and b/bench/devcloud/dr-bench-Reduce-GPU.png differ diff --git a/bench/devcloud/dr-bench-Sort-GPU.csv b/bench/devcloud/dr-bench-Sort-GPU.csv new file mode 100644 index 0000000000..9b94170e89 --- /dev/null +++ b/bench/devcloud/dr-bench-Sort-GPU.csv @@ -0,0 +1,3 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +17,Sort_Reference,Sort,Reference_GPU,1,strong,0.010491885685658432,10.491885685658431,SHP,SYCL,GPU,2000000000,1,56,1.0,762.4940110561213 +9,Sort_DR,Sort,SHP_SYCL_GPU,1,strong,0.012196333330975877,12.196333330975877,SHP,SYCL,GPU,2000000000,1,56,1.0,655.9348439323024 diff --git a/bench/devcloud/dr-bench-Sort-GPU.png b/bench/devcloud/dr-bench-Sort-GPU.png new file mode 100644 index 0000000000..989aec74e0 Binary files /dev/null and b/bench/devcloud/dr-bench-Sort-GPU.png differ diff --git a/bench/devcloud/dr-bench-Stencil2D-CPU.csv b/bench/devcloud/dr-bench-Stencil2D-CPU.csv new file mode 100644 index 0000000000..e3910455cb --- /dev/null +++ b/bench/devcloud/dr-bench-Stencil2D-CPU.csv @@ -0,0 +1,6 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +75,Stencil2D_DR,Stencil2D,MHP_DIRECT_CPU,56,strong,0.14109269357127238,141.09269357127238,MHP,DIRECT,CPU,2000000000,56,56,1.0,2268.37543390103 +95,Stencil2D_DR,Stencil2D,MHP_DIRECT_CPU,112,strong,0.22374492609400282,223.7449260940028,MHP,DIRECT,CPU,2000000000,112,112,2.0,1430.4288619512008 +86,Stencil2D_DR,Stencil2D,MHP_SYCL_CPU,1,strong,0.0992729177076403,99.27291770764029,MHP,SYCL,CPU,2000000000,1,56,1.0,3223.437039922642 +98,Stencil2D_DR,Stencil2D,MHP_SYCL_CPU,2,strong,0.15525703301915972,155.25703301915973,MHP,SYCL,CPU,2000000000,2,112,2.0,2061.0982560803536 +10,Stencil2D_Reference,Stencil2D,Reference_CPU,1,strong,0.10045266671411847,100.45266671411846,MHP,SYCL,CPU,2000000000,1,56,1.0,3185.5799399601656 diff --git a/bench/devcloud/dr-bench-Stencil2D-CPU.png b/bench/devcloud/dr-bench-Stencil2D-CPU.png new file mode 100644 index 0000000000..d545a9fe4e Binary files /dev/null and b/bench/devcloud/dr-bench-Stencil2D-CPU.png differ diff --git a/bench/devcloud/dr-bench-Stencil2D-GPU.csv b/bench/devcloud/dr-bench-Stencil2D-GPU.csv new file mode 100644 index 0000000000..03d004ec0c --- /dev/null +++ b/bench/devcloud/dr-bench-Stencil2D-GPU.csv @@ -0,0 +1,10 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +45,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,1,strong,0.6310519209104262,631.0519209104261,MHP,SYCL,GPU,2000000000,1,56,1.0,507.0898121002978 +118,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,1,weak,0.6312547194714194,631.2547194714194,MHP,SYCL,GPU,2000000000,1,56,1.0,506.9269030858917 +40,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,2,weak,1.2458396210001859,1245.8396210001858,MHP,SYCL,GPU,4000000000,2,112,2.0,513.7097819109291 +103,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,2,strong,1.2312135761101592,1231.2135761101592,MHP,SYCL,GPU,2000000000,2,112,2.0,259.90616592370077 +27,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,3,weak,1.8682491693881131,1868.249169388113,MHP,SYCL,GPU,6000000000,3,168,3.0,513.8500879486103 +127,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,3,strong,1.8119244307998705,1811.9244307998706,MHP,SYCL,GPU,2000000000,3,168,3.0,176.60868994339677 +108,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,4,strong,2.3650104146296576,2365.0104146296576,MHP,SYCL,GPU,2000000000,4,224,4.0,135.30595807127114 +138,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,4,weak,2.4896375986245305,2489.6375986245303,MHP,SYCL,GPU,8000000000,4,224,4.0,514.1310529320299 +128,Stencil2D_Reference,Stencil2D,Reference_GPU,1,strong,0.6259902726287199,625.9902726287198,MHP,SYCL,GPU,2000000000,1,56,1.0,511.19005197353073 diff --git a/bench/devcloud/dr-bench-Stencil2D-GPU.png b/bench/devcloud/dr-bench-Stencil2D-GPU.png new file mode 100644 index 0000000000..c36ab9426e Binary files /dev/null and b/bench/devcloud/dr-bench-Stencil2D-GPU.png differ diff --git a/bench/devcloud/dr-bench-Stream_Add-CPU.csv b/bench/devcloud/dr-bench-Stream_Add-CPU.csv new file mode 100644 index 0000000000..222b604c05 --- /dev/null +++ b/bench/devcloud/dr-bench-Stream_Add-CPU.csv @@ -0,0 +1,7 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +72,Stream_Add,Stream_Add,MHP_DIRECT_CPU,56,strong,0.18563602878273983,185.63602878273983,MHP,DIRECT,CPU,2000000000,56,56,1.0,6464.262394906254 +92,Stream_Add,Stream_Add,MHP_DIRECT_CPU,112,strong,0.2842423906434117,284.24239064341174,MHP,DIRECT,CPU,2000000000,112,112,2.0,4221.748899886738 +33,Stream_Add,Stream_Add,MHP_SYCL_CPU,1,strong,0.19229622411853517,192.29622411853515,MHP,SYCL,CPU,2000000000,1,56,1.0,6240.372141994304 +64,Stream_Add,Stream_Add,MHP_SYCL_CPU,2,strong,0.29322029965250074,293.2202996525007,MHP,SYCL,CPU,2000000000,2,112,2.0,4092.4860980707545 +82,Stream_Add,Stream_Add,SHP_SYCL_CPU,1,strong,0.19222142127031222,192.22142127031222,SHP,SYCL,CPU,2000000000,1,56,1.0,6242.800578986952 +51,Stream_Add,Stream_Add,SHP_SYCL_CPU,2,strong,0.2758362375730613,275.8362375730613,SHP,SYCL,CPU,2000000000,2,112,2.0,4350.407366915138 diff --git a/bench/devcloud/dr-bench-Stream_Add-CPU.png b/bench/devcloud/dr-bench-Stream_Add-CPU.png new file mode 100644 index 0000000000..3473fe10b4 Binary files /dev/null and b/bench/devcloud/dr-bench-Stream_Add-CPU.png differ diff --git a/bench/devcloud/dr-bench-Stream_Add-GPU.csv b/bench/devcloud/dr-bench-Stream_Add-GPU.csv new file mode 100644 index 0000000000..bd1c5d1399 --- /dev/null +++ b/bench/devcloud/dr-bench-Stream_Add-GPU.csv @@ -0,0 +1,9 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +150,Stream_Add,Stream_Add,MHP_SYCL_GPU,1,strong,0.8114514040380982,811.4514040380983,MHP,SYCL,GPU,2000000000,1,56,1.0,1478.8316269197792 +20,Stream_Add,Stream_Add,MHP_SYCL_GPU,2,strong,1.6278290285127854,1627.8290285127855,MHP,SYCL,GPU,2000000000,2,112,2.0,737.1781550648118 +145,Stream_Add,Stream_Add,MHP_SYCL_GPU,3,strong,2.3760460629098152,2376.0460629098156,MHP,SYCL,GPU,2000000000,3,168,3.0,505.0407139541835 +2,Stream_Add,Stream_Add,MHP_SYCL_GPU,4,strong,3.2118770159780548,3211.8770159780547,MHP,SYCL,GPU,2000000000,4,224,4.0,373.6133089873573 +13,Stream_Add,Stream_Add,SHP_SYCL_GPU,1,strong,0.8251717651377696,825.1717651377695,SHP,SYCL,GPU,2000000000,1,56,1.0,1454.2426809764263 +111,Stream_Add,Stream_Add,SHP_SYCL_GPU,2,strong,1.6504876900929422,1650.487690092942,SHP,SYCL,GPU,2000000000,2,112,2.0,727.0578309689943 +131,Stream_Add,Stream_Add,SHP_SYCL_GPU,3,strong,2.4574883498646587,2457.4883498646586,SHP,SYCL,GPU,2000000000,3,168,3.0,488.3034338966806 +56,Stream_Add,Stream_Add,SHP_SYCL_GPU,4,strong,3.3048900533942067,3304.8900533942065,SHP,SYCL,GPU,2000000000,4,224,4.0,363.0983120807814 diff --git a/bench/devcloud/dr-bench-Stream_Add-GPU.png b/bench/devcloud/dr-bench-Stream_Add-GPU.png new file mode 100644 index 0000000000..c1ae6736b4 Binary files /dev/null and b/bench/devcloud/dr-bench-Stream_Add-GPU.png differ diff --git a/bench/devcloud/dr-bench-Stream_Copy-CPU.csv b/bench/devcloud/dr-bench-Stream_Copy-CPU.csv new file mode 100644 index 0000000000..b36c199892 --- /dev/null +++ b/bench/devcloud/dr-bench-Stream_Copy-CPU.csv @@ -0,0 +1,7 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +70,Stream_Copy,Stream_Copy,MHP_DIRECT_CPU,56,strong,0.18163018767680822,181.63018767680822,MHP,DIRECT,CPU,2000000000,56,56,1.0,4404.554167083258 +90,Stream_Copy,Stream_Copy,MHP_DIRECT_CPU,112,strong,0.27622993638317983,276.2299363831798,MHP,DIRECT,CPU,2000000000,112,112,2.0,2896.1379438985155 +31,Stream_Copy,Stream_Copy,MHP_SYCL_CPU,1,strong,0.1854902896149902,185.49028961499022,MHP,SYCL,CPU,2000000000,1,56,1.0,4312.894231070028 +62,Stream_Copy,Stream_Copy,MHP_SYCL_CPU,2,strong,0.2821687722971565,282.1687722971565,MHP,SYCL,CPU,2000000000,2,112,2.0,2835.182623105816 +80,Stream_Copy,Stream_Copy,SHP_SYCL_CPU,1,strong,0.1854925506369395,185.4925506369395,SHP,SYCL,CPU,2000000000,1,56,1.0,4312.841659964137 +49,Stream_Copy,Stream_Copy,SHP_SYCL_CPU,2,strong,0.25744022831116087,257.44022831116087,SHP,SYCL,CPU,2000000000,2,112,2.0,3107.5174429734507 diff --git a/bench/devcloud/dr-bench-Stream_Copy-CPU.png b/bench/devcloud/dr-bench-Stream_Copy-CPU.png new file mode 100644 index 0000000000..f906af17e2 Binary files /dev/null and b/bench/devcloud/dr-bench-Stream_Copy-CPU.png differ diff --git a/bench/devcloud/dr-bench-Stream_Copy-GPU.csv b/bench/devcloud/dr-bench-Stream_Copy-GPU.csv new file mode 100644 index 0000000000..1b44536d67 --- /dev/null +++ b/bench/devcloud/dr-bench-Stream_Copy-GPU.csv @@ -0,0 +1,9 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +148,Stream_Copy,Stream_Copy,MHP_SYCL_GPU,1,strong,0.8601007528340806,860.1007528340806,MHP,SYCL,GPU,2000000000,1,56,1.0,930.1235900142568 +18,Stream_Copy,Stream_Copy,MHP_SYCL_GPU,2,strong,1.6828608437014954,1682.8608437014955,MHP,SYCL,GPU,2000000000,2,112,2.0,475.38095796464046 +143,Stream_Copy,Stream_Copy,MHP_SYCL_GPU,3,strong,2.558839252763398,2558.839252763398,MHP,SYCL,GPU,2000000000,3,168,3.0,312.6417570529475 +0,Stream_Copy,Stream_Copy,MHP_SYCL_GPU,4,strong,3.424161617734663,3424.161617734663,MHP,SYCL,GPU,2000000000,4,224,4.0,233.63383195950294 +11,Stream_Copy,Stream_Copy,SHP_SYCL_GPU,1,strong,0.8623715974999698,862.3715974999699,SHP,SYCL,GPU,2000000000,1,56,1.0,927.6743370482212 +109,Stream_Copy,Stream_Copy,SHP_SYCL_GPU,2,strong,1.697588362483758,1697.5883624837581,SHP,SYCL,GPU,2000000000,2,112,2.0,471.2567649966168 +129,Stream_Copy,Stream_Copy,SHP_SYCL_GPU,3,strong,2.5670992494265388,2567.099249426539,SHP,SYCL,GPU,2000000000,3,168,3.0,311.63578898584115 +54,Stream_Copy,Stream_Copy,SHP_SYCL_GPU,4,strong,3.429747935208815,3429.747935208815,SHP,SYCL,GPU,2000000000,4,224,4.0,233.25329298617777 diff --git a/bench/devcloud/dr-bench-Stream_Copy-GPU.png b/bench/devcloud/dr-bench-Stream_Copy-GPU.png new file mode 100644 index 0000000000..f12ddefdc9 Binary files /dev/null and b/bench/devcloud/dr-bench-Stream_Copy-GPU.png differ diff --git a/bench/devcloud/dr-bench-Stream_Scale-CPU.csv b/bench/devcloud/dr-bench-Stream_Scale-CPU.csv new file mode 100644 index 0000000000..b4dfe29e6b --- /dev/null +++ b/bench/devcloud/dr-bench-Stream_Scale-CPU.csv @@ -0,0 +1,7 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +71,Stream_Scale,Stream_Scale,MHP_DIRECT_CPU,56,strong,0.17940573511552335,179.40573511552336,MHP,DIRECT,CPU,2000000000,56,56,1.0,4459.166255108077 +91,Stream_Scale,Stream_Scale,MHP_DIRECT_CPU,112,strong,0.2547190017554135,254.71900175541347,MHP,DIRECT,CPU,2000000000,112,112,2.0,3140.715826015119 +32,Stream_Scale,Stream_Scale,MHP_SYCL_CPU,1,strong,0.18490877157134647,184.90877157134648,MHP,SYCL,CPU,2000000000,1,56,1.0,4326.457815936128 +63,Stream_Scale,Stream_Scale,MHP_SYCL_CPU,2,strong,0.28015850121010816,280.15850121010817,MHP,SYCL,CPU,2000000000,2,112,2.0,2855.526412885935 +81,Stream_Scale,Stream_Scale,SHP_SYCL_CPU,1,strong,0.185000970378533,185.000970378533,SHP,SYCL,CPU,2000000000,1,56,1.0,4324.301642110899 +50,Stream_Scale,Stream_Scale,SHP_SYCL_CPU,2,strong,0.25051582069518136,250.51582069518133,SHP,SYCL,CPU,2000000000,2,112,2.0,3193.4110898864596 diff --git a/bench/devcloud/dr-bench-Stream_Scale-CPU.png b/bench/devcloud/dr-bench-Stream_Scale-CPU.png new file mode 100644 index 0000000000..7743c21df9 Binary files /dev/null and b/bench/devcloud/dr-bench-Stream_Scale-CPU.png differ diff --git a/bench/devcloud/dr-bench-Stream_Scale-GPU.csv b/bench/devcloud/dr-bench-Stream_Scale-GPU.csv new file mode 100644 index 0000000000..3edd62cad2 --- /dev/null +++ b/bench/devcloud/dr-bench-Stream_Scale-GPU.csv @@ -0,0 +1,9 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +149,Stream_Scale,Stream_Scale,MHP_SYCL_GPU,1,strong,0.8597988751016247,859.7988751016246,MHP,SYCL,GPU,2000000000,1,56,1.0,930.4501589461179 +19,Stream_Scale,Stream_Scale,MHP_SYCL_GPU,2,strong,1.6894241106915255,1689.4241106915256,MHP,SYCL,GPU,2000000000,2,112,2.0,473.53414393531943 +144,Stream_Scale,Stream_Scale,MHP_SYCL_GPU,3,strong,2.5582928699235805,2558.2928699235804,MHP,SYCL,GPU,2000000000,3,168,3.0,312.70852895896047 +1,Stream_Scale,Stream_Scale,MHP_SYCL_GPU,4,strong,3.4352606500240532,3435.260650024053,MHP,SYCL,GPU,2000000000,4,224,4.0,232.8789811027581 +12,Stream_Scale,Stream_Scale,SHP_SYCL_GPU,1,strong,0.8559835789465333,855.9835789465333,SHP,SYCL,GPU,2000000000,1,56,1.0,934.5973680763447 +110,Stream_Scale,Stream_Scale,SHP_SYCL_GPU,2,strong,1.70142731228805,1701.42731228805,SHP,SYCL,GPU,2000000000,2,112,2.0,470.1934629955915 +130,Stream_Scale,Stream_Scale,SHP_SYCL_GPU,3,strong,2.5695884295320246,2569.5884295320243,SHP,SYCL,GPU,2000000000,3,168,3.0,311.33390499648874 +55,Stream_Scale,Stream_Scale,SHP_SYCL_GPU,4,strong,3.4159436472686906,3415.9436472686903,SHP,SYCL,GPU,2000000000,4,224,4.0,234.19590093052662 diff --git a/bench/devcloud/dr-bench-Stream_Scale-GPU.png b/bench/devcloud/dr-bench-Stream_Scale-GPU.png new file mode 100644 index 0000000000..e18a08f06d Binary files /dev/null and b/bench/devcloud/dr-bench-Stream_Scale-GPU.png differ diff --git a/bench/devcloud/dr-bench-Stream_Triad-CPU.csv b/bench/devcloud/dr-bench-Stream_Triad-CPU.csv new file mode 100644 index 0000000000..6279e5dd41 --- /dev/null +++ b/bench/devcloud/dr-bench-Stream_Triad-CPU.csv @@ -0,0 +1,7 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +73,Stream_Triad,Stream_Triad,MHP_DIRECT_CPU,56,strong,0.1875936402389325,187.5936402389325,MHP,DIRECT,CPU,2000000000,56,56,1.0,6396.805341969991 +93,Stream_Triad,Stream_Triad,MHP_DIRECT_CPU,112,strong,0.27757003651989137,277.57003651989135,MHP,DIRECT,CPU,2000000000,112,112,2.0,4323.233210058698 +34,Stream_Triad,Stream_Triad,MHP_SYCL_CPU,1,strong,0.19230421338885123,192.30421338885122,MHP,SYCL,CPU,2000000000,1,56,1.0,6240.112886000706 +65,Stream_Triad,Stream_Triad,MHP_SYCL_CPU,2,strong,0.2924331110612302,292.43311106123025,MHP,SYCL,CPU,2000000000,2,112,2.0,4103.50249205789 +83,Stream_Triad,Stream_Triad,SHP_SYCL_CPU,1,strong,0.19225543309078358,192.25543309078358,SHP,SYCL,CPU,2000000000,1,56,1.0,6241.696168000394 +52,Stream_Triad,Stream_Triad,SHP_SYCL_CPU,2,strong,0.2800101326353254,280.0101326353254,SHP,SYCL,CPU,2000000000,2,112,2.0,4285.559199969504 diff --git a/bench/devcloud/dr-bench-Stream_Triad-CPU.png b/bench/devcloud/dr-bench-Stream_Triad-CPU.png new file mode 100644 index 0000000000..b8bef57dd2 Binary files /dev/null and b/bench/devcloud/dr-bench-Stream_Triad-CPU.png differ diff --git a/bench/devcloud/dr-bench-Stream_Triad-GPU.csv b/bench/devcloud/dr-bench-Stream_Triad-GPU.csv new file mode 100644 index 0000000000..edf79252e5 --- /dev/null +++ b/bench/devcloud/dr-bench-Stream_Triad-GPU.csv @@ -0,0 +1,9 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +151,Stream_Triad,Stream_Triad,MHP_SYCL_GPU,1,strong,0.7973808871360037,797.3808871360038,MHP,SYCL,GPU,2000000000,1,56,1.0,1504.926966973218 +21,Stream_Triad,Stream_Triad,MHP_SYCL_GPU,2,strong,1.610039357450197,1610.039357450197,MHP,SYCL,GPU,2000000000,2,112,2.0,745.3233950134162 +146,Stream_Triad,Stream_Triad,MHP_SYCL_GPU,3,strong,2.3942382892942544,2394.238289294254,MHP,SYCL,GPU,2000000000,3,168,3.0,501.203245042799 +3,Stream_Triad,Stream_Triad,MHP_SYCL_GPU,4,strong,3.212796990214771,3212.796990214771,MHP,SYCL,GPU,2000000000,4,224,4.0,373.50632600031844 +14,Stream_Triad,Stream_Triad,SHP_SYCL_GPU,1,strong,0.8161862987548119,816.1862987548119,SHP,SYCL,GPU,2000000000,1,56,1.0,1470.2525659040602 +112,Stream_Triad,Stream_Triad,SHP_SYCL_GPU,2,strong,1.6453953499318714,1645.3953499318714,SHP,SYCL,GPU,2000000000,2,112,2.0,729.3080049422085 +132,Stream_Triad,Stream_Triad,SHP_SYCL_GPU,3,strong,2.3650802146098613,2365.0802146098613,SHP,SYCL,GPU,2000000000,3,168,3.0,507.3823680851135 +57,Stream_Triad,Stream_Triad,SHP_SYCL_GPU,4,strong,3.310029502812501,3310.029502812501,SHP,SYCL,GPU,2000000000,4,224,4.0,362.5345329944556 diff --git a/bench/devcloud/dr-bench-Stream_Triad-GPU.png b/bench/devcloud/dr-bench-Stream_Triad-GPU.png new file mode 100644 index 0000000000..60dbf0518c Binary files /dev/null and b/bench/devcloud/dr-bench-Stream_Triad-GPU.png differ diff --git a/bench/devcloud/dr-bench-WaveEquation-CPU.csv b/bench/devcloud/dr-bench-WaveEquation-CPU.csv new file mode 100644 index 0000000000..72747489a3 --- /dev/null +++ b/bench/devcloud/dr-bench-WaveEquation-CPU.csv @@ -0,0 +1,5 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +74,WaveEquation_DR,WaveEquation,MHP_DIRECT_CPU,56,strong,0.1844434591303605,184.4434591303605,MHP,DIRECT,CPU,2000000000,56,56,1.0,19712.159749890143 +94,WaveEquation_DR,WaveEquation,MHP_DIRECT_CPU,112,strong,0.27535465652306274,275.3546565230628,MHP,DIRECT,CPU,2000000000,112,112,2.0,13203.985642042264 +85,WaveEquation_DR,WaveEquation,MHP_SYCL_CPU,1,strong,0.1283668232415776,128.3668232415776,MHP,SYCL,CPU,2000000000,1,56,1.0,28323.353646897627 +97,WaveEquation_DR,WaveEquation,MHP_SYCL_CPU,2,strong,0.20066893566766425,200.66893566766424,MHP,SYCL,CPU,2000000000,2,112,2.0,18118.294787895607 diff --git a/bench/devcloud/dr-bench-WaveEquation-CPU.png b/bench/devcloud/dr-bench-WaveEquation-CPU.png new file mode 100644 index 0000000000..62174387fb Binary files /dev/null and b/bench/devcloud/dr-bench-WaveEquation-CPU.png differ diff --git a/bench/devcloud/dr-bench-WaveEquation-GPU.csv b/bench/devcloud/dr-bench-WaveEquation-GPU.csv new file mode 100644 index 0000000000..f2a7ad870e --- /dev/null +++ b/bench/devcloud/dr-bench-WaveEquation-GPU.csv @@ -0,0 +1,9 @@ +,bench_name,Benchmark,Target,Ranks,Scaling,Bandwidth (TB/s),Bandwidth (GB/s),model,runtime,device,vsize,Number of GPU Tiles,Number of CPU Cores,Number of CPU Sockets,rtime +44,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,1,strong,0.4124941181640197,412.4941181640197,MHP,SYCL,GPU,2000000000,1,56,1.0,8814.135210903318 +117,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,1,weak,0.4133129211245116,413.3129211245116,MHP,SYCL,GPU,2000000000,1,56,1.0,8796.673767923921 +39,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,2,weak,0.7782218555805628,778.2218555805628,MHP,SYCL,GPU,4000000000,2,112,2.0,9343.920086931083 +102,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,2,strong,0.7958779822243652,795.8779822243653,MHP,SYCL,GPU,2000000000,2,112,2.0,4568.261734089587 +26,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,3,weak,1.1814815513449133,1181.4815513449134,MHP,SYCL,GPU,6000000000,3,168,3.0,9231.601836890552 +126,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,3,strong,1.1174493400730945,1117.4493400730944,MHP,SYCL,GPU,2000000000,3,168,3.0,3253.6409489151224 +107,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,4,strong,1.4286035644367434,1428.6035644367435,MHP,SYCL,GPU,2000000000,4,224,4.0,2544.9880020658366 +137,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,4,weak,1.5772728695309468,1577.2728695309468,MHP,SYCL,GPU,8000000000,4,224,4.0,9220.41835990298 diff --git a/bench/devcloud/dr-bench-WaveEquation-GPU.png b/bench/devcloud/dr-bench-WaveEquation-GPU.png new file mode 100644 index 0000000000..27e8ef6e44 Binary files /dev/null and b/bench/devcloud/dr-bench-WaveEquation-GPU.png differ diff --git a/bench/devcloud/dr-bench-a30b94d525ae4cee8aedceedddca35ce.json b/bench/devcloud/dr-bench-a30b94d525ae4cee8aedceedddca35ce.json new file mode 100644 index 0000000000..ae82d91e39 --- /dev/null +++ b/bench/devcloud/dr-bench-a30b94d525ae4cee8aedceedddca35ce.json @@ -0,0 +1,181 @@ +{ + "context": { + "date": "2023-12-01T02:54:28-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3798, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [1.45947,2.59961,17.4307], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "CPU", + "device_info": "Intel(R) Xeon(R) Platinum 8480+, max_compute_units: 112", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "MHP_SYCL_CPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.8634358140750003e+03, + "cpu_time": 1.8550503020000003e+03, + "time_unit": "ms", + "bytes_per_second": 2.1465724602838434e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 7.3917106491078357e+03, + "cpu_time": 7.3764912130000012e+03, + "time_unit": "ms", + "bytes_per_second": 2.1645868946359753e+11, + "footprint": 3.2000000000000000e+10 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.2765140839086536e+04, + "cpu_time": 1.2740335561000002e+04, + "time_unit": "ms", + "bytes_per_second": 6.2670675559678932e+10, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.3128942310700277e+03, + "cpu_time": 6.9288480000011532e+00, + "time_unit": "ms", + "bytes_per_second": 1.8549028961499020e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.3264578159361281e+03, + "cpu_time": 6.8725500000113016e+00, + "time_unit": "ms", + "bytes_per_second": 1.8490877157134647e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 6.2403721419943040e+03, + "cpu_time": 7.4926879999992479e+00, + "time_unit": "ms", + "bytes_per_second": 1.9229622411853516e+11, + "footprint": 2.4000000000000000e+10 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 6.2401128860007057e+03, + "cpu_time": 6.5171560000010231e+00, + "time_unit": "ms", + "bytes_per_second": 1.9230421338885123e+11, + "footprint": 2.4000000000000000e+10 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 7, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.0794101061918685e+04, + "cpu_time": 1.1052277999993976e+01, + "time_unit": "ms", + "bytes_per_second": 4.9026696211894249e+10, + "footprint": 4.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-a3f4821ec91c4d4c8ae2603dd15b4f11.json b/bench/devcloud/dr-bench-a3f4821ec91c4d4c8ae2603dd15b4f11.json new file mode 100644 index 0000000000..99a9993d38 --- /dev/null +++ b/bench/devcloud/dr-bench-a3f4821ec91c4d4c8ae2603dd15b4f11.json @@ -0,0 +1,134 @@ +{ + "context": { + "date": "2023-12-01T02:47:00-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3745, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [1.87012,2.40039,26.4268], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "4000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "2", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "1" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.6053841304444586e+02, + "cpu_time": 5.6053320200000019e+02, + "time_unit": "ms", + "bytes_per_second": 1.4271992451952922e+12, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.3552865169820702e+03, + "cpu_time": 2.3551524550000026e+03, + "time_unit": "ms", + "bytes_per_second": 1.3586457430666643e+12, + "footprint": 3.2000000000000000e+10 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.1521667200750826e+03, + "cpu_time": 5.1448086500000018e+03, + "time_unit": "ms", + "bytes_per_second": 3.1054895676525842e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 9.3439200869310826e+03, + "cpu_time": 9.2250372820000030e+03, + "time_unit": "ms", + "bytes_per_second": 7.7822185558056274e+11, + "flops": 1.4447187913005497e+09, + "footprint": 3.5998231824000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.1370978191092911e+02, + "cpu_time": 5.1277019999999141e+02, + "time_unit": "ms", + "bytes_per_second": 1.2458396210001858e+12, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-cfc91caadee849f29be3cb9102189519.json b/bench/devcloud/dr-bench-cfc91caadee849f29be3cb9102189519.json new file mode 100644 index 0000000000..68923aa04c --- /dev/null +++ b/bench/devcloud/dr-bench-cfc91caadee849f29be3cb9102189519.json @@ -0,0 +1,69 @@ +{ + "context": { + "date": "2023-12-01T02:53:02-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3789, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [2.9502,3.13232,19.0088], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Stencil2D_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Stencil2D_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.1119005197353073e+02, + "cpu_time": 5.1118343600000003e+02, + "time_unit": "ms", + "bytes_per_second": 6.2599027262871985e+11, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-d0c2ccea5b0c459ebde79e341a1d68d8.json b/bench/devcloud/dr-bench-d0c2ccea5b0c459ebde79e341a1d68d8.json new file mode 100644 index 0000000000..2e5ef863f1 --- /dev/null +++ b/bench/devcloud/dr-bench-d0c2ccea5b0c459ebde79e341a1d68d8.json @@ -0,0 +1,213 @@ +{ + "context": { + "date": "2023-12-01T03:14:46-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3000, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [66.4565,83.0801,76.3306], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "CPU", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "112", + "runtime": "DIRECT", + "target": "MHP_DIRECT_CPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.2869208970933362e+03, + "cpu_time": 1.2868947490000000e+03, + "time_unit": "ms", + "bytes_per_second": 3.1081941470019452e+11, + "footprint": 7.1428571000000000e+07 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.0859618239198298e+03, + "cpu_time": 5.0858296690000025e+03, + "time_unit": "ms", + "bytes_per_second": 3.1459142938805139e+11, + "footprint": 2.8571428500000000e+08 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 8.9769161189791685e+03, + "cpu_time": 8.9727574059999988e+03, + "time_unit": "ms", + "bytes_per_second": 8.9117464104251190e+10, + "footprint": 1.4285714200000000e+08 + }, + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.8961379438985155e+03, + "cpu_time": 2.8959479829999991e+03, + "time_unit": "ms", + "bytes_per_second": 2.7622993638317981e+11, + "footprint": 1.4285714200000000e+08 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.1407158260151191e+03, + "cpu_time": 3.1388039919999997e+03, + "time_unit": "ms", + "bytes_per_second": 2.5471900175541348e+11, + "footprint": 1.4285714200000000e+08 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.2217488998867384e+03, + "cpu_time": 4.2216444820000024e+03, + "time_unit": "ms", + "bytes_per_second": 2.8424239064341174e+11, + "footprint": 2.1428571400000000e+08 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.3232332100586982e+03, + "cpu_time": 4.3231834630000067e+03, + "time_unit": "ms", + "bytes_per_second": 2.7757003651989136e+11, + "footprint": 2.1428571400000000e+08 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 7, + "per_family_instance_index": 0, + "run_name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.3203985642042264e+04, + "cpu_time": 1.3203679198999993e+04, + "time_unit": "ms", + "bytes_per_second": 2.7535465652306274e+11, + "flops": 5.1117819899083436e+08, + "footprint": 3.2140902800000000e+08 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 8, + "per_family_instance_index": 0, + "run_name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.4304288619512008e+03, + "cpu_time": 1.4279558479999964e+03, + "time_unit": "ms", + "bytes_per_second": 2.2374492609400281e+11, + "footprint": 2.8576000000000000e+08 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 9, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 8.3332474020008540e+03, + "cpu_time": 8.3297003160000004e+03, + "time_unit": "ms", + "bytes_per_second": 2.4000247484789545e+11, + "footprint": 3.5714285700000000e+08 + } + ] +} diff --git a/bench/devcloud/dr-bench-dc6b76bd54834580a8fccdc353f49de1.json b/bench/devcloud/dr-bench-dc6b76bd54834580a8fccdc353f49de1.json new file mode 100644 index 0000000000..57da20cf8b --- /dev/null +++ b/bench/devcloud/dr-bench-dc6b76bd54834580a8fccdc353f49de1.json @@ -0,0 +1,134 @@ +{ + "context": { + "date": "2023-12-01T02:53:39-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3798, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [2.08643,2.89502,18.3413], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info0": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "SHP", + "numactl": "", + "rank": "0", + "ranks": "1", + "runtime": "SYCL", + "target": "SHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Gemm_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Gemm_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.8455069191646544e+02, + "cpu_time": 6.0797000000001322e-02, + "time_unit": "ms", + "bytes_per_second": 7.9885436811730385e+09, + "flops": 1.0651391574897385e+13, + "footprint": 3.0720000000000000e+09 + }, + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.5432180597096976e+02, + "cpu_time": 5.5375251300000002e+02, + "time_unit": "ms", + "bytes_per_second": 7.2160249820832104e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.3043222529278560e+03, + "cpu_time": 2.3034746080000000e+03, + "time_unit": "ms", + "bytes_per_second": 6.9434732835958643e+11, + "footprint": 3.2000000000000000e+10 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.1826807269988785e+03, + "cpu_time": 4.1751754369999999e+03, + "time_unit": "ms", + "bytes_per_second": 1.9126489737456229e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "DRSortFixture/Sort_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "DRSortFixture/Sort_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 6.5593484393230244e+02, + "cpu_time": 6.5548174799999265e+02, + "time_unit": "ms", + "bytes_per_second": 1.2196333330975878e+10, + "footprint": 8.0000000000000000e+09 + } + ] +} diff --git a/bench/devcloud/dr-bench-ee56a4c8add24f4b9b6777eb1a3db39b.json b/bench/devcloud/dr-bench-ee56a4c8add24f4b9b6777eb1a3db39b.json new file mode 100644 index 0000000000..788af94380 --- /dev/null +++ b/bench/devcloud/dr-bench-ee56a4c8add24f4b9b6777eb1a3db39b.json @@ -0,0 +1,134 @@ +{ + "context": { + "date": "2023-12-01T02:43:32-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3797, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [1.56152,2.44971,32.5269], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "2", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.7837924090020414e+02, + "cpu_time": 2.7828499700000009e+02, + "time_unit": "ms", + "bytes_per_second": 1.4368887518570234e+12, + "footprint": 4.0000000000000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.1742977420747145e+03, + "cpu_time": 1.1742842789999984e+03, + "time_unit": "ms", + "bytes_per_second": 1.3625164578560522e+12, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.5778796020036316e+03, + "cpu_time": 2.5765050490000012e+03, + "time_unit": "ms", + "bytes_per_second": 3.1033256920851068e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.5682617340895868e+03, + "cpu_time": 4.5051493720000053e+03, + "time_unit": "ms", + "bytes_per_second": 7.9587798222436523e+11, + "flops": 1.4774962541293907e+09, + "footprint": 1.7998905600000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.5990616592370077e+02, + "cpu_time": 2.5885902199999578e+02, + "time_unit": "ms", + "bytes_per_second": 1.2312135761101592e+12, + "footprint": 1.6000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-f4eaa5a34ce94d35ab3bd5bdcf44ed6b.json b/bench/devcloud/dr-bench-f4eaa5a34ce94d35ab3bd5bdcf44ed6b.json new file mode 100644 index 0000000000..c20f1feabd --- /dev/null +++ b/bench/devcloud/dr-bench-f4eaa5a34ce94d35ab3bd5bdcf44ed6b.json @@ -0,0 +1,133 @@ +{ + "context": { + "date": "2023-12-01T02:41:14-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3793, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [2.07471,2.771,37.5034], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "GPU", + "device_info": "Intel(R) Data Center GPU Max 1100, max_compute_units: 448", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "3", + "runtime": "SYCL", + "target": "MHP_SYCL_GPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.1264175705294753e+02, + "cpu_time": 3.9651670000000472e+00, + "time_unit": "ms", + "bytes_per_second": 2.5588392527633979e+12, + "footprint": 5.3333333330000000e+09 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 3.1270852895896047e+02, + "cpu_time": 4.4775960000000836e+00, + "time_unit": "ms", + "bytes_per_second": 2.5582928699235806e+12, + "footprint": 5.3333333330000000e+09 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.0504071395418350e+02, + "cpu_time": 1.0612863000000416e+01, + "time_unit": "ms", + "bytes_per_second": 2.3760460629098154e+12, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 5.0120324504279898e+02, + "cpu_time": 6.1936550000005752e+00, + "time_unit": "ms", + "bytes_per_second": 2.3942382892942544e+12, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 8.3435607390625319e+02, + "cpu_time": 4.6766060000003051e+00, + "time_unit": "ms", + "bytes_per_second": 2.3970581176888711e+12, + "footprint": 1.3333333333000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-fd64e9be192a4f1687d8136fe6bc4640.json b/bench/devcloud/dr-bench-fd64e9be192a4f1687d8136fe6bc4640.json new file mode 100644 index 0000000000..f5f3ce2cb1 --- /dev/null +++ b/bench/devcloud/dr-bench-fd64e9be192a4f1687d8136fe6bc4640.json @@ -0,0 +1,181 @@ +{ + "context": { + "date": "2023-12-01T02:58:00-08:00", + "host_name": "idc-beta-batch-pvc-node-13", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3800, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 110100480, + "num_sharing": 112 + } + ], + "load_avg": [92.4893,49.0439,32.8345], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "CPU", + "device_info": "Intel(R) Xeon(R) Platinum 8480+, max_compute_units: 112", + "hostname": "idc-beta-batch-pvc-node-13\n", + "lscpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 52 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 224\nOn-line CPU(s) list: 0-223\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8480+\nCPU family: 6\nModel: 143\nThread(s) per core: 2\nCore(s) per socket: 56\nSocket(s): 2\nStepping: 8\nCPU max MHz: 3800.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4000.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 5.3 MiB (112 instances)\nL1i cache: 3.5 MiB (112 instances)\nL2 cache: 224 MiB (112 instances)\nL3 cache: 210 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-55,112-167\nNUMA node1 CPU(s): 56-111,168-223\nVulnerability Gather data sampling: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n", + "model": "MHP", + "numactl": "", + "rank": "0", + "ranks": "2", + "runtime": "SYCL", + "target": "MHP_SYCL_CPU", + "weak-scaling": "0" + }, + "benchmarks": [ + { + "name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Reduce_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 1.2182735549121476e+03, + "cpu_time": 1.2036727840000001e+03, + "time_unit": "ms", + "bytes_per_second": 3.2833348338489124e+11, + "footprint": 4.0000000000000000e+09 + }, + { + "name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "DotProduct_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.7803701899520393e+03, + "cpu_time": 4.7243844870000021e+03, + "time_unit": "ms", + "bytes_per_second": 3.3470211226801508e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "Inclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 9.8932958750273046e+03, + "cpu_time": 9.8681771910000007e+03, + "time_unit": "ms", + "bytes_per_second": 8.0862839856974564e+10, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.8351826231058162e+03, + "cpu_time": 6.6812887300000057e+02, + "time_unit": "ms", + "bytes_per_second": 2.8216877229715649e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.8555264128859349e+03, + "cpu_time": 6.7897184599999605e+02, + "time_unit": "ms", + "bytes_per_second": 2.8015850121010815e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.0924860980707545e+03, + "cpu_time": 9.6872324499999968e+02, + "time_unit": "ms", + "bytes_per_second": 2.9322029965250073e+11, + "footprint": 1.2000000000000000e+10 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 4.1035024920578899e+03, + "cpu_time": 9.4834765600000287e+02, + "time_unit": "ms", + "bytes_per_second": 2.9243311106123022e+11, + "footprint": 1.2000000000000000e+10 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 7, + "per_family_instance_index": 0, + "run_name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "run_type": "iteration", + "repetitions": 1, + "repetition_index": 0, + "threads": 1, + "iterations": 1, + "real_time": 2.0159454031905887e+04, + "cpu_time": 1.5916687900000426e+02, + "time_unit": "ms", + "bytes_per_second": 9.9209035960728287e+10, + "footprint": 2.0000000000000000e+10 + } + ] +} diff --git a/doxygen/algorithms_8hpp_source.html b/doxygen/algorithms_8hpp_source.html new file mode 100644 index 0000000000..67e23517ee --- /dev/null +++ b/doxygen/algorithms_8hpp_source.html @@ -0,0 +1,103 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/algorithms.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
algorithms.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/sp/algorithms/copy.hpp>
+
8#include <dr/sp/algorithms/equal.hpp>
+
9#include <dr/sp/algorithms/exclusive_scan.hpp>
+
10#include <dr/sp/algorithms/execution_policy.hpp>
+
11#include <dr/sp/algorithms/fill.hpp>
+
12#include <dr/sp/algorithms/for_each.hpp>
+
13#include <dr/sp/algorithms/inclusive_scan.hpp>
+
14#include <dr/sp/algorithms/iota.hpp>
+
15#include <dr/sp/algorithms/matrix/matrix_algorithms.hpp>
+
16#include <dr/sp/algorithms/reduce.hpp>
+
17#include <dr/sp/algorithms/sort.hpp>
+
18#include <dr/sp/algorithms/transform.hpp>
+
+ + + + diff --git a/doxygen/alignment_8hpp_source.html b/doxygen/alignment_8hpp_source.html new file mode 100644 index 0000000000..39e0411587 --- /dev/null +++ b/doxygen/alignment_8hpp_source.html @@ -0,0 +1,157 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/alignment.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
alignment.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/concepts/concepts.hpp>
+
8#include <dr/detail/ranges.hpp>
+
9#include <dr/detail/ranges_shim.hpp>
+
10
+
11namespace dr::mp {
+
12
+
13template <typename T>
+
14concept has_segments = requires(T &t) { dr::ranges::segments(t); };
+
15
+
16template <typename T>
+ +
18
+
19auto sub_aligned(has_segments auto &&r) {
+
20 if (rng::empty(dr::ranges::segments(r))) {
+
21 dr::drlog.debug("unaligned: empty segments\n");
+
22 return false;
+
23 } else {
+
24 return true;
+
25 }
+
26}
+
27
+
28auto sub_aligned(auto &&r) { return true; }
+
29
+
30// iter1 is aligned with iter2, and iter2 is aligned with the rest
+
31bool sub_aligned(has_segments auto &&r1, has_segments auto &&r2,
+
32 auto &&...rest) {
+
33 auto z = rng::views::zip(dr::ranges::segments(r1), dr::ranges::segments(r2));
+
34 auto i = rng::distance(z) - 1;
+
35 for (auto seg : z) {
+
36 if (dr::ranges::rank(seg.first) != dr::ranges::rank(seg.second)) {
+
37 dr::drlog.debug("unaligned: ranks: {} {}\n", dr::ranges::rank(seg.first),
+
38 dr::ranges::rank(seg.second));
+
39 return false;
+
40 }
+
41 // Size mismatch would misalign following segments. Skip test if this is the
+
42 // last segment
+
43 if (i > 0 && rng::distance(seg.first) != rng::distance(seg.second)) {
+
44 dr::drlog.debug("unaligned: size: {} {}\n", rng::distance(seg.first),
+
45 rng::distance(seg.second));
+
46 return false;
+
47 }
+
48 i--;
+
49 }
+
50
+
51 return sub_aligned(r2, rest...);
+
52}
+
53
+
54// Skip local iterators
+
55bool sub_aligned(no_segments auto &&r1, has_segments auto &&r2, auto... rest) {
+
56 return sub_aligned(r2, rest...);
+
57}
+
58
+
59bool sub_aligned(has_segments auto &&r1, no_segments auto &&r2,
+
60 auto &&...rest) {
+
61 return sub_aligned(r1, rest...);
+
62}
+
63
+
64// This was added to allow passing state down the call tree, but it is
+
65// no longer needed. I did not delete it in case we need it again.
+
66template <typename... Args> bool aligned(Args &&...args) {
+
67 return sub_aligned(std::forward<Args>(args)...);
+
68}
+
69
+
70} // namespace dr::mp
+
Definition: alignment.hpp:14
+
Definition: alignment.hpp:17
+
+ + + + diff --git a/doxygen/allocator_8hpp_source.html b/doxygen/allocator_8hpp_source.html new file mode 100644 index 0000000000..bb601801af --- /dev/null +++ b/doxygen/allocator_8hpp_source.html @@ -0,0 +1,141 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/allocator.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
allocator.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/mp/global.hpp>
+
8
+
9namespace dr::mp::__detail {
+
10
+
11template <typename T> class allocator {
+
12
+
13public:
+
14 T *allocate(std::size_t sz) {
+
15 if (sz == 0) {
+
16 return nullptr;
+
17 }
+
18
+
19 T *mem = nullptr;
+
20
+
21 if (mp::use_sycl()) {
+
22#ifdef SYCL_LANGUAGE_VERSION
+
23 mem = sycl::malloc<T>(sz, sycl_queue(), sycl_mem_kind());
+
24#else
+
25 assert(false);
+
26#endif
+
27 } else {
+
28 mem = std_allocator_.allocate(sz);
+
29 }
+
30
+
31 assert(mem != nullptr);
+
32 return mem;
+
33 }
+
34
+
35 void deallocate(T *ptr, std::size_t sz) {
+
36 if (sz == 0) {
+
37 assert(ptr == nullptr);
+
38 return;
+
39 }
+
40 assert(ptr != nullptr);
+
41#ifdef SYCL_LANGUAGE_VERSION
+
42 if (mp::use_sycl()) {
+
43 sycl::free(ptr, sycl_queue());
+
44 return;
+
45 }
+
46#endif
+
47
+
48 std_allocator_.deallocate(ptr, sz);
+
49 }
+
50
+
51private:
+
52 std::allocator<T> std_allocator_;
+
53};
+
54
+
55} // namespace dr::mp::__detail
+
Definition: allocator.hpp:11
+
+ + + + diff --git a/doxygen/allocators_8hpp_source.html b/doxygen/allocators_8hpp_source.html new file mode 100644 index 0000000000..8e6906b797 --- /dev/null +++ b/doxygen/allocators_8hpp_source.html @@ -0,0 +1,217 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/allocators.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
allocators.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <type_traits>
+
8
+
9#include <sycl/sycl.hpp>
+
10
+
11#include <dr/sp/device_ptr.hpp>
+
12
+
13namespace dr::sp {
+
14
+
15template <typename T>
+
16using shared_allocator = sycl::usm_allocator<T, sycl::usm::alloc::shared>;
+
17
+
18template <typename T, std::size_t Alignment = 0>
+
19 requires(std::is_trivially_copyable_v<T>)
+ +
21public:
+
22 using value_type = T;
+
23 using pointer = device_ptr<T>;
+ + + +
27 using size_type = std::size_t;
+
28 using difference_type = std::ptrdiff_t;
+
29
+
30 template <typename U>
+ +
32 : device_(other.get_device()), context_(other.get_context()) {}
+
33
+
34 device_allocator(const sycl::queue &q) noexcept
+
35 : device_(q.get_device()), context_(q.get_context()) {}
+
36 device_allocator(const sycl::context &ctxt, const sycl::device &dev) noexcept
+
37 : device_(dev), context_(ctxt) {}
+
38
+
39 device_allocator(const device_allocator &) = default;
+
40 device_allocator &operator=(const device_allocator &) = default;
+
41 ~device_allocator() = default;
+
42
+
43 using is_always_equal = std::false_type;
+
44
+
45 pointer allocate(std::size_t size) {
+
46 if constexpr (Alignment == 0) {
+
47 return pointer(sycl::malloc_device<T>(size, device_, context_));
+
48 } else {
+
49 return pointer(
+
50 sycl::aligned_alloc_device<T>(Alignment, size, device_, context_));
+
51 }
+
52 }
+
53
+
54 void deallocate(pointer ptr, std::size_t n) {
+
55 sycl::free(ptr.get_raw_pointer(), context_);
+
56 }
+
57
+
58 bool operator==(const device_allocator &) const = default;
+
59 bool operator!=(const device_allocator &) const = default;
+
60
+
61 template <typename U> struct rebind {
+ +
63 };
+
64
+
65 sycl::device get_device() const noexcept { return device_; }
+
66
+
67 sycl::context get_context() const noexcept { return context_; }
+
68
+
69private:
+
70 sycl::device device_;
+
71 sycl::context context_;
+
72};
+
73
+
74template <typename Allocator> class buffered_allocator {
+
75public:
+
76 using value_type = typename std::allocator_traits<Allocator>::value_type;
+
77 using pointer = typename std::allocator_traits<Allocator>::pointer;
+
78 using const_pointer =
+
79 typename std::allocator_traits<Allocator>::const_pointer;
+
80 using size_type = typename std::allocator_traits<Allocator>::size_type;
+
81 using difference_type =
+
82 typename std::allocator_traits<Allocator>::difference_type;
+
83
+
84 buffered_allocator(const Allocator &alloc, std::size_t buffer_size,
+
85 std::size_t n_buffers)
+
86 : alloc_(alloc), buffer_size_(buffer_size),
+
87 free_buffers_(new std::vector<pointer>()),
+
88 buffers_(new std::vector<pointer>()) {
+
89 for (std::size_t i = 0; i < n_buffers; i++) {
+
90 buffers_->push_back(alloc_.allocate(buffer_size_));
+
91 }
+
92 free_buffers_->assign(buffers_->begin(), buffers_->end());
+
93 }
+
94
+ +
96 if (buffers_.use_count() == 1) {
+
97 for (auto &&buffer : *buffers_) {
+
98 alloc_.deallocate(buffer, buffer_size_);
+
99 }
+
100 }
+
101 }
+
102
+
103 using is_always_equal = std::false_type;
+
104
+
105 pointer allocate(std::size_t size) {
+
106 if (size > buffer_size_ || free_buffers_->empty()) {
+
107 throw std::bad_alloc();
+
108 } else {
+
109 pointer buffer = free_buffers_->back();
+
110 free_buffers_->pop_back();
+
111 return buffer;
+
112 }
+
113 }
+
114
+
115 void deallocate(pointer ptr, std::size_t n) { free_buffers_->push_back(ptr); }
+
116
+
117 bool operator==(const buffered_allocator &) const = default;
+
118 bool operator!=(const buffered_allocator &) const = default;
+
119
+
120private:
+
121 Allocator alloc_;
+
122 std::size_t buffer_size_;
+
123 std::shared_ptr<std::vector<pointer>> free_buffers_;
+
124 std::shared_ptr<std::vector<pointer>> buffers_;
+
125};
+
126
+
127} // namespace dr::sp
+
Definition: allocators.hpp:74
+
Definition: allocators.hpp:20
+
Definition: device_ptr.hpp:17
+
Definition: device_ref.hpp:15
+
Definition: allocators.hpp:61
+
+ + + + diff --git a/doxygen/annotated.html b/doxygen/annotated.html new file mode 100644 index 0000000000..88b183d0b1 --- /dev/null +++ b/doxygen/annotated.html @@ -0,0 +1,235 @@ + + + + + + + +Distributed Ranges: Class List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12345]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Ndr
 N__detail
 Nmp
 Nranges
 Nsp
 Nviews
 Ccommunicator
 Cdefault_memory
 Cindex
 Cis_drop_view
 Cis_drop_view< rng::drop_view< T > >
 Cis_iota_view
 Cis_iota_view< rng::iota_view< W > >
 Cis_owning_view
 Cis_ref_view
 Cis_ref_view< rng::ref_view< R > >
 Cis_sliding_view
 Cis_sliding_view< rng::sliding_view< T > >
 Cis_subrange_view
 Cis_subrange_view< rng::subrange< T > >
 Cis_take_view
 Cis_take_view< rng::take_view< T > >
 Cis_zip_view
 Cis_zip_view< rng::zip_view< Views... > >
 Citerator_adaptor
 Clogger
 Cnormal_distributed_iterator_accessor
 Cremote_subrange
 Crma_window
 Ctimer
 Ctransform_iterator
 Ctransform_view
 Nfmt
 Cformatter< Mdspan, char >
 Nnostd
 Csource_location
 Nstd
 Ctuple_element< Index, dr::index< I > >
 Ctuple_element< Index, dr::sp::matrix_entry< T, I > >
 Ctuple_element< Index, dr::sp::matrix_ref< T, I, TRef > >
 Ctuple_size< dr::index< I > >
 Ctuple_size< dr::sp::matrix_entry< T, I > >
 Ctuple_size< dr::sp::matrix_ref< T, I, TRef > >
+
+
+ + + + diff --git a/doxygen/bc_s.png b/doxygen/bc_s.png new file mode 100644 index 0000000000..224b29aa98 Binary files /dev/null and b/doxygen/bc_s.png differ diff --git a/doxygen/bc_sd.png b/doxygen/bc_sd.png new file mode 100644 index 0000000000..31ca888dc7 Binary files /dev/null and b/doxygen/bc_sd.png differ diff --git a/doxygen/bdwn.png b/doxygen/bdwn.png new file mode 100644 index 0000000000..940a0b9504 Binary files /dev/null and b/doxygen/bdwn.png differ diff --git a/doxygen/classdr_1_1____detail_1_1direct__iterator-members.html b/doxygen/classdr_1_1____detail_1_1direct__iterator-members.html new file mode 100644 index 0000000000..f73d572201 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1direct__iterator-members.html @@ -0,0 +1,119 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::__detail::direct_iterator< Iter > Member List
+
+
+ +

This is the complete list of members for dr::__detail::direct_iterator< Iter >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
base() const noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
difference_type typedef (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
direct_iterator(Iter iter) noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
direct_iterator() noexcept=default (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
direct_iterator(const direct_iterator &) noexcept=default (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
is_passed_directly typedef (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
iterator typedef (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
iterator_category typedef (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
operator!=(const direct_iterator &) const noexcept=default (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
operator*() const noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator+(difference_type offset) const noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator+ (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >friend
operator++() noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator++(int) noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator+=(difference_type offset) noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator-(difference_type offset) const noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator-(iterator other) const noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator--() noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator--(int) noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator-=(difference_type offset) noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator<(iterator other) const noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator<=(iterator other) const noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator=(const direct_iterator &) noexcept=default (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
operator==(const direct_iterator &) const noexcept=default (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
operator>(iterator other) const noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator>=(iterator other) const noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
operator[](difference_type offset) const noexcept (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >inline
pointer typedef (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
reference typedef (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
value_type typedef (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
~direct_iterator() noexcept=default (defined in dr::__detail::direct_iterator< Iter >)dr::__detail::direct_iterator< Iter >
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1direct__iterator.html b/doxygen/classdr_1_1____detail_1_1direct__iterator.html new file mode 100644 index 0000000000..1b9a4d1599 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1direct__iterator.html @@ -0,0 +1,190 @@ + + + + + + + +Distributed Ranges: dr::__detail::direct_iterator< Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Friends | +List of all members
+
dr::__detail::direct_iterator< Iter > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + +

+Public Types

+using value_type = std::iter_value_t< Iter >
 
+using difference_type = std::iter_difference_t< Iter >
 
+using reference = std::iter_reference_t< Iter >
 
+using iterator = direct_iterator< Iter >
 
+using pointer = iterator
 
+using iterator_category = std::random_access_iterator_tag
 
+using is_passed_directly = ::std::true_type
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

direct_iterator (Iter iter) noexcept
 
direct_iterator (const direct_iterator &) noexcept=default
 
+direct_iteratoroperator= (const direct_iterator &) noexcept=default
 
+bool operator== (const direct_iterator &) const noexcept=default
 
+bool operator!= (const direct_iterator &) const noexcept=default
 
+iterator operator+ (difference_type offset) const noexcept
 
+iterator operator- (difference_type offset) const noexcept
 
+difference_type operator- (iterator other) const noexcept
 
+bool operator< (iterator other) const noexcept
 
+bool operator> (iterator other) const noexcept
 
+bool operator<= (iterator other) const noexcept
 
+bool operator>= (iterator other) const noexcept
 
+iteratoroperator++ () noexcept
 
+iterator operator++ (int) noexcept
 
+iteratoroperator-- () noexcept
 
+iterator operator-- (int) noexcept
 
+iteratoroperator+= (difference_type offset) noexcept
 
+iteratoroperator-= (difference_type offset) noexcept
 
+reference operator* () const noexcept
 
+reference operator[] (difference_type offset) const noexcept
 
+Iter base () const noexcept
 
+ + + +

+Friends

+iterator operator+ (difference_type n, iterator iter)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1enumerate__adapter__closure-members.html b/doxygen/classdr_1_1____detail_1_1enumerate__adapter__closure-members.html new file mode 100644 index 0000000000..541c120fa0 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1enumerate__adapter__closure-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::__detail::enumerate_adapter_closure Member List
+
+
+ +

This is the complete list of members for dr::__detail::enumerate_adapter_closure, including all inherited members.

+ + + +
operator()(R &&r) const (defined in dr::__detail::enumerate_adapter_closure)dr::__detail::enumerate_adapter_closureinline
operator| (defined in dr::__detail::enumerate_adapter_closure)dr::__detail::enumerate_adapter_closurefriend
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1enumerate__adapter__closure.html b/doxygen/classdr_1_1____detail_1_1enumerate__adapter__closure.html new file mode 100644 index 0000000000..cecc766948 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1enumerate__adapter__closure.html @@ -0,0 +1,107 @@ + + + + + + + +Distributed Ranges: dr::__detail::enumerate_adapter_closure Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Friends | +List of all members
+
dr::__detail::enumerate_adapter_closure Class Reference
+
+
+ + + + + +

+Public Member Functions

+template<rng::viewable_range R>
auto operator() (R &&r) const
 
+ + + + +

+Friends

+template<rng::viewable_range R>
auto operator| (R &&r, const enumerate_adapter_closure &closure)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1enumerate__fn__-members.html b/doxygen/classdr_1_1____detail_1_1enumerate__fn__-members.html new file mode 100644 index 0000000000..2c3b32672b --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1enumerate__fn__-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::__detail::enumerate_fn_ Member List
+
+
+ +

This is the complete list of members for dr::__detail::enumerate_fn_, including all inherited members.

+ + + +
enumerate() const (defined in dr::__detail::enumerate_fn_)dr::__detail::enumerate_fn_inline
operator()(R &&r) const (defined in dr::__detail::enumerate_fn_)dr::__detail::enumerate_fn_inline
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1enumerate__fn__.html b/doxygen/classdr_1_1____detail_1_1enumerate__fn__.html new file mode 100644 index 0000000000..b5f555cca5 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1enumerate__fn__.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: dr::__detail::enumerate_fn_ Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::__detail::enumerate_fn_ Class Reference
+
+
+ + + + + + + +

+Public Member Functions

+template<rng::viewable_range R>
constexpr auto operator() (R &&r) const
 
+auto enumerate () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1event-members.html b/doxygen/classdr_1_1____detail_1_1event-members.html new file mode 100644 index 0000000000..3098970689 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1event-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::__detail::event Member List
+
+
+ +

This is the complete list of members for dr::__detail::event, including all inherited members.

+ + +
wait() (defined in dr::__detail::event)dr::__detail::eventinline
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1event.html b/doxygen/classdr_1_1____detail_1_1event.html new file mode 100644 index 0000000000..ccc9362382 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1event.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::__detail::event Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::__detail::event Class Reference
+
+
+ + + + +

+Public Member Functions

+void wait ()
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1mdspan__iter__accessor-members.html b/doxygen/classdr_1_1____detail_1_1mdspan__iter__accessor-members.html new file mode 100644 index 0000000000..dc5908d4f3 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1mdspan__iter__accessor-members.html @@ -0,0 +1,94 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::__detail::mdspan_iter_accessor< Iter > Member List
+
+
+ +

This is the complete list of members for dr::__detail::mdspan_iter_accessor< Iter >, including all inherited members.

+ + + + + + + +
access(Iter iter, std::size_t index) const (defined in dr::__detail::mdspan_iter_accessor< Iter >)dr::__detail::mdspan_iter_accessor< Iter >inline
data_handle_type typedef (defined in dr::__detail::mdspan_iter_accessor< Iter >)dr::__detail::mdspan_iter_accessor< Iter >
mdspan_iter_accessor() noexcept=default (defined in dr::__detail::mdspan_iter_accessor< Iter >)dr::__detail::mdspan_iter_accessor< Iter >
offset(Iter iter, std::size_t index) const noexcept (defined in dr::__detail::mdspan_iter_accessor< Iter >)dr::__detail::mdspan_iter_accessor< Iter >inline
offset_policy typedef (defined in dr::__detail::mdspan_iter_accessor< Iter >)dr::__detail::mdspan_iter_accessor< Iter >
reference typedef (defined in dr::__detail::mdspan_iter_accessor< Iter >)dr::__detail::mdspan_iter_accessor< Iter >
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1mdspan__iter__accessor.html b/doxygen/classdr_1_1____detail_1_1mdspan__iter__accessor.html new file mode 100644 index 0000000000..8d60db69e7 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1mdspan__iter__accessor.html @@ -0,0 +1,114 @@ + + + + + + + +Distributed Ranges: dr::__detail::mdspan_iter_accessor< Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::__detail::mdspan_iter_accessor< Iter > Class Template Reference
+
+
+ + + + + + + + +

+Public Types

+using data_handle_type = Iter
 
+using reference = std::iter_reference_t< Iter >
 
+using offset_policy = mdspan_iter_accessor
 
+ + + + + +

+Public Member Functions

+constexpr auto access (Iter iter, std::size_t index) const
 
+constexpr auto offset (Iter iter, std::size_t index) const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1mdtranspose-members.html b/doxygen/classdr_1_1____detail_1_1mdtranspose-members.html new file mode 100644 index 0000000000..10b354eb98 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1mdtranspose-members.html @@ -0,0 +1,93 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::__detail::mdtranspose< Mdspan, Is > Member List
+
+
+ +

This is the complete list of members for dr::__detail::mdtranspose< Mdspan, Is >, including all inherited members.

+ + + + + + +
extent(std::size_t d) const (defined in dr::__detail::mdtranspose< Mdspan, Is >)dr::__detail::mdtranspose< Mdspan, Is >inline
extents() const (defined in dr::__detail::mdtranspose< Mdspan, Is >)dr::__detail::mdtranspose< Mdspan, Is >inline
mdtranspose(Mdspan &mdspan) (defined in dr::__detail::mdtranspose< Mdspan, Is >)dr::__detail::mdtranspose< Mdspan, Is >inline
operator()(Indexes... indexes) const (defined in dr::__detail::mdtranspose< Mdspan, Is >)dr::__detail::mdtranspose< Mdspan, Is >inline
operator()(std::array< std::size_t, rank_ > index) const (defined in dr::__detail::mdtranspose< Mdspan, Is >)dr::__detail::mdtranspose< Mdspan, Is >inline
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1mdtranspose.html b/doxygen/classdr_1_1____detail_1_1mdtranspose.html new file mode 100644 index 0000000000..b8bae48d10 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1mdtranspose.html @@ -0,0 +1,129 @@ + + + + + + + +Distributed Ranges: dr::__detail::mdtranspose< Mdspan, Is > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::__detail::mdtranspose< Mdspan, Is > Class Template Reference
+
+
+
+Inheritance diagram for dr::__detail::mdtranspose< Mdspan, Is >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::__detail::mdtranspose< Mdspan, Is >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + + +

+Public Member Functions

mdtranspose (Mdspan &mdspan)
 
+template<std::integral... Indexes>
auto & operator() (Indexes... indexes) const
 
+auto & operator() (std::array< std::size_t, rank_ > index) const
 
+auto extents () const
 
+auto extent (std::size_t d) const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1mdtranspose__coll__graph.map b/doxygen/classdr_1_1____detail_1_1mdtranspose__coll__graph.map new file mode 100644 index 0000000000..9675cf5cd6 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1mdtranspose__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1____detail_1_1mdtranspose__coll__graph.md5 b/doxygen/classdr_1_1____detail_1_1mdtranspose__coll__graph.md5 new file mode 100644 index 0000000000..3b5ea06957 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1mdtranspose__coll__graph.md5 @@ -0,0 +1 @@ +a7cbe1affc508275deb0cb300a18c197 \ No newline at end of file diff --git a/doxygen/classdr_1_1____detail_1_1mdtranspose__coll__graph.png b/doxygen/classdr_1_1____detail_1_1mdtranspose__coll__graph.png new file mode 100644 index 0000000000..f2205f1613 Binary files /dev/null and b/doxygen/classdr_1_1____detail_1_1mdtranspose__coll__graph.png differ diff --git a/doxygen/classdr_1_1____detail_1_1mdtranspose__inherit__graph.map b/doxygen/classdr_1_1____detail_1_1mdtranspose__inherit__graph.map new file mode 100644 index 0000000000..9675cf5cd6 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1mdtranspose__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1____detail_1_1mdtranspose__inherit__graph.md5 b/doxygen/classdr_1_1____detail_1_1mdtranspose__inherit__graph.md5 new file mode 100644 index 0000000000..3b5ea06957 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1mdtranspose__inherit__graph.md5 @@ -0,0 +1 @@ +a7cbe1affc508275deb0cb300a18c197 \ No newline at end of file diff --git a/doxygen/classdr_1_1____detail_1_1mdtranspose__inherit__graph.png b/doxygen/classdr_1_1____detail_1_1mdtranspose__inherit__graph.png new file mode 100644 index 0000000000..f2205f1613 Binary files /dev/null and b/doxygen/classdr_1_1____detail_1_1mdtranspose__inherit__graph.png differ diff --git a/doxygen/classdr_1_1____detail_1_1owning__view-members.html b/doxygen/classdr_1_1____detail_1_1owning__view-members.html new file mode 100644 index 0000000000..b720480bbb --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1owning__view-members.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::__detail::owning_view< R > Member List
+
+
+ +

This is the complete list of members for dr::__detail::owning_view< R >, including all inherited members.

+ + + + + + + + + + + + + + + +
base() (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >inline
base() const (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >inline
begin() (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >inline
begin() const (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >inline
empty() const (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >inline
end() (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >inline
end() const (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >inline
operator=(owning_view &&other)=default (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >
operator=(const owning_view &other)=default (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >
owning_view(R &&range) (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >inline
owning_view()=default (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >
owning_view(owning_view &&other)=default (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >
owning_view(const owning_view &other)=default (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >
size() const (defined in dr::__detail::owning_view< R >)dr::__detail::owning_view< R >inline
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1owning__view.html b/doxygen/classdr_1_1____detail_1_1owning__view.html new file mode 100644 index 0000000000..2260d91402 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1owning__view.html @@ -0,0 +1,152 @@ + + + + + + + +Distributed Ranges: dr::__detail::owning_view< R > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::__detail::owning_view< R > Class Template Reference
+
+
+
+Inheritance diagram for dr::__detail::owning_view< R >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::__detail::owning_view< R >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

owning_view (R &&range)
 
owning_view (owning_view &&other)=default
 
owning_view (const owning_view &other)=default
 
+owning_viewoperator= (owning_view &&other)=default
 
+owning_viewoperator= (const owning_view &other)=default
 
+auto size () const
 
+auto empty () const
 
+auto begin ()
 
+auto begin () const
 
+auto end ()
 
+auto end () const
 
+decltype(auto) base ()
 
+decltype(auto) base () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1____detail_1_1owning__view__coll__graph.map b/doxygen/classdr_1_1____detail_1_1owning__view__coll__graph.map new file mode 100644 index 0000000000..ed2505a804 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1owning__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1____detail_1_1owning__view__coll__graph.md5 b/doxygen/classdr_1_1____detail_1_1owning__view__coll__graph.md5 new file mode 100644 index 0000000000..5a2d800828 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1owning__view__coll__graph.md5 @@ -0,0 +1 @@ +3f46f3a33fc911a141cee3201c506d49 \ No newline at end of file diff --git a/doxygen/classdr_1_1____detail_1_1owning__view__coll__graph.png b/doxygen/classdr_1_1____detail_1_1owning__view__coll__graph.png new file mode 100644 index 0000000000..7a5f550d02 Binary files /dev/null and b/doxygen/classdr_1_1____detail_1_1owning__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1____detail_1_1owning__view__inherit__graph.map b/doxygen/classdr_1_1____detail_1_1owning__view__inherit__graph.map new file mode 100644 index 0000000000..ed2505a804 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1owning__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1____detail_1_1owning__view__inherit__graph.md5 b/doxygen/classdr_1_1____detail_1_1owning__view__inherit__graph.md5 new file mode 100644 index 0000000000..5a2d800828 --- /dev/null +++ b/doxygen/classdr_1_1____detail_1_1owning__view__inherit__graph.md5 @@ -0,0 +1 @@ +3f46f3a33fc911a141cee3201c506d49 \ No newline at end of file diff --git a/doxygen/classdr_1_1____detail_1_1owning__view__inherit__graph.png b/doxygen/classdr_1_1____detail_1_1owning__view__inherit__graph.png new file mode 100644 index 0000000000..7a5f550d02 Binary files /dev/null and b/doxygen/classdr_1_1____detail_1_1owning__view__inherit__graph.png differ diff --git a/doxygen/classdr_1_1communicator-members.html b/doxygen/classdr_1_1communicator-members.html new file mode 100644 index 0000000000..46b57f9a74 --- /dev/null +++ b/doxygen/classdr_1_1communicator-members.html @@ -0,0 +1,121 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::communicator Member List
+
+
+ +

This is the complete list of members for dr::communicator, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
all_gather(const T *src, T *dst, std::size_t count) const (defined in dr::communicator)dr::communicatorinline
all_gather(const T &src, std::vector< T > &dst) const (defined in dr::communicator)dr::communicatorinline
all_gather(const R &src, R &dst) const (defined in dr::communicator)dr::communicatorinline
alltoall(const R &sendr, R &recvr, std::size_t count) (defined in dr::communicator)dr::communicatorinline
alltoall(const T *send, T *receive, std::size_t count) (defined in dr::communicator)dr::communicatorinline
alltoallv(const SendR &sendbuf, const std::vector< std::size_t > &sendcnt, const std::vector< std::size_t > &senddsp, RecvR &recvbuf, const std::vector< std::size_t > &recvcnt, const std::vector< std::size_t > &recvdsp) (defined in dr::communicator)dr::communicatorinline
barrier() const (defined in dr::communicator)dr::communicatorinline
bcast(void *src, std::size_t count, std::size_t root) const (defined in dr::communicator)dr::communicatorinline
communicator(MPI_Comm comm=MPI_COMM_WORLD) (defined in dr::communicator)dr::communicatorinline
first() const (defined in dr::communicator)dr::communicatorinline
gather(const void *src, void *dst, std::size_t count, std::size_t root) const (defined in dr::communicator)dr::communicatorinline
gather(const T &src, std::span< T > dst, std::size_t root) const (defined in dr::communicator)dr::communicatorinline
gatherv(const void *src, int *counts, int *offsets, void *dst, std::size_t root) const (defined in dr::communicator)dr::communicatorinline
i_all_gather(const T *src, T *dst, std::size_t count, MPI_Request *req) const (defined in dr::communicator)dr::communicatorinline
i_all_gather(const T &src, std::vector< T > &dst, MPI_Request *req) const (defined in dr::communicator)dr::communicatorinline
irecv(T *data, std::size_t size, std::size_t src_rank, auto tag, MPI_Request *request) const (defined in dr::communicator)dr::communicatorinline
irecv(T *data, std::size_t size, std::size_t src_rank, MPI_Request *request) const (defined in dr::communicator)dr::communicatorinline
irecv(R &data, std::size_t src_rank, int tag, MPI_Request *request) const (defined in dr::communicator)dr::communicatorinline
irecv(R &data, std::size_t src_rank, MPI_Request *request) const (defined in dr::communicator)dr::communicatorinline
isend(const T *data, std::size_t count, std::size_t dst_rank, auto tag, MPI_Request *request) const (defined in dr::communicator)dr::communicatorinline
isend(const T *data, std::size_t count, std::size_t dst_rank, MPI_Request *request) const (defined in dr::communicator)dr::communicatorinline
isend(const R &data, std::size_t dst_rank, auto tag, MPI_Request *request) const (defined in dr::communicator)dr::communicatorinline
isend(const R &data, std::size_t dst_rank, MPI_Request *request) const (defined in dr::communicator)dr::communicatorinline
last() const (defined in dr::communicator)dr::communicatorinline
mpi_comm() const (defined in dr::communicator)dr::communicatorinline
next() const (defined in dr::communicator)dr::communicatorinline
operator==(const communicator &other) const (defined in dr::communicator)dr::communicatorinline
prev() const (defined in dr::communicator)dr::communicatorinline
rank() const (defined in dr::communicator)dr::communicatorinline
scatter(const void *src, void *dst, std::size_t count, std::size_t root) const (defined in dr::communicator)dr::communicatorinline
scatter(const std::span< T > src, T &dst, std::size_t root) const (defined in dr::communicator)dr::communicatorinline
scatterv(const void *src, int *counts, int *offsets, void *dst, int dst_count, std::size_t root) const (defined in dr::communicator)dr::communicatorinline
size() const (defined in dr::communicator)dr::communicatorinline
+ + + + diff --git a/doxygen/classdr_1_1communicator.html b/doxygen/classdr_1_1communicator.html new file mode 100644 index 0000000000..fd5e1ba405 --- /dev/null +++ b/doxygen/classdr_1_1communicator.html @@ -0,0 +1,212 @@ + + + + + + + +Distributed Ranges: dr::communicator Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::communicator Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

communicator (MPI_Comm comm=MPI_COMM_WORLD)
 
+auto size () const
 
+auto rank () const
 
+auto prev () const
 
+auto next () const
 
+auto first () const
 
+auto last () const
 
+MPI_Comm mpi_comm () const
 
+void barrier () const
 
+void bcast (void *src, std::size_t count, std::size_t root) const
 
+void scatter (const void *src, void *dst, std::size_t count, std::size_t root) const
 
+template<typename T >
void scatter (const std::span< T > src, T &dst, std::size_t root) const
 
+void scatterv (const void *src, int *counts, int *offsets, void *dst, int dst_count, std::size_t root) const
 
+void gather (const void *src, void *dst, std::size_t count, std::size_t root) const
 
+template<typename T >
void gather (const T &src, std::span< T > dst, std::size_t root) const
 
+template<typename T >
void all_gather (const T *src, T *dst, std::size_t count) const
 
+template<typename T >
void all_gather (const T &src, std::vector< T > &dst) const
 
+template<rng::contiguous_range R>
void all_gather (const R &src, R &dst) const
 
+template<typename T >
void i_all_gather (const T *src, T *dst, std::size_t count, MPI_Request *req) const
 
+template<typename T >
void i_all_gather (const T &src, std::vector< T > &dst, MPI_Request *req) const
 
+void gatherv (const void *src, int *counts, int *offsets, void *dst, std::size_t root) const
 
+template<typename T >
void isend (const T *data, std::size_t count, std::size_t dst_rank, auto tag, MPI_Request *request) const
 
+template<typename T >
void isend (const T *data, std::size_t count, std::size_t dst_rank, MPI_Request *request) const
 
+template<rng::contiguous_range R>
void isend (const R &data, std::size_t dst_rank, auto tag, MPI_Request *request) const
 
+template<rng::contiguous_range R>
void isend (const R &data, std::size_t dst_rank, MPI_Request *request) const
 
+template<typename T >
void irecv (T *data, std::size_t size, std::size_t src_rank, auto tag, MPI_Request *request) const
 
+template<typename T >
void irecv (T *data, std::size_t size, std::size_t src_rank, MPI_Request *request) const
 
+template<rng::contiguous_range R>
void irecv (R &data, std::size_t src_rank, int tag, MPI_Request *request) const
 
+template<rng::contiguous_range R>
void irecv (R &data, std::size_t src_rank, MPI_Request *request) const
 
+template<rng::contiguous_range R>
void alltoall (const R &sendr, R &recvr, std::size_t count)
 
+template<typename T >
void alltoall (const T *send, T *receive, std::size_t count)
 
+template<rng::contiguous_range SendR, rng::contiguous_range RecvR>
void alltoallv (const SendR &sendbuf, const std::vector< std::size_t > &sendcnt, const std::vector< std::size_t > &senddsp, RecvR &recvbuf, const std::vector< std::size_t > &recvcnt, const std::vector< std::size_t > &recvdsp)
 
+bool operator== (const communicator &other) const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1index-members.html b/doxygen/classdr_1_1index-members.html new file mode 100644 index 0000000000..e8507a172d --- /dev/null +++ b/doxygen/classdr_1_1index-members.html @@ -0,0 +1,108 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::index< T > Member List
+
+
+ +

This is the complete list of members for dr::index< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
first (defined in dr::index< T >)dr::index< T >
first_type typedef (defined in dr::index< T >)dr::index< T >
get() const noexcept (defined in dr::index< T >)dr::index< T >inline
index(index_type first, index_type second) (defined in dr::index< T >)dr::index< T >inline
index(Tuple tuple) (defined in dr::index< T >)dr::index< T >inline
index(std::initializer_list< U > tuple) (defined in dr::index< T >)dr::index< T >inline
index()=default (defined in dr::index< T >)dr::index< T >
index(const index &)=default (defined in dr::index< T >)dr::index< T >
index(index &&)=default (defined in dr::index< T >)dr::index< T >
index_type typedef (defined in dr::index< T >)dr::index< T >
operator index< U >() const noexcept (defined in dr::index< T >)dr::index< T >inline
operator index< U >() const noexcept (defined in dr::index< T >)dr::index< T >inlineexplicit
operator<(const index &other) const noexcept (defined in dr::index< T >)dr::index< T >inline
operator=(const index &)=default (defined in dr::index< T >)dr::index< T >
operator=(index &&)=default (defined in dr::index< T >)dr::index< T >
operator==(const index &) const noexcept=default (defined in dr::index< T >)dr::index< T >
operator[](index_type dim) const noexcept (defined in dr::index< T >)dr::index< T >inline
second (defined in dr::index< T >)dr::index< T >
second_type typedef (defined in dr::index< T >)dr::index< T >
~index()=default (defined in dr::index< T >)dr::index< T >
+ + + + diff --git a/doxygen/classdr_1_1index.html b/doxygen/classdr_1_1index.html new file mode 100644 index 0000000000..3309129b99 --- /dev/null +++ b/doxygen/classdr_1_1index.html @@ -0,0 +1,165 @@ + + + + + + + +Distributed Ranges: dr::index< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Public Attributes | +List of all members
+
dr::index< T > Class Template Reference
+
+
+ + + + + + + + +

+Public Types

+using index_type = T
 
+using first_type = T
 
+using second_type = T
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr index_type operator[] (index_type dim) const noexcept
 
+template<std::integral U>
+requires (std::numeric_limits<U>::max() >= std::numeric_limits<T>::max())
constexpr operator index< U > () const noexcept
 
+template<std::integral U>
+requires (std::numeric_limits<U>::max() < std::numeric_limits<T>::max())
constexpr operator index< U > () const noexcept
 
+constexpr index (index_type first, index_type second)
 
+template<TupleLike< T, T > Tuple>
constexpr index (Tuple tuple)
 
+template<std::integral U>
constexpr index (std::initializer_list< U > tuple)
 
+constexpr bool operator== (const index &) const noexcept=default
 
+constexpr bool operator< (const index &other) const noexcept
 
+template<std::size_t Index>
+requires (Index <= 1)
constexpr T get () const noexcept
 
index (const index &)=default
 
+indexoperator= (const index &)=default
 
index (index &&)=default
 
+indexoperator= (index &&)=default
 
+ + + + + +

+Public Attributes

+index_type first
 
+index_type second
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1iterator__adaptor-members.html b/doxygen/classdr_1_1iterator__adaptor-members.html new file mode 100644 index 0000000000..aec60c69fe --- /dev/null +++ b/doxygen/classdr_1_1iterator__adaptor-members.html @@ -0,0 +1,126 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::iterator_adaptor< Accessor > Member List
+
+
+ +

This is the complete list of members for dr::iterator_adaptor< Accessor >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
accessor_type typedef (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
const_accessor_type typedef (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
const_iterator typedef (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
difference_type typedef (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
iterator typedef (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
iterator_adaptor()=default (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
iterator_adaptor(const iterator_adaptor &)=default (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
iterator_adaptor(Args &&...args) (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
iterator_adaptor(const accessor_type &accessor) (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
iterator_adaptor(const const_accessor_type &accessor) (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
iterator_category typedef (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
nonconst_accessor_type typedef (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
nonconst_iterator typedef (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
operator const_iterator() const (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator!=(const_iterator other) const (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator*() const (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator+(difference_type offset) const (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator+ (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >friend
operator++() noexcept (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator++() noexcept (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator++(int) noexcept (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator+=(difference_type offset) noexcept (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator-(difference_type offset) const (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator-(const_iterator other) const (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator--() noexcept (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator--(int) noexcept (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator-=(difference_type offset) noexcept (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator<(const_iterator other) const (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator<=(const_iterator other) const (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator=(const iterator_adaptor &)=default (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
operator==(const_iterator other) const (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator>(const_iterator other) const (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator>=(const_iterator other) const (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
operator[](difference_type offset) const (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
reference typedef (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
segments() const noexcept (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >inline
value_type typedef (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
~iterator_adaptor()=default (defined in dr::iterator_adaptor< Accessor >)dr::iterator_adaptor< Accessor >
+ + + + diff --git a/doxygen/classdr_1_1iterator__adaptor.html b/doxygen/classdr_1_1iterator__adaptor.html new file mode 100644 index 0000000000..2580ae3b31 --- /dev/null +++ b/doxygen/classdr_1_1iterator__adaptor.html @@ -0,0 +1,213 @@ + + + + + + + +Distributed Ranges: dr::iterator_adaptor< Accessor > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Friends | +List of all members
+
dr::iterator_adaptor< Accessor > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using accessor_type = Accessor
 
+using const_accessor_type = typename Accessor::const_iterator_accessor
 
+using nonconst_accessor_type = typename Accessor::nonconst_iterator_accessor
 
+using difference_type = typename Accessor::difference_type
 
+using value_type = typename Accessor::value_type
 
+using iterator = iterator_adaptor< accessor_type >
 
+using const_iterator = iterator_adaptor< const_accessor_type >
 
+using reference = typename Accessor::reference
 
+using iterator_category = typename Accessor::iterator_category
 
+using nonconst_iterator = iterator_adaptor< nonconst_accessor_type >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

iterator_adaptor (const iterator_adaptor &)=default
 
+iterator_adaptoroperator= (const iterator_adaptor &)=default
 
+template<typename... Args>
+requires ( sizeof...(Args) >= 1 && !((sizeof...(Args) == 1 && (std::is_same_v<nonconst_iterator, std::decay_t<Args>> || ...)) || (std::is_same_v<const_iterator, std::decay_t<Args>> || ...) || (std::is_same_v<nonconst_accessor_type, std::decay_t<Args>> || ...) || (std::is_same_v<const_accessor_type, std::decay_t<Args>> || ...)) && std::is_constructible_v<accessor_type, Args...>)
 iterator_adaptor (Args &&...args)
 
iterator_adaptor (const accessor_type &accessor)
 
iterator_adaptor (const const_accessor_type &accessor)
 
operator const_iterator () const
 
+bool operator== (const_iterator other) const
 
+bool operator!= (const_iterator other) const
 
+bool operator< (const_iterator other) const
 
+bool operator<= (const_iterator other) const
 
+bool operator> (const_iterator other) const
 
+bool operator>= (const_iterator other) const
 
+reference operator* () const
 
+reference operator[] (difference_type offset) const
 
+iteratoroperator+= (difference_type offset) noexcept
 
+iteratoroperator-= (difference_type offset) noexcept
 
+iterator operator+ (difference_type offset) const
 
+iterator operator- (difference_type offset) const
 
+difference_type operator- (const_iterator other) const
 
+iteratoroperator++ () noexcept
 
+iteratoroperator++ () noexcept
 
+iterator operator++ (int) noexcept
 
+iteratoroperator-- () noexcept
 
+iterator operator-- (int) noexcept
 
+auto segments () const noexcept
 
+ + + +

+Friends

+iterator operator+ (difference_type n, iterator iter)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1logger-members.html b/doxygen/classdr_1_1logger-members.html new file mode 100644 index 0000000000..082791b4a4 --- /dev/null +++ b/doxygen/classdr_1_1logger-members.html @@ -0,0 +1,101 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::logger Member List
+
+
+ +

This is the complete list of members for dr::logger, including all inherited members.

+ + + + + + + + + + + + + + +
base enum value (defined in dr::logger)dr::logger
debug(const nostd::source_location &location, std::string format, Args &&...args) (defined in dr::logger)dr::loggerinline
debug(std::string format, Args &&...args) (defined in dr::logger)dr::loggerinline
debug(filters filter, std::string format, Args &&...args) (defined in dr::logger)dr::loggerinline
filter(const std::vector< std::string > &names) (defined in dr::logger)dr::loggerinline
filters enum name (defined in dr::logger)dr::logger
for_each enum value (defined in dr::logger)dr::logger
last enum value (defined in dr::logger)dr::logger
logger() (defined in dr::logger)dr::loggerinline
mdspan_view enum value (defined in dr::logger)dr::logger
mpi enum value (defined in dr::logger)dr::logger
set_file(std::ofstream &fout) (defined in dr::logger)dr::loggerinline
transpose enum value (defined in dr::logger)dr::logger
+ + + + diff --git a/doxygen/classdr_1_1logger.html b/doxygen/classdr_1_1logger.html new file mode 100644 index 0000000000..4d06c0fe7e --- /dev/null +++ b/doxygen/classdr_1_1logger.html @@ -0,0 +1,128 @@ + + + + + + + +Distributed Ranges: dr::logger Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::logger Class Reference
+
+
+ + + + +

+Public Types

enum  filters {
+  base +, for_each +, transpose +, mdspan_view +,
+  mpi +, last +
+ }
 
+ + + + + + + + + + + + + + +

+Public Member Functions

+void set_file (std::ofstream &fout)
 
+void filter (const std::vector< std::string > &names)
 
+template<typename... Args>
void debug (const nostd::source_location &location, std::string format, Args &&...args)
 
+template<typename... Args>
void debug (std::string format, Args &&...args)
 
+template<typename... Args>
void debug (filters filter, std::string format, Args &&...args)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1MpiBackend-members.html b/doxygen/classdr_1_1mp_1_1MpiBackend-members.html new file mode 100644 index 0000000000..a87b2bfeee --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1MpiBackend-members.html @@ -0,0 +1,94 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::MpiBackend Member List
+
+
+ +

This is the complete list of members for dr::mp::MpiBackend, including all inherited members.

+ + + + + + + +
allocate(std::size_t data_size) (defined in dr::mp::MpiBackend)dr::mp::MpiBackendinline
deallocate(void *data, std::size_t data_size) (defined in dr::mp::MpiBackend)dr::mp::MpiBackendinline
fence() (defined in dr::mp::MpiBackend)dr::mp::MpiBackendinline
getmem(void *dst, std::size_t offset, std::size_t datalen, int segment_index) (defined in dr::mp::MpiBackend)dr::mp::MpiBackendinline
getrank() (defined in dr::mp::MpiBackend)dr::mp::MpiBackendinline
putmem(void const *src, std::size_t offset, std::size_t datalen, int segment_index) (defined in dr::mp::MpiBackend)dr::mp::MpiBackendinline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1MpiBackend.html b/doxygen/classdr_1_1mp_1_1MpiBackend.html new file mode 100644 index 0000000000..acd41d82df --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1MpiBackend.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: dr::mp::MpiBackend Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mp::MpiBackend Class Reference
+
+
+ + + + + + + + + + + + + + +

+Public Member Functions

+void * allocate (std::size_t data_size)
 
+void deallocate (void *data, std::size_t data_size)
 
+void getmem (void *dst, std::size_t offset, std::size_t datalen, int segment_index)
 
+void putmem (void const *src, std::size_t offset, std::size_t datalen, int segment_index)
 
+std::size_t getrank ()
 
+void fence ()
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1allocator-members.html b/doxygen/classdr_1_1mp_1_1____detail_1_1allocator-members.html new file mode 100644 index 0000000000..0b2848930b --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1allocator-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::__detail::allocator< T > Member List
+
+
+ +

This is the complete list of members for dr::mp::__detail::allocator< T >, including all inherited members.

+ + + +
allocate(std::size_t sz) (defined in dr::mp::__detail::allocator< T >)dr::mp::__detail::allocator< T >inline
deallocate(T *ptr, std::size_t sz) (defined in dr::mp::__detail::allocator< T >)dr::mp::__detail::allocator< T >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1allocator.html b/doxygen/classdr_1_1mp_1_1____detail_1_1allocator.html new file mode 100644 index 0000000000..63b1332d5a --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1allocator.html @@ -0,0 +1,101 @@ + + + + + + + +Distributed Ranges: dr::mp::__detail::allocator< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mp::__detail::allocator< T > Class Template Reference
+
+
+ + + + + + +

+Public Member Functions

+T * allocate (std::size_t sz)
 
+void deallocate (T *ptr, std::size_t sz)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1buffer-members.html b/doxygen/classdr_1_1mp_1_1____detail_1_1buffer-members.html new file mode 100644 index 0000000000..82fc71636f --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1buffer-members.html @@ -0,0 +1,97 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::__detail::buffer< T > Member List
+
+
+ +

This is the complete list of members for dr::mp::__detail::buffer< T >, including all inherited members.

+ + + + + + + + + + +
begin() (defined in dr::mp::__detail::buffer< T >)dr::mp::__detail::buffer< T >inline
buffer(std::size_t cnt) (defined in dr::mp::__detail::buffer< T >)dr::mp::__detail::buffer< T >inline
data() (defined in dr::mp::__detail::buffer< T >)dr::mp::__detail::buffer< T >inline
end() (defined in dr::mp::__detail::buffer< T >)dr::mp::__detail::buffer< T >inline
replace(buffer &other) (defined in dr::mp::__detail::buffer< T >)dr::mp::__detail::buffer< T >inline
resize(std::size_t cnt) (defined in dr::mp::__detail::buffer< T >)dr::mp::__detail::buffer< T >inline
size() (defined in dr::mp::__detail::buffer< T >)dr::mp::__detail::buffer< T >inline
value_type typedef (defined in dr::mp::__detail::buffer< T >)dr::mp::__detail::buffer< T >
~buffer() (defined in dr::mp::__detail::buffer< T >)dr::mp::__detail::buffer< T >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1buffer.html b/doxygen/classdr_1_1mp_1_1____detail_1_1buffer.html new file mode 100644 index 0000000000..6d9567326c --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1buffer.html @@ -0,0 +1,123 @@ + + + + + + + +Distributed Ranges: dr::mp::__detail::buffer< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mp::__detail::buffer< T > Class Template Reference
+
+
+ + + + +

+Public Types

+using value_type = T
 
+ + + + + + + + + + + + + + + +

+Public Member Functions

+std::size_t size ()
 
buffer (std::size_t cnt)
 
+T * resize (std::size_t cnt)
 
+void replace (buffer &other)
 
+T * data ()
 
+T * begin ()
 
+T * end ()
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment-members.html b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment-members.html new file mode 100644 index 0000000000..75e30ca1ec --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment-members.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::__detail::md_segment< BaseSegment, Rank > Member List
+
+
+ +

This is the complete list of members for dr::mp::__detail::md_segment< BaseSegment, Rank >, including all inherited members.

+ + + + + + + + + + + +
begin() const (defined in dr::mp::__detail::md_segment< BaseSegment, Rank >)dr::mp::__detail::md_segment< BaseSegment, Rank >inline
end() const (defined in dr::mp::__detail::md_segment< BaseSegment, Rank >)dr::mp::__detail::md_segment< BaseSegment, Rank >inline
halo() const (defined in dr::mp::__detail::md_segment< BaseSegment, Rank >)dr::mp::__detail::md_segment< BaseSegment, Rank >inline
index_type typedef (defined in dr::mp::__detail::md_segment< BaseSegment, Rank >)dr::mp::__detail::md_segment< BaseSegment, Rank >
md_segment() (defined in dr::mp::__detail::md_segment< BaseSegment, Rank >)dr::mp::__detail::md_segment< BaseSegment, Rank >inline
md_segment(index_type origin, BaseSegment segment, index_type tile_shape) (defined in dr::mp::__detail::md_segment< BaseSegment, Rank >)dr::mp::__detail::md_segment< BaseSegment, Rank >inline
mdspan() const (defined in dr::mp::__detail::md_segment< BaseSegment, Rank >)dr::mp::__detail::md_segment< BaseSegment, Rank >inline
origin() const (defined in dr::mp::__detail::md_segment< BaseSegment, Rank >)dr::mp::__detail::md_segment< BaseSegment, Rank >inline
reserved() const (defined in dr::mp::__detail::md_segment< BaseSegment, Rank >)dr::mp::__detail::md_segment< BaseSegment, Rank >inline
root_mdspan() const (defined in dr::mp::__detail::md_segment< BaseSegment, Rank >)dr::mp::__detail::md_segment< BaseSegment, Rank >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment.html b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment.html new file mode 100644 index 0000000000..66d7cd335d --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment.html @@ -0,0 +1,144 @@ + + + + + + + +Distributed Ranges: dr::mp::__detail::md_segment< BaseSegment, Rank > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mp::__detail::md_segment< BaseSegment, Rank > Class Template Reference
+
+
+
+Inheritance diagram for dr::mp::__detail::md_segment< BaseSegment, Rank >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::mp::__detail::md_segment< BaseSegment, Rank >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + +

+Public Types

+using index_type = dr::__detail::dr_extents< Rank >
 
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

md_segment (index_type origin, BaseSegment segment, index_type tile_shape)
 
+auto begin () const
 
+auto end () const
 
+auto reserved () const
 
+auto halo () const
 
+auto mdspan () const
 
+auto origin () const
 
+auto root_mdspan () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__coll__graph.map b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__coll__graph.map new file mode 100644 index 0000000000..bf2ca36f98 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__coll__graph.md5 b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__coll__graph.md5 new file mode 100644 index 0000000000..e07ad2027b --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__coll__graph.md5 @@ -0,0 +1 @@ +7719183145da056c231849ce888e7fff \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__coll__graph.png b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__coll__graph.png new file mode 100644 index 0000000000..0d31c5bf8f Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__coll__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__inherit__graph.map b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__inherit__graph.map new file mode 100644 index 0000000000..bf2ca36f98 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__inherit__graph.md5 b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__inherit__graph.md5 new file mode 100644 index 0000000000..e07ad2027b --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__inherit__graph.md5 @@ -0,0 +1 @@ +7719183145da056c231849ce888e7fff \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__inherit__graph.png b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__inherit__graph.png new file mode 100644 index 0000000000..0d31c5bf8f Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1____detail_1_1md__segment__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment-members.html b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment-members.html new file mode 100644 index 0000000000..2c8bfaad5d --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment-members.html @@ -0,0 +1,93 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout > Member List
+
+
+ +

This is the complete list of members for dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >, including all inherited members.

+ + + + + + +
index_type typedef (defined in dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >)dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >
mdspan() const (defined in dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >)dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >inline
mdsub_segment() (defined in dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >)dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >inline
mdsub_segment(BaseSegment segment, const index_type &slice_starts, const index_type &slice_ends) (defined in dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >)dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >inline
root_mdspan() const (defined in dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >)dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment.html b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment.html new file mode 100644 index 0000000000..a3d2aa98a6 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment.html @@ -0,0 +1,129 @@ + + + + + + + +Distributed Ranges: dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout > Class Template Reference
+
+
+
+Inheritance diagram for dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::mp::__detail::mdsub_segment< BaseSegment, Rank, Layout >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + +

+Public Types

+using index_type = dr::__detail::dr_extents< Rank >
 
+ + + + + + + +

+Public Member Functions

mdsub_segment (BaseSegment segment, const index_type &slice_starts, const index_type &slice_ends)
 
+auto mdspan () const
 
+auto root_mdspan () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__coll__graph.map b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__coll__graph.map new file mode 100644 index 0000000000..b19a2eacd4 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__coll__graph.md5 b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__coll__graph.md5 new file mode 100644 index 0000000000..972d3334da --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__coll__graph.md5 @@ -0,0 +1 @@ +c39dddf58831abd1e8535e56290858ad \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__coll__graph.png b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__coll__graph.png new file mode 100644 index 0000000000..4c0c5c4015 Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__coll__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__inherit__graph.map b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__inherit__graph.map new file mode 100644 index 0000000000..b19a2eacd4 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__inherit__graph.md5 b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__inherit__graph.md5 new file mode 100644 index 0000000000..972d3334da --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__inherit__graph.md5 @@ -0,0 +1 @@ +c39dddf58831abd1e8535e56290858ad \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__inherit__graph.png b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__inherit__graph.png new file mode 100644 index 0000000000..4c0c5c4015 Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1____detail_1_1mdsub__segment__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1tmp__buffer-members.html b/doxygen/classdr_1_1mp_1_1____detail_1_1tmp__buffer-members.html new file mode 100644 index 0000000000..e572cd33eb --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1tmp__buffer-members.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::__detail::tmp_buffer< T > Member List
+
+
+ +

This is the complete list of members for dr::mp::__detail::tmp_buffer< T >, including all inherited members.

+ + + + +
data() (defined in dr::mp::__detail::tmp_buffer< T >)dr::mp::__detail::tmp_buffer< T >inline
tmp_buffer(std::size_t size, auto &&candidate) (defined in dr::mp::__detail::tmp_buffer< T >)dr::mp::__detail::tmp_buffer< T >inline
~tmp_buffer() (defined in dr::mp::__detail::tmp_buffer< T >)dr::mp::__detail::tmp_buffer< T >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1____detail_1_1tmp__buffer.html b/doxygen/classdr_1_1mp_1_1____detail_1_1tmp__buffer.html new file mode 100644 index 0000000000..af239045a1 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1____detail_1_1tmp__buffer.html @@ -0,0 +1,101 @@ + + + + + + + +Distributed Ranges: dr::mp::__detail::tmp_buffer< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mp::__detail::tmp_buffer< T > Class Template Reference
+
+
+ + + + + + +

+Public Member Functions

tmp_buffer (std::size_t size, auto &&candidate)
 
+T * data ()
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1count__fn__-members.html b/doxygen/classdr_1_1mp_1_1count__fn__-members.html new file mode 100644 index 0000000000..701394defd --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1count__fn__-members.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::count_fn_ Member List
+
+
+ +

This is the complete list of members for dr::mp::count_fn_, including all inherited members.

+ + + + + +
operator()(std::size_t root, DR &&dr, const T &value) const (defined in dr::mp::count_fn_)dr::mp::count_fn_inline
operator()(DR &&dr, const T &value) const (defined in dr::mp::count_fn_)dr::mp::count_fn_inline
operator()(std::size_t root, DI first, DI last, const T &value) const (defined in dr::mp::count_fn_)dr::mp::count_fn_inline
operator()(DI first, DI last, const T &value) const (defined in dr::mp::count_fn_)dr::mp::count_fn_inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1count__fn__.html b/doxygen/classdr_1_1mp_1_1count__fn__.html new file mode 100644 index 0000000000..5e281f328c --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1count__fn__.html @@ -0,0 +1,111 @@ + + + + + + + +Distributed Ranges: dr::mp::count_fn_ Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mp::count_fn_ Class Reference
+
+
+ + + + + + + + + + + + + + +

+Public Member Functions

+template<typename T , dr::distributed_range DR>
auto operator() (std::size_t root, DR &&dr, const T &value) const
 
+template<typename T , dr::distributed_range DR>
auto operator() (DR &&dr, const T &value) const
 
+template<typename T , dr::distributed_iterator DI>
auto operator() (std::size_t root, DI first, DI last, const T &value) const
 
+template<typename T , dr::distributed_iterator DI>
auto operator() (DI first, DI last, const T &value) const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1count__if__fn__-members.html b/doxygen/classdr_1_1mp_1_1count__if__fn__-members.html new file mode 100644 index 0000000000..6afa740101 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1count__if__fn__-members.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::count_if_fn_ Member List
+
+
+ +

This is the complete list of members for dr::mp::count_if_fn_, including all inherited members.

+ + + + + +
operator()(std::size_t root, DR &&dr, auto &&pred) const (defined in dr::mp::count_if_fn_)dr::mp::count_if_fn_inline
operator()(DR &&dr, auto &&pred) const (defined in dr::mp::count_if_fn_)dr::mp::count_if_fn_inline
operator()(std::size_t root, DI first, DI last, auto &&pred) const (defined in dr::mp::count_if_fn_)dr::mp::count_if_fn_inline
operator()(DI first, DI last, auto &&pred) const (defined in dr::mp::count_if_fn_)dr::mp::count_if_fn_inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1count__if__fn__.html b/doxygen/classdr_1_1mp_1_1count__if__fn__.html new file mode 100644 index 0000000000..2dc8331991 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1count__if__fn__.html @@ -0,0 +1,111 @@ + + + + + + + +Distributed Ranges: dr::mp::count_if_fn_ Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mp::count_if_fn_ Class Reference
+
+
+ + + + + + + + + + + + + + +

+Public Member Functions

+template<dr::distributed_range DR>
auto operator() (std::size_t root, DR &&dr, auto &&pred) const
 
+template<dr::distributed_range DR>
auto operator() (DR &&dr, auto &&pred) const
 
+template<dr::distributed_iterator DI>
auto operator() (std::size_t root, DI first, DI last, auto &&pred) const
 
+template<dr::distributed_iterator DI>
auto operator() (DI first, DI last, auto &&pred) const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1distributed__mdarray-members.html b/doxygen/classdr_1_1mp_1_1distributed__mdarray-members.html new file mode 100644 index 0000000000..28683e6e37 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1distributed__mdarray-members.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::distributed_mdarray< T, Rank > Member List
+
+
+ +

This is the complete list of members for dr::mp::distributed_mdarray< T, Rank >, including all inherited members.

+ + + + + + + + + + + + + + + +
begin() const (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inline
distributed_mdarray(dr::__detail::dr_extents< Rank > shape, distribution dist=distribution()) (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inline
end() const (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inline
extent(std::size_t r) const (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inline
grid() (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inline
halo() const (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inline
mdspan() const (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inline
operator==(const distributed_mdarray &other) const (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inline
operator[](auto n) (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inline
rank() (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inlinestatic
segments() (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inline
shape_type typedef (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >
size() const (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inline
view() const (defined in dr::mp::distributed_mdarray< T, Rank >)dr::mp::distributed_mdarray< T, Rank >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1distributed__mdarray.html b/doxygen/classdr_1_1mp_1_1distributed__mdarray.html new file mode 100644 index 0000000000..140b66db9c --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1distributed__mdarray.html @@ -0,0 +1,145 @@ + + + + + + + +Distributed Ranges: dr::mp::distributed_mdarray< T, Rank > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Static Public Member Functions | +List of all members
+
dr::mp::distributed_mdarray< T, Rank > Class Template Reference
+
+
+ + + + +

+Public Types

+using shape_type = dr::__detail::dr_extents< Rank >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

distributed_mdarray (dr::__detail::dr_extents< Rank > shape, distribution dist=distribution())
 
+auto begin () const
 
+auto end () const
 
+auto size () const
 
+auto operator[] (auto n)
 
+auto segments ()
 
+auto & halo () const
 
+auto mdspan () const
 
+auto extent (std::size_t r) const
 
+auto grid ()
 
+auto view () const
 
+auto operator== (const distributed_mdarray &other) const
 
+ + + +

+Static Public Member Functions

+static constexpr auto rank ()
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1distributed__vector-members.html b/doxygen/classdr_1_1mp_1_1distributed__vector-members.html new file mode 100644 index 0000000000..76c84e9abf --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1distributed__vector-members.html @@ -0,0 +1,105 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::distributed_vector< T, BackendT > Member List
+
+
+ +

This is the complete list of members for dr::mp::distributed_vector< T, BackendT >, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
backend_type typedef (defined in dr::mp::distributed_vector< T, BackendT >)dr::mp::distributed_vector< T, BackendT >
begin() constdr::mp::distributed_vector< T, BackendT >inline
difference_type typedef (defined in dr::mp::distributed_vector< T, BackendT >)dr::mp::distributed_vector< T, BackendT >
distributed_vector(const distributed_vector &)=delete (defined in dr::mp::distributed_vector< T, BackendT >)dr::mp::distributed_vector< T, BackendT >
distributed_vector(distributed_vector &&) (defined in dr::mp::distributed_vector< T, BackendT >)dr::mp::distributed_vector< T, BackendT >inline
distributed_vector(std::size_t size=0, distribution dist=distribution())dr::mp::distributed_vector< T, BackendT >inline
distributed_vector(std::size_t size, value_type fill_value, distribution dist=distribution())dr::mp::distributed_vector< T, BackendT >inline
end() constdr::mp::distributed_vector< T, BackendT >inline
fence() (defined in dr::mp::distributed_vector< T, BackendT >)dr::mp::distributed_vector< T, BackendT >inline
halo() const (defined in dr::mp::distributed_vector< T, BackendT >)dr::mp::distributed_vector< T, BackendT >inline
operator=(const distributed_vector &)=delete (defined in dr::mp::distributed_vector< T, BackendT >)dr::mp::distributed_vector< T, BackendT >
operator[](difference_type n) constdr::mp::distributed_vector< T, BackendT >inline
segments() const (defined in dr::mp::distributed_vector< T, BackendT >)dr::mp::distributed_vector< T, BackendT >inline
size() constdr::mp::distributed_vector< T, BackendT >inline
size_type typedef (defined in dr::mp::distributed_vector< T, BackendT >)dr::mp::distributed_vector< T, BackendT >
value_type typedef (defined in dr::mp::distributed_vector< T, BackendT >)dr::mp::distributed_vector< T, BackendT >
~distributed_vector() (defined in dr::mp::distributed_vector< T, BackendT >)dr::mp::distributed_vector< T, BackendT >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1distributed__vector.html b/doxygen/classdr_1_1mp_1_1distributed__vector.html new file mode 100644 index 0000000000..3b7f77464d --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1distributed__vector.html @@ -0,0 +1,167 @@ + + + + + + + +Distributed Ranges: dr::mp::distributed_vector< T, BackendT > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Public Types | +Public Member Functions | +List of all members
+
dr::mp::distributed_vector< T, BackendT > Class Template Reference
+
+
+ +

distributed vector + More...

+ +

#include <distributed_vector.hpp>

+ + + + +

+Classes

class  iterator
 
+ + + + + + + + + +

+Public Types

+using value_type = T
 
+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using backend_type = BackendT
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

distributed_vector (const distributed_vector &)=delete
 
+distributed_vectoroperator= (const distributed_vector &)=delete
 
distributed_vector (distributed_vector &&)
 
distributed_vector (std::size_t size=0, distribution dist=distribution())
 Constructor.
 
distributed_vector (std::size_t size, value_type fill_value, distribution dist=distribution())
 Constructor.
 
+auto begin () const
 Returns iterator to beginning.
 
+auto end () const
 Returns iterator to end.
 
+auto size () const
 Returns size.
 
+auto operator[] (difference_type n) const
 Returns reference using index.
 
+auto & halo () const
 
+auto segments () const
 
+void fence ()
 
+

Detailed Description

+
template<typename T, class BackendT = MpiBackend>
+class dr::mp::distributed_vector< T, BackendT >

distributed vector

+

The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1distributed__vector_1_1iterator-members.html b/doxygen/classdr_1_1mp_1_1distributed__vector_1_1iterator-members.html new file mode 100644 index 0000000000..a621721f25 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1distributed__vector_1_1iterator-members.html @@ -0,0 +1,109 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::distributed_vector< T, BackendT >::iterator Member List
+
+
+ +

This is the complete list of members for dr::mp::distributed_vector< T, BackendT >::iterator, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
difference_type typedef (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iterator
iterator() (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
iterator(const distributed_vector *parent, difference_type offset) (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
iterator_category typedef (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iterator
local() (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator*() const (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator+(difference_type n) const (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator+ (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorfriend
operator++() (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator++(int) (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator+=(difference_type n) (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator-(difference_type n) const (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator-(iterator other) const (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator--() (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator--(int) (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator-=(difference_type n) (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator<=>(iterator other) const (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator==(iterator other) const (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
operator[](difference_type n) const (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
segments() (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iteratorinline
value_type typedef (defined in dr::mp::distributed_vector< T, BackendT >::iterator)dr::mp::distributed_vector< T, BackendT >::iterator
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1distributed__vector_1_1iterator.html b/doxygen/classdr_1_1mp_1_1distributed__vector_1_1iterator.html new file mode 100644 index 0000000000..2072e4dac7 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1distributed__vector_1_1iterator.html @@ -0,0 +1,163 @@ + + + + + + + +Distributed Ranges: dr::mp::distributed_vector< T, BackendT >::iterator Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Friends | +List of all members
+
dr::mp::distributed_vector< T, BackendT >::iterator Class Reference
+
+
+ + + + + + + + +

+Public Types

+using iterator_category = std::random_access_iterator_tag
 
+using value_type = typename distributed_vector::value_type
 
+using difference_type = typename distributed_vector::difference_type
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

iterator (const distributed_vector *parent, difference_type offset)
 
+auto operator+ (difference_type n) const
 
+auto operator- (difference_type n) const
 
+auto operator- (iterator other) const
 
+auto & operator+= (difference_type n)
 
+auto & operator-= (difference_type n)
 
+auto & operator++ ()
 
+auto operator++ (int)
 
+auto & operator-- ()
 
+auto operator-- (int)
 
+bool operator== (iterator other) const
 
+auto operator<=> (iterator other) const
 
+auto operator* () const
 
+auto operator[] (difference_type n) const
 
+auto local ()
 
+auto segments ()
 
+ + + +

+Friends

+auto operator+ (difference_type n, const iterator &other)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1dv__segment-members.html b/doxygen/classdr_1_1mp_1_1dv__segment-members.html new file mode 100644 index 0000000000..599ca425c4 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1dv__segment-members.html @@ -0,0 +1,97 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::dv_segment< DV > Member List
+
+
+ +

This is the complete list of members for dr::mp::dv_segment< DV >, including all inherited members.

+ + + + + + + + + + +
begin() const (defined in dr::mp::dv_segment< DV >)dr::mp::dv_segment< DV >inline
difference_type typedef (defined in dr::mp::dv_segment< DV >)dr::mp::dv_segment< DV >
dv_segment()=default (defined in dr::mp::dv_segment< DV >)dr::mp::dv_segment< DV >
dv_segment(DV *dv, std::size_t segment_index, std::size_t size, std::size_t reserved) (defined in dr::mp::dv_segment< DV >)dr::mp::dv_segment< DV >inline
end() const (defined in dr::mp::dv_segment< DV >)dr::mp::dv_segment< DV >inline
is_local() const (defined in dr::mp::dv_segment< DV >)dr::mp::dv_segment< DV >inline
operator[](difference_type n) const (defined in dr::mp::dv_segment< DV >)dr::mp::dv_segment< DV >inline
reserved() const (defined in dr::mp::dv_segment< DV >)dr::mp::dv_segment< DV >inline
size() const (defined in dr::mp::dv_segment< DV >)dr::mp::dv_segment< DV >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1dv__segment.html b/doxygen/classdr_1_1mp_1_1dv__segment.html new file mode 100644 index 0000000000..ad2cc20b6f --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1dv__segment.html @@ -0,0 +1,123 @@ + + + + + + + +Distributed Ranges: dr::mp::dv_segment< DV > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mp::dv_segment< DV > Class Template Reference
+
+
+ + + + +

+Public Types

+using difference_type = std::ptrdiff_t
 
+ + + + + + + + + + + + + + + +

+Public Member Functions

dv_segment (DV *dv, std::size_t segment_index, std::size_t size, std::size_t reserved)
 
+auto size () const
 
+auto begin () const
 
+auto end () const
 
+auto reserved () const
 
+auto operator[] (difference_type n) const
 
+bool is_local () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1dv__segment__iterator-members.html b/doxygen/classdr_1_1mp_1_1dv__segment__iterator-members.html new file mode 100644 index 0000000000..fd6c248aa2 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1dv__segment__iterator-members.html @@ -0,0 +1,116 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::dv_segment_iterator< DV > Member List
+
+
+ +

This is the complete list of members for dr::mp::dv_segment_iterator< DV >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
difference_type typedef (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >
dv_segment_iterator()=default (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >
dv_segment_iterator(DV *dv, std::size_t segment_index, std::size_t index) (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
get(value_type *dst, std::size_t size) const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
get() const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
halo() const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
halo_bounds() const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
local() const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator*() const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator+(difference_type n) const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator+ (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >friend
operator++() (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator++(int) (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator+=(difference_type n) (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator-(const dv_segment_iterator &other) const noexcept (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator-(difference_type n) const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator--() (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator--(int) (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator-=(difference_type n) (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator<=>(const dv_segment_iterator &other) const noexcept (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator==(const dv_segment_iterator &other) const noexcept (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
operator[](difference_type n) const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
put(const value_type *dst, std::size_t size) const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
put(const value_type &value) const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
rank() const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
segments() const (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >inline
size_type typedef (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >
value_type typedef (defined in dr::mp::dv_segment_iterator< DV >)dr::mp::dv_segment_iterator< DV >
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1dv__segment__iterator.html b/doxygen/classdr_1_1mp_1_1dv__segment__iterator.html new file mode 100644 index 0000000000..ceee86cd8d --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1dv__segment__iterator.html @@ -0,0 +1,184 @@ + + + + + + + +Distributed Ranges: dr::mp::dv_segment_iterator< DV > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Friends | +List of all members
+
dr::mp::dv_segment_iterator< DV > Class Template Reference
+
+
+ + + + + + + + +

+Public Types

+using value_type = typename DV::value_type
 
+using size_type = typename DV::size_type
 
+using difference_type = typename DV::difference_type
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

dv_segment_iterator (DV *dv, std::size_t segment_index, std::size_t index)
 
+auto operator<=> (const dv_segment_iterator &other) const noexcept
 
+bool operator== (const dv_segment_iterator &other) const noexcept
 
+auto & operator+= (difference_type n)
 
+auto & operator-= (difference_type n)
 
+difference_type operator- (const dv_segment_iterator &other) const noexcept
 
+auto & operator++ ()
 
+auto & operator-- ()
 
+auto operator++ (int)
 
+auto operator-- (int)
 
+auto operator+ (difference_type n) const
 
+auto operator- (difference_type n) const
 
+auto operator* () const
 
+auto operator[] (difference_type n) const
 
+void get (value_type *dst, std::size_t size) const
 
+value_type get () const
 
+void put (const value_type *dst, std::size_t size) const
 
+void put (const value_type &value) const
 
+auto rank () const
 
+auto local () const
 
+auto segments () const
 
+auto & halo () const
 
+auto halo_bounds () const
 
+ + + +

+Friends

+auto operator+ (difference_type n, const dv_segment_iterator &other)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1dv__segment__reference-members.html b/doxygen/classdr_1_1mp_1_1dv__segment__reference-members.html new file mode 100644 index 0000000000..67982e8022 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1dv__segment__reference-members.html @@ -0,0 +1,94 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::dv_segment_reference< DV > Member List
+
+
+ +

This is the complete list of members for dr::mp::dv_segment_reference< DV >, including all inherited members.

+ + + + + + + +
dv_segment_reference(const iterator it) (defined in dr::mp::dv_segment_reference< DV >)dr::mp::dv_segment_reference< DV >inline
operator value_type() const (defined in dr::mp::dv_segment_reference< DV >)dr::mp::dv_segment_reference< DV >inline
operator&() const (defined in dr::mp::dv_segment_reference< DV >)dr::mp::dv_segment_reference< DV >inline
operator=(const value_type &value) const (defined in dr::mp::dv_segment_reference< DV >)dr::mp::dv_segment_reference< DV >inline
operator=(const dv_segment_reference &other) const (defined in dr::mp::dv_segment_reference< DV >)dr::mp::dv_segment_reference< DV >inline
value_type typedef (defined in dr::mp::dv_segment_reference< DV >)dr::mp::dv_segment_reference< DV >
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1dv__segment__reference.html b/doxygen/classdr_1_1mp_1_1dv__segment__reference.html new file mode 100644 index 0000000000..8629be2142 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1dv__segment__reference.html @@ -0,0 +1,117 @@ + + + + + + + +Distributed Ranges: dr::mp::dv_segment_reference< DV > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mp::dv_segment_reference< DV > Class Template Reference
+
+
+ + + + +

+Public Types

+using value_type = typename DV::value_type
 
+ + + + + + + + + + + +

+Public Member Functions

dv_segment_reference (const iterator it)
 
operator value_type () const
 
+auto operator= (const value_type &value) const
 
+auto operator= (const dv_segment_reference &other) const
 
+auto operator& () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1halo__impl-members.html b/doxygen/classdr_1_1mp_1_1halo__impl-members.html new file mode 100644 index 0000000000..a9e1ca0c31 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1halo__impl-members.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::halo_impl< Group > Member List
+
+
+ +

This is the complete list of members for dr::mp::halo_impl< Group >, including all inherited members.

+ + + + + + + + + + + + + + + + + +
exchange() (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >inline
exchange_begin()dr::mp::halo_impl< Group >inline
exchange_finalize()dr::mp::halo_impl< Group >inline
group_type typedef (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
halo_impl(const halo_impl &)=delete (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
halo_impl(communicator comm, const std::vector< Group > &owned_groups, const std::vector< Group > &halo_groups, const Memory &memory=Memory())dr::mp::halo_impl< Group >inline
max (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
min (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
multiplies (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
operator=(const halo_impl &)=delete (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
plus (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
reduce_begin()dr::mp::halo_impl< Group >inline
reduce_finalize(const auto &op)dr::mp::halo_impl< Group >inline
reduce_finalize()dr::mp::halo_impl< Group >inline
second (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
~halo_impl() (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1halo__impl.html b/doxygen/classdr_1_1mp_1_1halo__impl.html new file mode 100644 index 0000000000..74962cf46d --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1halo__impl.html @@ -0,0 +1,191 @@ + + + + + + + +Distributed Ranges: dr::mp::halo_impl< Group > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Public Types | +Public Member Functions | +Public Attributes | +List of all members
+
dr::mp::halo_impl< Group > Class Template Reference
+
+
+
+Inheritance diagram for dr::mp::halo_impl< Group >:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for dr::mp::halo_impl< Group >:
+
+
Collaboration graph
+ + + + + + + + +
[legend]
+ + + + + + + + + + + + +

+Classes

struct  max_op
 
struct  min_op
 
struct  multiplies_op
 
struct  plus_op
 
struct  second_op
 
+ + + +

+Public Types

+using group_type = Group
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

halo_impl (const halo_impl &)=delete
 
+halo_impl operator= (const halo_impl &)=delete
 
halo_impl (communicator comm, const std::vector< Group > &owned_groups, const std::vector< Group > &halo_groups, const Memory &memory=Memory())
 halo constructor
 
+void exchange_begin ()
 Begin a halo exchange.
 
+void exchange_finalize ()
 Complete a halo exchange.
 
+void exchange ()
 
+void reduce_begin ()
 Begin a halo reduction.
 
+void reduce_finalize (const auto &op)
 Complete a halo reduction.
 
+void reduce_finalize ()
 Complete a halo reduction.
 
+ + + + + + + + + + + +

+Public Attributes

+struct dr::mp::halo_impl::second_op second
 
+struct dr::mp::halo_impl::plus_op plus
 
+struct dr::mp::halo_impl::max_op max
 
+struct dr::mp::halo_impl::min_op min
 
+struct dr::mp::halo_impl::multiplies_op multiplies
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1halo__impl__coll__graph.map b/doxygen/classdr_1_1mp_1_1halo__impl__coll__graph.map new file mode 100644 index 0000000000..d773bc0730 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1halo__impl__coll__graph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doxygen/classdr_1_1mp_1_1halo__impl__coll__graph.md5 b/doxygen/classdr_1_1mp_1_1halo__impl__coll__graph.md5 new file mode 100644 index 0000000000..cbe7b1b01c --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1halo__impl__coll__graph.md5 @@ -0,0 +1 @@ +2ee58bbc898005fc1a70ce693827e189 \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1halo__impl__coll__graph.png b/doxygen/classdr_1_1mp_1_1halo__impl__coll__graph.png new file mode 100644 index 0000000000..60db6ae7b4 Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1halo__impl__coll__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1halo__impl__inherit__graph.map b/doxygen/classdr_1_1mp_1_1halo__impl__inherit__graph.map new file mode 100644 index 0000000000..9de4caf406 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1halo__impl__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/classdr_1_1mp_1_1halo__impl__inherit__graph.md5 b/doxygen/classdr_1_1mp_1_1halo__impl__inherit__graph.md5 new file mode 100644 index 0000000000..afc06f3f82 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1halo__impl__inherit__graph.md5 @@ -0,0 +1 @@ +e35e7c2544c61c8c3e20c6b5437f7812 \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1halo__impl__inherit__graph.png b/doxygen/classdr_1_1mp_1_1halo__impl__inherit__graph.png new file mode 100644 index 0000000000..0966f0767f Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1halo__impl__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1index__group-members.html b/doxygen/classdr_1_1mp_1_1index__group-members.html new file mode 100644 index 0000000000..2aa517388b --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1index__group-members.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::index_group< T, Memory > Member List
+
+
+ +

This is the complete list of members for dr::mp::index_group< T, Memory >, including all inherited members.

+ + + + + + + + + + + + + + + + + +
buffer (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >
buffer_size() (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >inline
buffered (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >
data_pointer() (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >inline
data_size() (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >inline
element_type typedef (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >
index_group(T *data, std::size_t rank, const std::vector< std::size_t > &indices, const Memory &memory)dr::mp::index_group< T, Memory >inline
index_group(const index_group &o) (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >inline
memory_type typedef (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >
pack() (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >inline
rank() (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >inline
receive (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >
request_index (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >
tag() (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >inline
unpack(const auto &op) (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >inline
~index_group() (defined in dr::mp::index_group< T, Memory >)dr::mp::index_group< T, Memory >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1index__group.html b/doxygen/classdr_1_1mp_1_1index__group.html new file mode 100644 index 0000000000..85d8a78229 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1index__group.html @@ -0,0 +1,149 @@ + + + + + + + +Distributed Ranges: dr::mp::index_group< T, Memory > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Public Attributes | +List of all members
+
dr::mp::index_group< T, Memory > Class Template Reference
+
+
+ + + + + + +

+Public Types

+using element_type = T
 
+using memory_type = Memory
 
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

index_group (T *data, std::size_t rank, const std::vector< std::size_t > &indices, const Memory &memory)
 Constructor.
 
index_group (const index_group &o)
 
+void unpack (const auto &op)
 
+void pack ()
 
+std::size_t buffer_size ()
 
+T * data_pointer ()
 
+std::size_t data_size ()
 
+std::size_t rank ()
 
+auto tag ()
 
+ + + + + + + + + +

+Public Attributes

+T * buffer = nullptr
 
+std::size_t request_index
 
+bool receive
 
+bool buffered
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1segmented__view-members.html b/doxygen/classdr_1_1mp_1_1segmented__view-members.html new file mode 100644 index 0000000000..7710b50042 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1segmented__view-members.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::segmented_view< R, SegTpl > Member List
+
+
+ +

This is the complete list of members for dr::mp::segmented_view< R, SegTpl >, including all inherited members.

+ + + + + +
begin() const (defined in dr::mp::segmented_view< R, SegTpl >)dr::mp::segmented_view< R, SegTpl >inline
end() const (defined in dr::mp::segmented_view< R, SegTpl >)dr::mp::segmented_view< R, SegTpl >inline
segmented_view(V1 &&r, V2 &&tpl) (defined in dr::mp::segmented_view< R, SegTpl >)dr::mp::segmented_view< R, SegTpl >inline
size() const (defined in dr::mp::segmented_view< R, SegTpl >)dr::mp::segmented_view< R, SegTpl >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1segmented__view.html b/doxygen/classdr_1_1mp_1_1segmented__view.html new file mode 100644 index 0000000000..2cea8b942b --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1segmented__view.html @@ -0,0 +1,126 @@ + + + + + + + +Distributed Ranges: dr::mp::segmented_view< R, SegTpl > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mp::segmented_view< R, SegTpl > Class Template Reference
+
+
+
+Inheritance diagram for dr::mp::segmented_view< R, SegTpl >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::mp::segmented_view< R, SegTpl >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + +

+Public Member Functions

+template<typename V1 , typename V2 >
 segmented_view (V1 &&r, V2 &&tpl)
 
+auto begin () const
 
+auto end () const
 
+auto size () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1segmented__view__coll__graph.map b/doxygen/classdr_1_1mp_1_1segmented__view__coll__graph.map new file mode 100644 index 0000000000..4867a10a10 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1segmented__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mp_1_1segmented__view__coll__graph.md5 b/doxygen/classdr_1_1mp_1_1segmented__view__coll__graph.md5 new file mode 100644 index 0000000000..df2d1d2476 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1segmented__view__coll__graph.md5 @@ -0,0 +1 @@ +686ade089aad85588bcced2fdf0560e9 \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1segmented__view__coll__graph.png b/doxygen/classdr_1_1mp_1_1segmented__view__coll__graph.png new file mode 100644 index 0000000000..fc2745aca4 Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1segmented__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1segmented__view__inherit__graph.map b/doxygen/classdr_1_1mp_1_1segmented__view__inherit__graph.map new file mode 100644 index 0000000000..4867a10a10 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1segmented__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mp_1_1segmented__view__inherit__graph.md5 b/doxygen/classdr_1_1mp_1_1segmented__view__inherit__graph.md5 new file mode 100644 index 0000000000..df2d1d2476 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1segmented__view__inherit__graph.md5 @@ -0,0 +1 @@ +686ade089aad85588bcced2fdf0560e9 \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1segmented__view__inherit__graph.png b/doxygen/classdr_1_1mp_1_1segmented__view__inherit__graph.png new file mode 100644 index 0000000000..fc2745aca4 Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1segmented__view__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1segmented__view__iterator-members.html b/doxygen/classdr_1_1mp_1_1segmented__view__iterator-members.html new file mode 100644 index 0000000000..e0a8996e04 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1segmented__view__iterator-members.html @@ -0,0 +1,97 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel > Member List
+
+
+ +

This is the complete list of members for dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >, including all inherited members.

+ + + + + + + + + + +
difference_type typedef (defined in dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >
iterator_category typedef (defined in dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >
operator*() const (defined in dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >inline
operator++() (defined in dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >inline
operator++(int) (defined in dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >inline
operator==(segmented_view_iterator other) const (defined in dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >inline
segmented_view_iterator() (defined in dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >inline
segmented_view_iterator(BaseIter base_begin, SegTplIter tpl_begin, SegTplSentinel tpl_end) (defined in dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >inline
value_type typedef (defined in dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1segmented__view__iterator.html b/doxygen/classdr_1_1mp_1_1segmented__view__iterator.html new file mode 100644 index 0000000000..7c8571eb1d --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1segmented__view__iterator.html @@ -0,0 +1,123 @@ + + + + + + + +Distributed Ranges: dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel > Class Template Reference
+
+
+ + + + + + + + +

+Public Types

+using iterator_category = std::forward_iterator_tag
 
+using difference_type = rng::iter_difference_t< SegTplIter >
 
+using value_type = dr::remote_subrange< BaseIter >
 
+ + + + + + + + + + + +

+Public Member Functions

segmented_view_iterator (BaseIter base_begin, SegTplIter tpl_begin, SegTplSentinel tpl_end)
 
+auto operator== (segmented_view_iterator other) const
 
+auto & operator++ ()
 
+auto operator++ (int)
 
+auto operator* () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1span__group-members.html b/doxygen/classdr_1_1mp_1_1span__group-members.html new file mode 100644 index 0000000000..8d4185b3ae --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1span__group-members.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::span_group< T, Memory > Member List
+
+
+ +

This is the complete list of members for dr::mp::span_group< T, Memory >, including all inherited members.

+ + + + + + + + + + + + + + + +
buffer (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >
buffer_size() (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >inline
buffered (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >
data_pointer() (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >inline
data_size() (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >inline
element_type typedef (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >
memory_type typedef (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >
pack() (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >inline
rank() (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >inline
receive (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >
request_index (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >
span_group(std::span< T > data, std::size_t rank, halo_tag tag) (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >inline
tag() (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >inline
unpack() (defined in dr::mp::span_group< T, Memory >)dr::mp::span_group< T, Memory >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1span__group.html b/doxygen/classdr_1_1mp_1_1span__group.html new file mode 100644 index 0000000000..6dcc35013b --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1span__group.html @@ -0,0 +1,145 @@ + + + + + + + +Distributed Ranges: dr::mp::span_group< T, Memory > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Public Attributes | +List of all members
+
dr::mp::span_group< T, Memory > Class Template Reference
+
+
+ + + + + + +

+Public Types

+using element_type = T
 
+using memory_type = Memory
 
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

span_group (std::span< T > data, std::size_t rank, halo_tag tag)
 
+void unpack ()
 
+void pack ()
 
+std::size_t buffer_size ()
 
+std::size_t data_size ()
 
+T * data_pointer ()
 
+std::size_t rank ()
 
+auto tag ()
 
+ + + + + + + + + +

+Public Attributes

+T * buffer = nullptr
 
+std::size_t request_index = 0
 
+bool receive = false
 
+bool buffered = false
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1span__halo-members.html b/doxygen/classdr_1_1mp_1_1span__halo-members.html new file mode 100644 index 0000000000..a684f1b09f --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1span__halo-members.html @@ -0,0 +1,107 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::span_halo< T, Memory > Member List
+
+
+ +

This is the complete list of members for dr::mp::span_halo< T, Memory >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
exchange() (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >inline
exchange_begin()dr::mp::halo_impl< Group >inline
exchange_finalize()dr::mp::halo_impl< Group >inline
group_type typedef (defined in dr::mp::span_halo< T, Memory >)dr::mp::span_halo< T, Memory >
halo_impl(const halo_impl &)=delete (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
halo_impl(communicator comm, const std::vector< Group > &owned_groups, const std::vector< Group > &halo_groups, const Memory &memory=Memory())dr::mp::halo_impl< Group >inline
max (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
min (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
multiplies (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
operator=(const halo_impl &)=delete (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
plus (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
reduce_begin()dr::mp::halo_impl< Group >inline
reduce_finalize(const auto &op)dr::mp::halo_impl< Group >inline
reduce_finalize()dr::mp::halo_impl< Group >inline
second (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
span_halo() (defined in dr::mp::span_halo< T, Memory >)dr::mp::span_halo< T, Memory >inline
span_halo(communicator comm, T *data, std::size_t size, halo_bounds hb) (defined in dr::mp::span_halo< T, Memory >)dr::mp::span_halo< T, Memory >inline
span_halo(communicator comm, std::span< T > span, halo_bounds hb) (defined in dr::mp::span_halo< T, Memory >)dr::mp::span_halo< T, Memory >inline
~halo_impl() (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1span__halo.html b/doxygen/classdr_1_1mp_1_1span__halo.html new file mode 100644 index 0000000000..4fe793231c --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1span__halo.html @@ -0,0 +1,188 @@ + + + + + + + +Distributed Ranges: dr::mp::span_halo< T, Memory > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mp::span_halo< T, Memory > Class Template Reference
+
+
+
+Inheritance diagram for dr::mp::span_halo< T, Memory >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::mp::span_halo< T, Memory >:
+
+
Collaboration graph
+ + + + + + + + + +
[legend]
+ + + + + + + +

+Public Types

+using group_type = span_group< T, Memory >
 
- Public Types inherited from dr::mp::halo_impl< Group >
+using group_type = Group
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

span_halo (communicator comm, T *data, std::size_t size, halo_bounds hb)
 
span_halo (communicator comm, std::span< T > span, halo_bounds hb)
 
- Public Member Functions inherited from dr::mp::halo_impl< Group >
halo_impl (const halo_impl &)=delete
 
+halo_impl operator= (const halo_impl &)=delete
 
halo_impl (communicator comm, const std::vector< Group > &owned_groups, const std::vector< Group > &halo_groups, const Memory &memory=Memory())
 halo constructor
 
+void exchange_begin ()
 Begin a halo exchange.
 
+void exchange_finalize ()
 Complete a halo exchange.
 
+void exchange ()
 
+void reduce_begin ()
 Begin a halo reduction.
 
+void reduce_finalize (const auto &op)
 Complete a halo reduction.
 
+void reduce_finalize ()
 Complete a halo reduction.
 
+ + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from dr::mp::halo_impl< Group >
+struct dr::mp::halo_impl::second_op second
 
+struct dr::mp::halo_impl::plus_op plus
 
+struct dr::mp::halo_impl::max_op max
 
+struct dr::mp::halo_impl::min_op min
 
+struct dr::mp::halo_impl::multiplies_op multiplies
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1span__halo__coll__graph.map b/doxygen/classdr_1_1mp_1_1span__halo__coll__graph.map new file mode 100644 index 0000000000..b6abf90739 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1span__halo__coll__graph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doxygen/classdr_1_1mp_1_1span__halo__coll__graph.md5 b/doxygen/classdr_1_1mp_1_1span__halo__coll__graph.md5 new file mode 100644 index 0000000000..845bb0bc03 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1span__halo__coll__graph.md5 @@ -0,0 +1 @@ +2d937a4a14a2899f3fbd02508b45e8b4 \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1span__halo__coll__graph.png b/doxygen/classdr_1_1mp_1_1span__halo__coll__graph.png new file mode 100644 index 0000000000..8e3f5559ff Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1span__halo__coll__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1span__halo__inherit__graph.map b/doxygen/classdr_1_1mp_1_1span__halo__inherit__graph.map new file mode 100644 index 0000000000..a949066414 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1span__halo__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mp_1_1span__halo__inherit__graph.md5 b/doxygen/classdr_1_1mp_1_1span__halo__inherit__graph.md5 new file mode 100644 index 0000000000..f2ac4a367f --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1span__halo__inherit__graph.md5 @@ -0,0 +1 @@ +e191ca51ccc1ede2129eb9b4b7bdbce4 \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1span__halo__inherit__graph.png b/doxygen/classdr_1_1mp_1_1span__halo__inherit__graph.png new file mode 100644 index 0000000000..923eca5191 Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1span__halo__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1subrange-members.html b/doxygen/classdr_1_1mp_1_1subrange-members.html new file mode 100644 index 0000000000..e9ca1662ab --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1subrange-members.html @@ -0,0 +1,96 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::subrange< DM > Member List
+
+
+ +

This is the complete list of members for dr::mp::subrange< DM >, including all inherited members.

+ + + + + + + + + +
begin() const (defined in dr::mp::subrange< DM >)dr::mp::subrange< DM >inline
end() const (defined in dr::mp::subrange< DM >)dr::mp::subrange< DM >inline
halo() const (defined in dr::mp::subrange< DM >)dr::mp::subrange< DM >inline
iterator typedef (defined in dr::mp::subrange< DM >)dr::mp::subrange< DM >
segments() const (defined in dr::mp::subrange< DM >)dr::mp::subrange< DM >inline
size() (defined in dr::mp::subrange< DM >)dr::mp::subrange< DM >inline
subrange(DM &dm, std::pair< std::size_t, std::size_t > row_rng, std::pair< std::size_t, std::size_t > col_rng) (defined in dr::mp::subrange< DM >)dr::mp::subrange< DM >inline
value_type typedef (defined in dr::mp::subrange< DM >)dr::mp::subrange< DM >
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1subrange.html b/doxygen/classdr_1_1mp_1_1subrange.html new file mode 100644 index 0000000000..f7534f078f --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1subrange.html @@ -0,0 +1,141 @@ + + + + + + + +Distributed Ranges: dr::mp::subrange< DM > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mp::subrange< DM > Class Template Reference
+
+
+
+Inheritance diagram for dr::mp::subrange< DM >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::mp::subrange< DM >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + +

+Public Types

+using iterator = subrange_iterator< DM >
 
+using value_type = typename DM::value_type
 
+ + + + + + + + + + + + + +

+Public Member Functions

subrange (DM &dm, std::pair< std::size_t, std::size_t > row_rng, std::pair< std::size_t, std::size_t > col_rng)
 
+iterator begin () const
 
+iterator end () const
 
+auto size ()
 
+auto & halo () const
 
+auto segments () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1subrange__coll__graph.map b/doxygen/classdr_1_1mp_1_1subrange__coll__graph.map new file mode 100644 index 0000000000..675f21b645 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1subrange__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mp_1_1subrange__coll__graph.md5 b/doxygen/classdr_1_1mp_1_1subrange__coll__graph.md5 new file mode 100644 index 0000000000..00f0da0fd9 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1subrange__coll__graph.md5 @@ -0,0 +1 @@ +ca2bf6c4967947da75a33e5bc0ee9c63 \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1subrange__coll__graph.png b/doxygen/classdr_1_1mp_1_1subrange__coll__graph.png new file mode 100644 index 0000000000..2f26e8cc6d Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1subrange__coll__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1subrange__inherit__graph.map b/doxygen/classdr_1_1mp_1_1subrange__inherit__graph.map new file mode 100644 index 0000000000..675f21b645 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1subrange__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mp_1_1subrange__inherit__graph.md5 b/doxygen/classdr_1_1mp_1_1subrange__inherit__graph.md5 new file mode 100644 index 0000000000..00f0da0fd9 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1subrange__inherit__graph.md5 @@ -0,0 +1 @@ +ca2bf6c4967947da75a33e5bc0ee9c63 \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1subrange__inherit__graph.png b/doxygen/classdr_1_1mp_1_1subrange__inherit__graph.png new file mode 100644 index 0000000000..2f26e8cc6d Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1subrange__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1subrange__iterator-members.html b/doxygen/classdr_1_1mp_1_1subrange__iterator-members.html new file mode 100644 index 0000000000..dc4d2de804 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1subrange__iterator-members.html @@ -0,0 +1,114 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::subrange_iterator< DM > Member List
+
+
+ +

This is the complete list of members for dr::mp::subrange_iterator< DM >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
difference_type typedef (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >
find_dm_offset() const (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
halo() (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
is_local() (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator!= (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >friend
operator!= (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >friend
operator*() const (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator+(difference_type n) const (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator+ (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >friend
operator++() (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator++(int) (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator+=(difference_type n) (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator-(const subrange_iterator &other) const noexcept (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator-(difference_type n) const (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator--() (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator--(int) (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator-=(difference_type n) (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator<=>(const subrange_iterator &other) const noexcept (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator== (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >friend
operator== (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >friend
operator[](int n) (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
operator[](std::pair< int, int > p) (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
segments() (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
subrange_iterator() (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
subrange_iterator(DM *dm, std::pair< std::size_t, std::size_t > row_rng, std::pair< std::size_t, std::size_t > col_rng, difference_type index=0) noexcept (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >inline
value_type typedef (defined in dr::mp::subrange_iterator< DM >)dr::mp::subrange_iterator< DM >
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1subrange__iterator.html b/doxygen/classdr_1_1mp_1_1subrange__iterator.html new file mode 100644 index 0000000000..d9b3bd162c --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1subrange__iterator.html @@ -0,0 +1,178 @@ + + + + + + + +Distributed Ranges: dr::mp::subrange_iterator< DM > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Friends | +List of all members
+
dr::mp::subrange_iterator< DM > Class Template Reference
+
+
+ + + + + + +

+Public Types

+using value_type = typename DM::value_type
 
+using difference_type = typename DM::difference_type
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

subrange_iterator (DM *dm, std::pair< std::size_t, std::size_t > row_rng, std::pair< std::size_t, std::size_t > col_rng, difference_type index=0) noexcept
 
+value_type & operator* () const
 
+dm_row< value_type > operator[] (int n)
 
+value_type & operator[] (std::pair< int, int > p)
 
+auto operator<=> (const subrange_iterator &other) const noexcept
 
+auto & operator-= (difference_type n)
 
+auto & operator+= (difference_type n)
 
+difference_type operator- (const subrange_iterator &other) const noexcept
 
+auto & operator++ ()
 
+auto & operator-- ()
 
+auto operator++ (int)
 
+auto operator-- (int)
 
+auto operator+ (difference_type n) const
 
+auto operator- (difference_type n) const
 
+auto & halo ()
 
+auto segments ()
 
+bool is_local ()
 
+std::size_t find_dm_offset () const
 
+ + + + + + + + + + + +

+Friends

+bool operator== (subrange_iterator &first, subrange_iterator &second)
 
+bool operator!= (subrange_iterator &first, subrange_iterator &second)
 
+bool operator== (subrange_iterator first, subrange_iterator second)
 
+bool operator!= (subrange_iterator first, subrange_iterator second)
 
+auto operator+ (difference_type n, const subrange_iterator &other)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1unstructured__halo-members.html b/doxygen/classdr_1_1mp_1_1unstructured__halo-members.html new file mode 100644 index 0000000000..c9fdbac5b2 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1unstructured__halo-members.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::unstructured_halo< T, Memory > Member List
+
+
+ +

This is the complete list of members for dr::mp::unstructured_halo< T, Memory >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + +
exchange() (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >inline
exchange_begin()dr::mp::halo_impl< Group >inline
exchange_finalize()dr::mp::halo_impl< Group >inline
group_type typedef (defined in dr::mp::unstructured_halo< T, Memory >)dr::mp::unstructured_halo< T, Memory >
halo_impl(const halo_impl &)=delete (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
halo_impl(communicator comm, const std::vector< Group > &owned_groups, const std::vector< Group > &halo_groups, const Memory &memory=Memory())dr::mp::halo_impl< Group >inline
index_map typedef (defined in dr::mp::unstructured_halo< T, Memory >)dr::mp::unstructured_halo< T, Memory >
max (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
min (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
multiplies (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
operator=(const halo_impl &)=delete (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
plus (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
reduce_begin()dr::mp::halo_impl< Group >inline
reduce_finalize(const auto &op)dr::mp::halo_impl< Group >inline
reduce_finalize()dr::mp::halo_impl< Group >inline
second (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >
unstructured_halo(communicator comm, T *data, const std::vector< index_map > &owned, const std::vector< index_map > &halo, const Memory &memory=Memory())dr::mp::unstructured_halo< T, Memory >inline
~halo_impl() (defined in dr::mp::halo_impl< Group >)dr::mp::halo_impl< Group >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1unstructured__halo.html b/doxygen/classdr_1_1mp_1_1unstructured__halo.html new file mode 100644 index 0000000000..3863b0b73b --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1unstructured__halo.html @@ -0,0 +1,245 @@ + + + + + + + +Distributed Ranges: dr::mp::unstructured_halo< T, Memory > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mp::unstructured_halo< T, Memory > Class Template Reference
+
+
+
+Inheritance diagram for dr::mp::unstructured_halo< T, Memory >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::mp::unstructured_halo< T, Memory >:
+
+
Collaboration graph
+ + + + + + + + + +
[legend]
+ + + + + + + + + +

+Public Types

+using group_type = index_group< T, Memory >
 
+using index_map = std::pair< std::size_t, std::vector< std::size_t > >
 
- Public Types inherited from dr::mp::halo_impl< Group >
+using group_type = Group
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 unstructured_halo (communicator comm, T *data, const std::vector< index_map > &owned, const std::vector< index_map > &halo, const Memory &memory=Memory())
 
- Public Member Functions inherited from dr::mp::halo_impl< Group >
halo_impl (const halo_impl &)=delete
 
+halo_impl operator= (const halo_impl &)=delete
 
halo_impl (communicator comm, const std::vector< Group > &owned_groups, const std::vector< Group > &halo_groups, const Memory &memory=Memory())
 halo constructor
 
+void exchange_begin ()
 Begin a halo exchange.
 
+void exchange_finalize ()
 Complete a halo exchange.
 
+void exchange ()
 
+void reduce_begin ()
 Begin a halo reduction.
 
+void reduce_finalize (const auto &op)
 Complete a halo reduction.
 
+void reduce_finalize ()
 Complete a halo reduction.
 
+ + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from dr::mp::halo_impl< Group >
+struct dr::mp::halo_impl::second_op second
 
+struct dr::mp::halo_impl::plus_op plus
 
+struct dr::mp::halo_impl::max_op max
 
+struct dr::mp::halo_impl::min_op min
 
+struct dr::mp::halo_impl::multiplies_op multiplies
 
+

Constructor & Destructor Documentation

+ +

◆ unstructured_halo()

+ +
+
+
+template<typename T , typename Memory = default_memory<T>>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dr::mp::unstructured_halo< T, Memory >::unstructured_halo (communicator comm,
T * data,
const std::vector< index_map > & owned,
const std::vector< index_map > & halo,
const Memory & memory = Memory() 
)
+
+inline
+
+

Constructor

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1unstructured__halo__coll__graph.map b/doxygen/classdr_1_1mp_1_1unstructured__halo__coll__graph.map new file mode 100644 index 0000000000..a16386e608 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1unstructured__halo__coll__graph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doxygen/classdr_1_1mp_1_1unstructured__halo__coll__graph.md5 b/doxygen/classdr_1_1mp_1_1unstructured__halo__coll__graph.md5 new file mode 100644 index 0000000000..2ad17e6bea --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1unstructured__halo__coll__graph.md5 @@ -0,0 +1 @@ +01006e6dc3c5e33fed009d8dc94f8f31 \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1unstructured__halo__coll__graph.png b/doxygen/classdr_1_1mp_1_1unstructured__halo__coll__graph.png new file mode 100644 index 0000000000..d8351a44cf Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1unstructured__halo__coll__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1unstructured__halo__inherit__graph.map b/doxygen/classdr_1_1mp_1_1unstructured__halo__inherit__graph.map new file mode 100644 index 0000000000..331a3da170 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1unstructured__halo__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mp_1_1unstructured__halo__inherit__graph.md5 b/doxygen/classdr_1_1mp_1_1unstructured__halo__inherit__graph.md5 new file mode 100644 index 0000000000..624ccf6694 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1unstructured__halo__inherit__graph.md5 @@ -0,0 +1 @@ +9118bfec060224283f3f38383b3c1acc \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1unstructured__halo__inherit__graph.png b/doxygen/classdr_1_1mp_1_1unstructured__halo__inherit__graph.png new file mode 100644 index 0000000000..cd95c5f1a6 Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1unstructured__halo__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1views_1_1enumerate__adapter__closure-members.html b/doxygen/classdr_1_1mp_1_1views_1_1enumerate__adapter__closure-members.html new file mode 100644 index 0000000000..4fb3097f8a --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1views_1_1enumerate__adapter__closure-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::views::enumerate_adapter_closure Member List
+
+
+ +

This is the complete list of members for dr::mp::views::enumerate_adapter_closure, including all inherited members.

+ + + +
operator()(R &&r) const (defined in dr::mp::views::enumerate_adapter_closure)dr::mp::views::enumerate_adapter_closureinline
operator| (defined in dr::mp::views::enumerate_adapter_closure)dr::mp::views::enumerate_adapter_closurefriend
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1views_1_1enumerate__adapter__closure.html b/doxygen/classdr_1_1mp_1_1views_1_1enumerate__adapter__closure.html new file mode 100644 index 0000000000..cbfb82c8c8 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1views_1_1enumerate__adapter__closure.html @@ -0,0 +1,108 @@ + + + + + + + +Distributed Ranges: dr::mp::views::enumerate_adapter_closure Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Friends | +List of all members
+
dr::mp::views::enumerate_adapter_closure Class Reference
+
+
+ + + + + +

+Public Member Functions

+template<rng::viewable_range R>
+requires (rng::sized_range<R>)
auto operator() (R &&r) const
 
+ + + + +

+Friends

+template<rng::viewable_range R>
auto operator| (R &&r, const enumerate_adapter_closure &closure)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1views_1_1enumerate__fn__-members.html b/doxygen/classdr_1_1mp_1_1views_1_1enumerate__fn__-members.html new file mode 100644 index 0000000000..fb5f9acf79 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1views_1_1enumerate__fn__-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::views::enumerate_fn_ Member List
+
+
+ +

This is the complete list of members for dr::mp::views::enumerate_fn_, including all inherited members.

+ + + +
enumerate() const (defined in dr::mp::views::enumerate_fn_)dr::mp::views::enumerate_fn_inline
operator()(R &&r) const (defined in dr::mp::views::enumerate_fn_)dr::mp::views::enumerate_fn_inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1views_1_1enumerate__fn__.html b/doxygen/classdr_1_1mp_1_1views_1_1enumerate__fn__.html new file mode 100644 index 0000000000..7201fc0807 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1views_1_1enumerate__fn__.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: dr::mp::views::enumerate_fn_ Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mp::views::enumerate_fn_ Class Reference
+
+
+ + + + + + + +

+Public Member Functions

+template<rng::viewable_range R>
constexpr auto operator() (R &&r) const
 
+auto enumerate () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1views_1_1mdspan__adapter__closure-members.html b/doxygen/classdr_1_1mp_1_1views_1_1mdspan__adapter__closure-members.html new file mode 100644 index 0000000000..6a4aa7079c --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1views_1_1mdspan__adapter__closure-members.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::views::mdspan_adapter_closure< Rank > Member List
+
+
+ +

This is the complete list of members for dr::mp::views::mdspan_adapter_closure< Rank >, including all inherited members.

+ + + + + +
mdspan_adapter_closure(dr::__detail::dr_extents< Rank > full_shape, dr::__detail::dr_extents< Rank > tile_shape) (defined in dr::mp::views::mdspan_adapter_closure< Rank >)dr::mp::views::mdspan_adapter_closure< Rank >inline
mdspan_adapter_closure(dr::__detail::dr_extents< Rank > full_shape) (defined in dr::mp::views::mdspan_adapter_closure< Rank >)dr::mp::views::mdspan_adapter_closure< Rank >inline
operator()(R &&r) const (defined in dr::mp::views::mdspan_adapter_closure< Rank >)dr::mp::views::mdspan_adapter_closure< Rank >inline
operator| (defined in dr::mp::views::mdspan_adapter_closure< Rank >)dr::mp::views::mdspan_adapter_closure< Rank >friend
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1views_1_1mdspan__adapter__closure.html b/doxygen/classdr_1_1mp_1_1views_1_1mdspan__adapter__closure.html new file mode 100644 index 0000000000..bf9fb2c7f6 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1views_1_1mdspan__adapter__closure.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: dr::mp::views::mdspan_adapter_closure< Rank > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Friends | +List of all members
+
dr::mp::views::mdspan_adapter_closure< Rank > Class Template Reference
+
+
+ + + + + + + + + +

+Public Member Functions

mdspan_adapter_closure (dr::__detail::dr_extents< Rank > full_shape, dr::__detail::dr_extents< Rank > tile_shape)
 
mdspan_adapter_closure (dr::__detail::dr_extents< Rank > full_shape)
 
+template<rng::viewable_range R>
auto operator() (R &&r) const
 
+ + + + +

+Friends

+template<rng::viewable_range R>
auto operator| (R &&r, const mdspan_adapter_closure &closure)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1views_1_1mdspan__fn__-members.html b/doxygen/classdr_1_1mp_1_1views_1_1mdspan__fn__-members.html new file mode 100644 index 0000000000..9c070211ad --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1views_1_1mdspan__fn__-members.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::views::mdspan_fn_ Member List
+
+
+ +

This is the complete list of members for dr::mp::views::mdspan_fn_, including all inherited members.

+ + + + + +
operator()(R &&r, Shape &&full_shape, Shape &&tile_shape) const (defined in dr::mp::views::mdspan_fn_)dr::mp::views::mdspan_fn_inline
operator()(R &&r, Shape &&full_shape) const (defined in dr::mp::views::mdspan_fn_)dr::mp::views::mdspan_fn_inline
operator()(Shape &&full_shape, Shape &&tile_shape) const (defined in dr::mp::views::mdspan_fn_)dr::mp::views::mdspan_fn_inline
operator()(Shape &&full_shape) const (defined in dr::mp::views::mdspan_fn_)dr::mp::views::mdspan_fn_inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1views_1_1mdspan__fn__.html b/doxygen/classdr_1_1mp_1_1views_1_1mdspan__fn__.html new file mode 100644 index 0000000000..35da6e6108 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1views_1_1mdspan__fn__.html @@ -0,0 +1,111 @@ + + + + + + + +Distributed Ranges: dr::mp::views::mdspan_fn_ Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mp::views::mdspan_fn_ Class Reference
+
+
+ + + + + + + + + + + + + + +

+Public Member Functions

+template<rng::viewable_range R, typename Shape >
auto operator() (R &&r, Shape &&full_shape, Shape &&tile_shape) const
 
+template<rng::viewable_range R, typename Shape >
auto operator() (R &&r, Shape &&full_shape) const
 
+template<typename Shape >
auto operator() (Shape &&full_shape, Shape &&tile_shape) const
 
+template<typename Shape >
auto operator() (Shape &&full_shape) const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1views_1_1submdspan__adapter__closure-members.html b/doxygen/classdr_1_1mp_1_1views_1_1submdspan__adapter__closure-members.html new file mode 100644 index 0000000000..327fb49c47 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1views_1_1submdspan__adapter__closure-members.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::views::submdspan_adapter_closure< Extents > Member List
+
+
+ +

This is the complete list of members for dr::mp::views::submdspan_adapter_closure< Extents >, including all inherited members.

+ + + + +
operator()(R &&r) const (defined in dr::mp::views::submdspan_adapter_closure< Extents >)dr::mp::views::submdspan_adapter_closure< Extents >inline
operator| (defined in dr::mp::views::submdspan_adapter_closure< Extents >)dr::mp::views::submdspan_adapter_closure< Extents >friend
submdspan_adapter_closure(Extents slice_starts, Extents slice_ends) (defined in dr::mp::views::submdspan_adapter_closure< Extents >)dr::mp::views::submdspan_adapter_closure< Extents >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1views_1_1submdspan__adapter__closure.html b/doxygen/classdr_1_1mp_1_1views_1_1submdspan__adapter__closure.html new file mode 100644 index 0000000000..15390cd014 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1views_1_1submdspan__adapter__closure.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: dr::mp::views::submdspan_adapter_closure< Extents > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Friends | +List of all members
+
dr::mp::views::submdspan_adapter_closure< Extents > Class Template Reference
+
+
+ + + + + + + +

+Public Member Functions

submdspan_adapter_closure (Extents slice_starts, Extents slice_ends)
 
+template<rng::viewable_range R>
auto operator() (R &&r) const
 
+ + + + +

+Friends

+template<rng::viewable_range R>
auto operator| (R &&r, const submdspan_adapter_closure &closure)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1views_1_1submdspan__fn__-members.html b/doxygen/classdr_1_1mp_1_1views_1_1submdspan__fn__-members.html new file mode 100644 index 0000000000..d8b2f540f3 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1views_1_1submdspan__fn__-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::views::submdspan_fn_ Member List
+
+
+ +

This is the complete list of members for dr::mp::views::submdspan_fn_, including all inherited members.

+ + + +
operator()(R r, Extents &&slice_starts, Extents &&slice_ends) const (defined in dr::mp::views::submdspan_fn_)dr::mp::views::submdspan_fn_inline
operator()(Extents &&slice_starts, Extents &&slice_ends) const (defined in dr::mp::views::submdspan_fn_)dr::mp::views::submdspan_fn_inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1views_1_1submdspan__fn__.html b/doxygen/classdr_1_1mp_1_1views_1_1submdspan__fn__.html new file mode 100644 index 0000000000..8ff4eafeb3 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1views_1_1submdspan__fn__.html @@ -0,0 +1,103 @@ + + + + + + + +Distributed Ranges: dr::mp::views::submdspan_fn_ Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mp::views::submdspan_fn_ Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

+template<is_mdspan_view R, typename Extents >
auto operator() (R r, Extents &&slice_starts, Extents &&slice_ends) const
 
+template<typename Extents >
auto operator() (Extents &&slice_starts, Extents &&slice_ends) const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1zip__iterator-members.html b/doxygen/classdr_1_1mp_1_1zip__iterator-members.html new file mode 100644 index 0000000000..5f68691a2a --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1zip__iterator-members.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::zip_iterator< RngIter, BaseIters > Member List
+
+
+ +

This is the complete list of members for dr::mp::zip_iterator< RngIter, BaseIters >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + +
difference_type typedef (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >
iterator_category typedef (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >
local() const (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator*() const (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator+(difference_type n) const (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator+ (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >friend
operator++() (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator++(int) (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator+=(difference_type n) (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator-(difference_type n) const (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator-(zip_iterator other) const (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator--() (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator--(int) (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator-=(difference_type n) (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator<=>(zip_iterator other) const (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator==(zip_iterator other) const (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
operator[](difference_type n) const (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
rank() const (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
segments() const (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
value_type typedef (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >
zip_iterator() (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
zip_iterator(RngIter rng_iter, BaseIters... base_iters) (defined in dr::mp::zip_iterator< RngIter, BaseIters >)dr::mp::zip_iterator< RngIter, BaseIters >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1zip__iterator.html b/doxygen/classdr_1_1mp_1_1zip__iterator.html new file mode 100644 index 0000000000..8dda06d61a --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1zip__iterator.html @@ -0,0 +1,166 @@ + + + + + + + +Distributed Ranges: dr::mp::zip_iterator< RngIter, BaseIters > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Friends | +List of all members
+
dr::mp::zip_iterator< RngIter, BaseIters > Class Template Reference
+
+
+ + + + + + + + +

+Public Types

+using value_type = rng::iter_value_t< RngIter >
 
+using difference_type = rng::iter_difference_t< RngIter >
 
+using iterator_category = std::random_access_iterator_tag
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

zip_iterator (RngIter rng_iter, BaseIters... base_iters)
 
+auto operator+ (difference_type n) const
 
+auto operator- (difference_type n) const
 
+auto operator- (zip_iterator other) const
 
+auto & operator+= (difference_type n)
 
+auto & operator-= (difference_type n)
 
+auto & operator++ ()
 
+auto operator++ (int)
 
+auto & operator-- ()
 
+auto operator-- (int)
 
+bool operator== (zip_iterator other) const
 
+auto operator<=> (zip_iterator other) const
 
+auto operator* () const
 
+auto operator[] (difference_type n) const
 
+auto segments () const
 
+auto rank () const
 
+auto local () const
 
+ + + +

+Friends

+auto operator+ (difference_type n, const zip_iterator &other)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1zip__view-members.html b/doxygen/classdr_1_1mp_1_1zip__view-members.html new file mode 100644 index 0000000000..19e8ecc5a4 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1zip__view-members.html @@ -0,0 +1,97 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::zip_view< Rs > Member List
+
+
+ +

This is the complete list of members for dr::mp::zip_view< Rs >, including all inherited members.

+ + + + + + + + + + +
base() const (defined in dr::mp::zip_view< Rs >)dr::mp::zip_view< Rs >inline
begin() const (defined in dr::mp::zip_view< Rs >)dr::mp::zip_view< Rs >inline
end() const (defined in dr::mp::zip_view< Rs >)dr::mp::zip_view< Rs >inline
local() const (defined in dr::mp::zip_view< Rs >)dr::mp::zip_view< Rs >inline
operator[](difference_type n) const (defined in dr::mp::zip_view< Rs >)dr::mp::zip_view< Rs >inline
rank() const (defined in dr::mp::zip_view< Rs >)dr::mp::zip_view< Rs >inline
segments() const (defined in dr::mp::zip_view< Rs >)dr::mp::zip_view< Rs >inline
size() const (defined in dr::mp::zip_view< Rs >)dr::mp::zip_view< Rs >inline
zip_view(Rs... rs) (defined in dr::mp::zip_view< Rs >)dr::mp::zip_view< Rs >inline
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1zip__view.html b/doxygen/classdr_1_1mp_1_1zip__view.html new file mode 100644 index 0000000000..5a745ec866 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1zip__view.html @@ -0,0 +1,140 @@ + + + + + + + +Distributed Ranges: dr::mp::zip_view< Rs > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mp::zip_view< Rs > Class Template Reference
+
+
+
+Inheritance diagram for dr::mp::zip_view< Rs >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::mp::zip_view< Rs >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

zip_view (Rs... rs)
 
+auto begin () const
 
+auto end () const
 
+auto size () const
 
+auto operator[] (difference_type n) const
 
+auto base () const
 
+auto segments () const
 
+auto rank () const
 
+auto local () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mp_1_1zip__view__coll__graph.map b/doxygen/classdr_1_1mp_1_1zip__view__coll__graph.map new file mode 100644 index 0000000000..24394e7331 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1zip__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mp_1_1zip__view__coll__graph.md5 b/doxygen/classdr_1_1mp_1_1zip__view__coll__graph.md5 new file mode 100644 index 0000000000..5e33838057 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1zip__view__coll__graph.md5 @@ -0,0 +1 @@ +049b7a8eacc69f48357fac5562dfd0ef \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1zip__view__coll__graph.png b/doxygen/classdr_1_1mp_1_1zip__view__coll__graph.png new file mode 100644 index 0000000000..d5a0ce3aad Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1zip__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1mp_1_1zip__view__inherit__graph.map b/doxygen/classdr_1_1mp_1_1zip__view__inherit__graph.map new file mode 100644 index 0000000000..24394e7331 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1zip__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mp_1_1zip__view__inherit__graph.md5 b/doxygen/classdr_1_1mp_1_1zip__view__inherit__graph.md5 new file mode 100644 index 0000000000..5e33838057 --- /dev/null +++ b/doxygen/classdr_1_1mp_1_1zip__view__inherit__graph.md5 @@ -0,0 +1 @@ +049b7a8eacc69f48357fac5562dfd0ef \ No newline at end of file diff --git a/doxygen/classdr_1_1mp_1_1zip__view__inherit__graph.png b/doxygen/classdr_1_1mp_1_1zip__view__inherit__graph.png new file mode 100644 index 0000000000..d5a0ce3aad Binary files /dev/null and b/doxygen/classdr_1_1mp_1_1zip__view__inherit__graph.png differ diff --git a/doxygen/classdr_1_1normal__distributed__iterator__accessor-members.html b/doxygen/classdr_1_1normal__distributed__iterator__accessor-members.html new file mode 100644 index 0000000000..b74bef2e13 --- /dev/null +++ b/doxygen/classdr_1_1normal__distributed__iterator__accessor-members.html @@ -0,0 +1,108 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::normal_distributed_iterator_accessor< V > Member List
+
+
+ +

This is the complete list of members for dr::normal_distributed_iterator_accessor< V >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
difference_type typedef (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
iterator_accessor typedef (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
iterator_category typedef (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
nonconst_iterator_accessor typedef (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
normal_distributed_iterator_accessor() noexcept=default (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
normal_distributed_iterator_accessor(const normal_distributed_iterator_accessor &) noexcept=default (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
normal_distributed_iterator_accessor(V segments, size_type segment_id, size_type idx) noexcept (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >inline
operator*() const noexcept (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >inline
operator+=(difference_type offset) noexcept (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >inline
operator=(const normal_distributed_iterator_accessor &) noexcept=default (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
operator==(const iterator_accessor &other) const noexcept (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >inline
reference typedef (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
segment_type typedef (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
segments() const noexcept (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >inline
size_type typedef (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
value_type typedef (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
~normal_distributed_iterator_accessor() noexcept=default (defined in dr::normal_distributed_iterator_accessor< V >)dr::normal_distributed_iterator_accessor< V >
+ + + + diff --git a/doxygen/classdr_1_1normal__distributed__iterator__accessor.html b/doxygen/classdr_1_1normal__distributed__iterator__accessor.html new file mode 100644 index 0000000000..16bddd3bf3 --- /dev/null +++ b/doxygen/classdr_1_1normal__distributed__iterator__accessor.html @@ -0,0 +1,153 @@ + + + + + + + +Distributed Ranges: dr::normal_distributed_iterator_accessor< V > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::normal_distributed_iterator_accessor< V > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + +

+Public Types

+using value_type = rng::range_value_t< rng::range_reference_t< V > >
 
+using segment_type = rng::range_value_t< V >
 
+using size_type = rng::range_size_t< segment_type >
 
+using difference_type = rng::range_difference_t< segment_type >
 
+using reference = rng::range_reference_t< segment_type >
 
+using iterator_category = std::random_access_iterator_tag
 
+using iterator_accessor = normal_distributed_iterator_accessor
 
+using const_iterator_accessor = iterator_accessor
 
+using nonconst_iterator_accessor = iterator_accessor
 
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr normal_distributed_iterator_accessor (const normal_distributed_iterator_accessor &) noexcept=default
 
+constexpr normal_distributed_iterator_accessoroperator= (const normal_distributed_iterator_accessor &) noexcept=default
 
+constexpr normal_distributed_iterator_accessor (V segments, size_type segment_id, size_type idx) noexcept
 
+constexpr normal_distributed_iterator_accessoroperator+= (difference_type offset) noexcept
 
+constexpr bool operator== (const iterator_accessor &other) const noexcept
 
+constexpr difference_type operator- (const iterator_accessor &other) const noexcept
 
+constexpr bool operator< (const iterator_accessor &other) const noexcept
 
+constexpr reference operator* () const noexcept
 
+auto segments () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1remote__subrange-members.html b/doxygen/classdr_1_1remote__subrange-members.html new file mode 100644 index 0000000000..b79d444c3d --- /dev/null +++ b/doxygen/classdr_1_1remote__subrange-members.html @@ -0,0 +1,93 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::remote_subrange< I > Member List
+
+
+ +

This is the complete list of members for dr::remote_subrange< I >, including all inherited members.

+ + + + + + +
rank() const noexcept (defined in dr::remote_subrange< I >)dr::remote_subrange< I >inline
remote_subrange()=default (defined in dr::remote_subrange< I >)dr::remote_subrange< I >
remote_subrange(I first, I last, std::size_t rank) (defined in dr::remote_subrange< I >)dr::remote_subrange< I >inline
remote_subrange(R &&r, std::size_t rank) (defined in dr::remote_subrange< I >)dr::remote_subrange< I >inline
remote_subrange(R &&r) (defined in dr::remote_subrange< I >)dr::remote_subrange< I >inline
+ + + + diff --git a/doxygen/classdr_1_1remote__subrange.html b/doxygen/classdr_1_1remote__subrange.html new file mode 100644 index 0000000000..c577207efb --- /dev/null +++ b/doxygen/classdr_1_1remote__subrange.html @@ -0,0 +1,127 @@ + + + + + + + +Distributed Ranges: dr::remote_subrange< I > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::remote_subrange< I > Class Template Reference
+
+
+
+Inheritance diagram for dr::remote_subrange< I >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::remote_subrange< I >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + +

+Public Member Functions

+constexpr remote_subrange (I first, I last, std::size_t rank)
 
+template<rng::forward_range R>
constexpr remote_subrange (R &&r, std::size_t rank)
 
+template<dr::remote_range R>
constexpr remote_subrange (R &&r)
 
+constexpr std::size_t rank () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1remote__subrange__coll__graph.map b/doxygen/classdr_1_1remote__subrange__coll__graph.map new file mode 100644 index 0000000000..fe7563bbed --- /dev/null +++ b/doxygen/classdr_1_1remote__subrange__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1remote__subrange__coll__graph.md5 b/doxygen/classdr_1_1remote__subrange__coll__graph.md5 new file mode 100644 index 0000000000..f15229df57 --- /dev/null +++ b/doxygen/classdr_1_1remote__subrange__coll__graph.md5 @@ -0,0 +1 @@ +bdfea634e84bf4d69592d9279dbc636a \ No newline at end of file diff --git a/doxygen/classdr_1_1remote__subrange__coll__graph.png b/doxygen/classdr_1_1remote__subrange__coll__graph.png new file mode 100644 index 0000000000..c96f8705db Binary files /dev/null and b/doxygen/classdr_1_1remote__subrange__coll__graph.png differ diff --git a/doxygen/classdr_1_1remote__subrange__inherit__graph.map b/doxygen/classdr_1_1remote__subrange__inherit__graph.map new file mode 100644 index 0000000000..fe7563bbed --- /dev/null +++ b/doxygen/classdr_1_1remote__subrange__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1remote__subrange__inherit__graph.md5 b/doxygen/classdr_1_1remote__subrange__inherit__graph.md5 new file mode 100644 index 0000000000..f15229df57 --- /dev/null +++ b/doxygen/classdr_1_1remote__subrange__inherit__graph.md5 @@ -0,0 +1 @@ +bdfea634e84bf4d69592d9279dbc636a \ No newline at end of file diff --git a/doxygen/classdr_1_1remote__subrange__inherit__graph.png b/doxygen/classdr_1_1remote__subrange__inherit__graph.png new file mode 100644 index 0000000000..c96f8705db Binary files /dev/null and b/doxygen/classdr_1_1remote__subrange__inherit__graph.png differ diff --git a/doxygen/classdr_1_1rma__window-members.html b/doxygen/classdr_1_1rma__window-members.html new file mode 100644 index 0000000000..7643d19c00 --- /dev/null +++ b/doxygen/classdr_1_1rma__window-members.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::rma_window Member List
+
+
+ +

This is the complete list of members for dr::rma_window, including all inherited members.

+ + + + + + + + + + + + + + + +
communicator() const (defined in dr::rma_window)dr::rma_windowinline
create(communicator comm, void *data, std::size_t size) (defined in dr::rma_window)dr::rma_windowinline
fence() const (defined in dr::rma_window)dr::rma_windowinline
flush(std::size_t rank) const (defined in dr::rma_window)dr::rma_windowinline
free() (defined in dr::rma_window)dr::rma_windowinline
get(std::size_t rank, std::size_t disp) const (defined in dr::rma_window)dr::rma_windowinline
get(void *dst, std::size_t size, std::size_t rank, std::size_t disp) const (defined in dr::rma_window)dr::rma_windowinline
local_data() (defined in dr::rma_window)dr::rma_windowinline
mpi_win() (defined in dr::rma_window)dr::rma_windowinline
null() const noexcept (defined in dr::rma_window)dr::rma_windowinline
operator==(const rma_window other) const noexcept (defined in dr::rma_window)dr::rma_windowinline
put(const auto &src, std::size_t rank, std::size_t disp) const (defined in dr::rma_window)dr::rma_windowinline
put(const void *src, std::size_t size, std::size_t rank, std::size_t disp) const (defined in dr::rma_window)dr::rma_windowinline
set_null() (defined in dr::rma_window)dr::rma_windowinline
+ + + + diff --git a/doxygen/classdr_1_1rma__window.html b/doxygen/classdr_1_1rma__window.html new file mode 100644 index 0000000000..2cff3f39d4 --- /dev/null +++ b/doxygen/classdr_1_1rma__window.html @@ -0,0 +1,139 @@ + + + + + + + +Distributed Ranges: dr::rma_window Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::rma_window Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+void create (communicator comm, void *data, std::size_t size)
 
+template<typename T >
auto local_data ()
 
+void free ()
 
+bool operator== (const rma_window other) const noexcept
 
+void set_null ()
 
+bool null () const noexcept
 
+template<typename T >
get (std::size_t rank, std::size_t disp) const
 
+void get (void *dst, std::size_t size, std::size_t rank, std::size_t disp) const
 
+void put (const auto &src, std::size_t rank, std::size_t disp) const
 
+void put (const void *src, std::size_t size, std::size_t rank, std::size_t disp) const
 
+void fence () const
 
+void flush (std::size_t rank) const
 
+const auto & communicator () const
 
+auto mpi_win ()
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1____detail_1_1coo__matrix-members.html b/doxygen/classdr_1_1sp_1_1____detail_1_1coo__matrix-members.html new file mode 100644 index 0000000000..8c7113dab3 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1____detail_1_1coo__matrix-members.html @@ -0,0 +1,128 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::__detail::coo_matrix< T, I, Allocator > Member List
+
+
+ +

This is the complete list of members for dr::sp::__detail::coo_matrix< T, I, Allocator >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
allocator_type typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
assign_tuples(InputIt first, InputIt last) (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
backend_allocator_type typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
backend_type typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
begin() noexcept (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
begin() const noexcept (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
const_iterator typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
const_reference typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
coo_matrix(dr::index< I > shape) (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
coo_matrix()=default (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
coo_matrix(const coo_matrix &)=default (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
coo_matrix(coo_matrix &&)=default (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
difference_type typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
end() noexcept (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
end() const noexcept (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
find(key_type key) noexcept (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
find(key_type key) const noexcept (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
index_type typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
insert(InputIt first, InputIt last) (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
insert(value_type &&value) (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
insert(const value_type &value) (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
insert_or_assign(key_type k, M &&obj) (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
iterator typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
key_type typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
map_type typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
nbytes() const noexcept (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
operator=(const coo_matrix &)=default (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
operator=(coo_matrix &&)=default (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
push_back(InputIt first, InputIt last) (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
push_back(const value_type &value) (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
reference typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
reserve(size_type new_cap) (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
reshape(dr::index< I > shape) (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
scalar_reference typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
scalar_type typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
shape() const noexcept (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
size() const noexcept (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >inline
size_type typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
value_type typedef (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
~coo_matrix()=default (defined in dr::sp::__detail::coo_matrix< T, I, Allocator >)dr::sp::__detail::coo_matrix< T, I, Allocator >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1____detail_1_1coo__matrix.html b/doxygen/classdr_1_1sp_1_1____detail_1_1coo__matrix.html new file mode 100644 index 0000000000..49c74ca951 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1____detail_1_1coo__matrix.html @@ -0,0 +1,217 @@ + + + + + + + +Distributed Ranges: dr::sp::__detail::coo_matrix< T, I, Allocator > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::__detail::coo_matrix< T, I, Allocator > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using value_type = dr::sp::matrix_entry< T, I >
 
+using scalar_type = T
 
+using index_type = I
 
+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using allocator_type = Allocator
 
+using key_type = dr::index< I >
 
+using map_type = T
 
+using backend_allocator_type = typename std::allocator_traits< allocator_type >::template rebind_alloc< value_type >
 
+using backend_type = std::vector< value_type, backend_allocator_type >
 
+using iterator = typename backend_type::iterator
 
+using const_iterator = typename backend_type::const_iterator
 
+using reference = dr::sp::matrix_ref< T, I >
 
+using const_reference = dr::sp::matrix_ref< std::add_const_t< T >, I >
 
+using scalar_reference = T &
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

coo_matrix (dr::index< I > shape)
 
+dr::index< I > shape () const noexcept
 
+size_type size () const noexcept
 
+void reserve (size_type new_cap)
 
+iterator begin () noexcept
 
+const_iterator begin () const noexcept
 
+iterator end () noexcept
 
+const_iterator end () const noexcept
 
+template<typename InputIt >
void insert (InputIt first, InputIt last)
 
+template<typename InputIt >
void push_back (InputIt first, InputIt last)
 
+void push_back (const value_type &value)
 
+template<typename InputIt >
void assign_tuples (InputIt first, InputIt last)
 
+std::pair< iterator, bool > insert (value_type &&value)
 
+std::pair< iterator, bool > insert (const value_type &value)
 
+template<class M >
std::pair< iterator, bool > insert_or_assign (key_type k, M &&obj)
 
+iterator find (key_type key) noexcept
 
+const_iterator find (key_type key) const noexcept
 
+void reshape (dr::index< I > shape)
 
coo_matrix (const coo_matrix &)=default
 
coo_matrix (coo_matrix &&)=default
 
+coo_matrixoperator= (const coo_matrix &)=default
 
+coo_matrixoperator= (coo_matrix &&)=default
 
+std::size_t nbytes () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1block__cyclic-members.html b/doxygen/classdr_1_1sp_1_1block__cyclic-members.html new file mode 100644 index 0000000000..182811d7d9 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1block__cyclic-members.html @@ -0,0 +1,96 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::block_cyclic Member List
+
+
+ +

This is the complete list of members for dr::sp::block_cyclic, including all inherited members.

+ + + + + + + + + +
block_cyclic(dr::index<> tile_shape={dr::sp::tile::div, dr::sp::tile::div}, dr::index<> grid_shape=detail::factor(dr::sp::nprocs())) (defined in dr::sp::block_cyclic)dr::sp::block_cyclicinline
block_cyclic(const block_cyclic &) noexcept=default (defined in dr::sp::block_cyclic)dr::sp::block_cyclic
clone() const noexcept (defined in dr::sp::block_cyclic)dr::sp::block_cyclicinlinevirtual
grid_shape(dr::index<> matrix_shape) const (defined in dr::sp::block_cyclic)dr::sp::block_cyclicinlinevirtual
tile_rank(dr::index<> matrix_shape, dr::index<> tile_id) const (defined in dr::sp::block_cyclic)dr::sp::block_cyclicinlinevirtual
tile_shape() const (defined in dr::sp::block_cyclic)dr::sp::block_cyclicinline
tile_shape(dr::index<> matrix_shape) const (defined in dr::sp::block_cyclic)dr::sp::block_cyclicinlinevirtual
~matrix_partition() (defined in dr::sp::matrix_partition)dr::sp::matrix_partitioninlinevirtual
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1block__cyclic.html b/doxygen/classdr_1_1sp_1_1block__cyclic.html new file mode 100644 index 0000000000..43c2513614 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1block__cyclic.html @@ -0,0 +1,264 @@ + + + + + + + +Distributed Ranges: dr::sp::block_cyclic Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::sp::block_cyclic Class Referencefinal
+
+
+
+Inheritance diagram for dr::sp::block_cyclic:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::sp::block_cyclic:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

block_cyclic (dr::index<> tile_shape={dr::sp::tile::div, dr::sp::tile::div}, dr::index<> grid_shape=detail::factor(dr::sp::nprocs()))
 
block_cyclic (const block_cyclic &) noexcept=default
 
+dr::index tile_shape () const
 
std::size_t tile_rank (dr::index<> matrix_shape, dr::index<> tile_id) const
 
dr::index grid_shape (dr::index<> matrix_shape) const
 
dr::index tile_shape (dr::index<> matrix_shape) const
 
std::unique_ptr< matrix_partitionclone () const noexcept
 
+virtual std::size_t tile_rank (dr::index<> matrix_shape, dr::index<> tile_id) const =0
 
+virtual dr::index grid_shape (dr::index<> matrix_shape) const =0
 
+virtual dr::index tile_shape (dr::index<> matrix_shape) const =0
 
+virtual std::unique_ptr< matrix_partitionclone () const =0
 
+

Member Function Documentation

+ +

◆ clone()

+ +
+
+ + + + + +
+ + + + + + + +
std::unique_ptr< matrix_partition > dr::sp::block_cyclic::clone () const
+
+inlinevirtualnoexcept
+
+ +

Implements dr::sp::matrix_partition.

+ +
+
+ +

◆ grid_shape()

+ +
+
+ + + + + +
+ + + + + + + + +
dr::index dr::sp::block_cyclic::grid_shape (dr::index<> matrix_shape) const
+
+inlinevirtual
+
+ +

Implements dr::sp::matrix_partition.

+ +
+
+ +

◆ tile_rank()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
std::size_t dr::sp::block_cyclic::tile_rank (dr::index<> matrix_shape,
dr::index<> tile_id 
) const
+
+inlinevirtual
+
+ +

Implements dr::sp::matrix_partition.

+ +
+
+ +

◆ tile_shape()

+ +
+
+ + + + + +
+ + + + + + + + +
dr::index dr::sp::block_cyclic::tile_shape (dr::index<> matrix_shape) const
+
+inlinevirtual
+
+ +

Implements dr::sp::matrix_partition.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1block__cyclic__coll__graph.map b/doxygen/classdr_1_1sp_1_1block__cyclic__coll__graph.map new file mode 100644 index 0000000000..f282f666aa --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1block__cyclic__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1block__cyclic__coll__graph.md5 b/doxygen/classdr_1_1sp_1_1block__cyclic__coll__graph.md5 new file mode 100644 index 0000000000..8ab62f1e13 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1block__cyclic__coll__graph.md5 @@ -0,0 +1 @@ +071e74cd42fa2b1e410dff34c8b9f471 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1block__cyclic__coll__graph.png b/doxygen/classdr_1_1sp_1_1block__cyclic__coll__graph.png new file mode 100644 index 0000000000..9726f911d9 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1block__cyclic__coll__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1block__cyclic__inherit__graph.map b/doxygen/classdr_1_1sp_1_1block__cyclic__inherit__graph.map new file mode 100644 index 0000000000..f282f666aa --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1block__cyclic__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1block__cyclic__inherit__graph.md5 b/doxygen/classdr_1_1sp_1_1block__cyclic__inherit__graph.md5 new file mode 100644 index 0000000000..8ab62f1e13 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1block__cyclic__inherit__graph.md5 @@ -0,0 +1 @@ +071e74cd42fa2b1e410dff34c8b9f471 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1block__cyclic__inherit__graph.png b/doxygen/classdr_1_1sp_1_1block__cyclic__inherit__graph.png new file mode 100644 index 0000000000..9726f911d9 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1block__cyclic__inherit__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1buffered__allocator-members.html b/doxygen/classdr_1_1sp_1_1buffered__allocator-members.html new file mode 100644 index 0000000000..a7d1e28451 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1buffered__allocator-members.html @@ -0,0 +1,100 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::buffered_allocator< Allocator > Member List
+
+
+ +

This is the complete list of members for dr::sp::buffered_allocator< Allocator >, including all inherited members.

+ + + + + + + + + + + + + +
allocate(std::size_t size) (defined in dr::sp::buffered_allocator< Allocator >)dr::sp::buffered_allocator< Allocator >inline
buffered_allocator(const Allocator &alloc, std::size_t buffer_size, std::size_t n_buffers) (defined in dr::sp::buffered_allocator< Allocator >)dr::sp::buffered_allocator< Allocator >inline
const_pointer typedef (defined in dr::sp::buffered_allocator< Allocator >)dr::sp::buffered_allocator< Allocator >
deallocate(pointer ptr, std::size_t n) (defined in dr::sp::buffered_allocator< Allocator >)dr::sp::buffered_allocator< Allocator >inline
difference_type typedef (defined in dr::sp::buffered_allocator< Allocator >)dr::sp::buffered_allocator< Allocator >
is_always_equal typedef (defined in dr::sp::buffered_allocator< Allocator >)dr::sp::buffered_allocator< Allocator >
operator!=(const buffered_allocator &) const =default (defined in dr::sp::buffered_allocator< Allocator >)dr::sp::buffered_allocator< Allocator >
operator==(const buffered_allocator &) const =default (defined in dr::sp::buffered_allocator< Allocator >)dr::sp::buffered_allocator< Allocator >
pointer typedef (defined in dr::sp::buffered_allocator< Allocator >)dr::sp::buffered_allocator< Allocator >
size_type typedef (defined in dr::sp::buffered_allocator< Allocator >)dr::sp::buffered_allocator< Allocator >
value_type typedef (defined in dr::sp::buffered_allocator< Allocator >)dr::sp::buffered_allocator< Allocator >
~buffered_allocator() (defined in dr::sp::buffered_allocator< Allocator >)dr::sp::buffered_allocator< Allocator >inline
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1buffered__allocator.html b/doxygen/classdr_1_1sp_1_1buffered__allocator.html new file mode 100644 index 0000000000..b66f147d6a --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1buffered__allocator.html @@ -0,0 +1,132 @@ + + + + + + + +Distributed Ranges: dr::sp::buffered_allocator< Allocator > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::buffered_allocator< Allocator > Class Template Reference
+
+
+ + + + + + + + + + + + + + +

+Public Types

+using value_type = typename std::allocator_traits< Allocator >::value_type
 
+using pointer = typename std::allocator_traits< Allocator >::pointer
 
+using const_pointer = typename std::allocator_traits< Allocator >::const_pointer
 
+using size_type = typename std::allocator_traits< Allocator >::size_type
 
+using difference_type = typename std::allocator_traits< Allocator >::difference_type
 
+using is_always_equal = std::false_type
 
+ + + + + + + + + + + +

+Public Member Functions

buffered_allocator (const Allocator &alloc, std::size_t buffer_size, std::size_t n_buffers)
 
+pointer allocate (std::size_t size)
 
+void deallocate (pointer ptr, std::size_t n)
 
+bool operator== (const buffered_allocator &) const =default
 
+bool operator!= (const buffered_allocator &) const =default
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1csr__matrix__view-members.html b/doxygen/classdr_1_1sp_1_1csr__matrix__view-members.html new file mode 100644 index 0000000000..6fc08a609c --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1csr__matrix__view-members.html @@ -0,0 +1,109 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::csr_matrix_view< T, I, TIter, IIter > Member List
+
+
+ +

This is the complete list of members for dr::sp::csr_matrix_view< T, I, TIter, IIter >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
begin() const (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >inline
colind_data() const (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >inline
csr_matrix_view(TIter values, IIter rowptr, IIter colind, key_type shape, size_type nnz, size_type rank) (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >inline
csr_matrix_view(TIter values, IIter rowptr, IIter colind, key_type shape, size_type nnz, size_type rank, key_type idx_offset) (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >inline
difference_type typedef (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >
end() const (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >inline
index_type typedef (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >
iterator typedef (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >
key_type typedef (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >
map_type typedef (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >
rank() const (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >inline
reference typedef (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >
row(I row_index) const (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >inline
rowptr_data() const (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >inline
scalar_reference typedef (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >
scalar_type typedef (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >
shape() const noexcept (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >inline
size() const noexcept (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >inline
size_type typedef (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >
submatrix(key_type rows, key_type columns) const (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >inline
values_data() const (defined in dr::sp::csr_matrix_view< T, I, TIter, IIter >)dr::sp::csr_matrix_view< T, I, TIter, IIter >inline
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1csr__matrix__view.html b/doxygen/classdr_1_1sp_1_1csr__matrix__view.html new file mode 100644 index 0000000000..87d75b6e25 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1csr__matrix__view.html @@ -0,0 +1,180 @@ + + + + + + + +Distributed Ranges: dr::sp::csr_matrix_view< T, I, TIter, IIter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::csr_matrix_view< T, I, TIter, IIter > Class Template Reference
+
+
+
+Inheritance diagram for dr::sp::csr_matrix_view< T, I, TIter, IIter >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::sp::csr_matrix_view< T, I, TIter, IIter >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using scalar_reference = std::iter_reference_t< TIter >
 
+using reference = dr::sp::matrix_ref< T, I, scalar_reference >
 
+using scalar_type = T
 
+using index_type = I
 
+using key_type = dr::index< I >
 
+using map_type = T
 
+using iterator = csr_matrix_view_iterator< T, I, TIter, IIter >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

csr_matrix_view (TIter values, IIter rowptr, IIter colind, key_type shape, size_type nnz, size_type rank)
 
csr_matrix_view (TIter values, IIter rowptr, IIter colind, key_type shape, size_type nnz, size_type rank, key_type idx_offset)
 
+key_type shape () const noexcept
 
+size_type size () const noexcept
 
+std::size_t rank () const
 
+iterator begin () const
 
+iterator end () const
 
+auto row (I row_index) const
 
+auto submatrix (key_type rows, key_type columns) const
 
+auto values_data () const
 
+auto rowptr_data () const
 
+auto colind_data () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1csr__matrix__view__accessor-members.html b/doxygen/classdr_1_1sp_1_1csr__matrix__view__accessor-members.html new file mode 100644 index 0000000000..bea8f29b84 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1csr__matrix__view__accessor-members.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter > Member List
+
+
+ +

This is the complete list of members for dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
csr_matrix_view_accessor() noexcept=default (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
csr_matrix_view_accessor(const csr_matrix_view_accessor &) noexcept=default (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
csr_matrix_view_accessor(TIter values, IIter rowptr, IIter colind, size_type idx, index_type row, size_type row_dim) noexcept (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
csr_matrix_view_accessor(TIter values, IIter rowptr, IIter colind, size_type idx, index_type row, size_type row_dim, key_type idx_offset) noexcept (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
difference_type typedef (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
fast_backward_row() noexcept (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
fast_forward_row() noexcept (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
index_type typedef (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
iterator_accessor typedef (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
iterator_category typedef (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
key_type typedef (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
nonconst_iterator_accessor typedef (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
operator*() const noexcept (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
operator+=(difference_type offset) noexcept (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
operator=(const csr_matrix_view_accessor &) noexcept=default (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
operator==(const iterator_accessor &other) const noexcept (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
reference typedef (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
scalar_reference typedef (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
scalar_type typedef (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
size_type typedef (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
value_type typedef (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
~csr_matrix_view_accessor() noexcept=default (defined in dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1csr__matrix__view__accessor.html b/doxygen/classdr_1_1sp_1_1csr__matrix__view__accessor.html new file mode 100644 index 0000000000..6dab64c1d6 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1csr__matrix__view__accessor.html @@ -0,0 +1,168 @@ + + + + + + + +Distributed Ranges: dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::csr_matrix_view_accessor< T, I, TIter, IIter > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using scalar_type = std::iter_value_t< TIter >
 
+using scalar_reference = std::iter_reference_t< TIter >
 
+using index_type = I
 
+using value_type = dr::sp::matrix_entry< scalar_type, I >
 
+using reference = dr::sp::matrix_ref< T, I, scalar_reference >
 
+using iterator_category = std::random_access_iterator_tag
 
+using iterator_accessor = csr_matrix_view_accessor
 
+using const_iterator_accessor = iterator_accessor
 
+using nonconst_iterator_accessor = iterator_accessor
 
+using key_type = dr::index< I >
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr csr_matrix_view_accessor (const csr_matrix_view_accessor &) noexcept=default
 
+constexpr csr_matrix_view_accessoroperator= (const csr_matrix_view_accessor &) noexcept=default
 
+constexpr csr_matrix_view_accessor (TIter values, IIter rowptr, IIter colind, size_type idx, index_type row, size_type row_dim) noexcept
 
+constexpr csr_matrix_view_accessor (TIter values, IIter rowptr, IIter colind, size_type idx, index_type row, size_type row_dim, key_type idx_offset) noexcept
 
+void fast_forward_row () noexcept
 
+void fast_backward_row () noexcept
 
+constexpr csr_matrix_view_accessoroperator+= (difference_type offset) noexcept
 
+constexpr bool operator== (const iterator_accessor &other) const noexcept
 
+constexpr difference_type operator- (const iterator_accessor &other) const noexcept
 
+constexpr bool operator< (const iterator_accessor &other) const noexcept
 
+constexpr reference operator* () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1csr__matrix__view__coll__graph.map b/doxygen/classdr_1_1sp_1_1csr__matrix__view__coll__graph.map new file mode 100644 index 0000000000..6ee437bb18 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1csr__matrix__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1csr__matrix__view__coll__graph.md5 b/doxygen/classdr_1_1sp_1_1csr__matrix__view__coll__graph.md5 new file mode 100644 index 0000000000..a58101abc1 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1csr__matrix__view__coll__graph.md5 @@ -0,0 +1 @@ +39f828210c8b0987e5a88142b54e6b4e \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1csr__matrix__view__coll__graph.png b/doxygen/classdr_1_1sp_1_1csr__matrix__view__coll__graph.png new file mode 100644 index 0000000000..a5dca4c05c Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1csr__matrix__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1csr__matrix__view__inherit__graph.map b/doxygen/classdr_1_1sp_1_1csr__matrix__view__inherit__graph.map new file mode 100644 index 0000000000..6ee437bb18 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1csr__matrix__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1csr__matrix__view__inherit__graph.md5 b/doxygen/classdr_1_1sp_1_1csr__matrix__view__inherit__graph.md5 new file mode 100644 index 0000000000..a58101abc1 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1csr__matrix__view__inherit__graph.md5 @@ -0,0 +1 @@ +39f828210c8b0987e5a88142b54e6b4e \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1csr__matrix__view__inherit__graph.png b/doxygen/classdr_1_1sp_1_1csr__matrix__view__inherit__graph.png new file mode 100644 index 0000000000..a5dca4c05c Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1csr__matrix__view__inherit__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix-members.html b/doxygen/classdr_1_1sp_1_1dense__matrix-members.html new file mode 100644 index 0000000000..0d0f958f5e --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix-members.html @@ -0,0 +1,114 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::dense_matrix< T, Allocator > Member List
+
+
+ +

This is the complete list of members for dr::sp::dense_matrix< T, Allocator >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
allocator_type typedef (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >
begin() const (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
column(size_type column_index) const (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
data() const (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
dense_matrix(key_type shape) (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
dense_matrix(key_type shape, std::size_t ld) (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
dense_matrix(key_type shape, std::size_t ld, const Allocator &alloc) (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
dense_matrix(dense_matrix &&other) (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
dense_matrix(const dense_matrix &other)=delete (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >
difference_type typedef (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >
end() const (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
iterator typedef (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >
key_type typedef (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >
ld() const (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
map_type typedef (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >
operator=(dense_matrix &&other) (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
operator=(const dense_matrix &other)=delete (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >
operator[](key_type idx) const (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
reference typedef (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >
row(size_type row_index) const (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
scalar_pointer typedef (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >
scalar_reference typedef (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >
shape() const noexcept (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
size() const noexcept (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
size_type typedef (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >
~dense_matrix() (defined in dr::sp::dense_matrix< T, Allocator >)dr::sp::dense_matrix< T, Allocator >inline
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix.html b/doxygen/classdr_1_1sp_1_1dense__matrix.html new file mode 100644 index 0000000000..6cec416c34 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix.html @@ -0,0 +1,174 @@ + + + + + + + +Distributed Ranges: dr::sp::dense_matrix< T, Allocator > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::dense_matrix< T, Allocator > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using allocator_type = Allocator
 
+using scalar_pointer = typename std::allocator_traits< Allocator >::pointer
 
+using scalar_reference = std::iter_reference_t< scalar_pointer >
 
+using reference = dr::sp::matrix_ref< T, std::size_t, scalar_reference >
 
+using key_type = dr::index<>
 
+using map_type = T
 
+using iterator = dense_matrix_iterator< T, scalar_pointer >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

dense_matrix (key_type shape)
 
dense_matrix (key_type shape, std::size_t ld)
 
dense_matrix (key_type shape, std::size_t ld, const Allocator &alloc)
 
dense_matrix (dense_matrix &&other)
 
+dense_matrixoperator= (dense_matrix &&other)
 
dense_matrix (const dense_matrix &other)=delete
 
+dense_matrixoperator= (const dense_matrix &other)=delete
 
+key_type shape () const noexcept
 
+size_type size () const noexcept
 
+scalar_reference operator[] (key_type idx) const
 
+iterator begin () const
 
+iterator end () const
 
+auto row (size_type row_index) const
 
+auto column (size_type column_index) const
 
+scalar_pointer data () const
 
+size_type ld () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__accessor-members.html b/doxygen/classdr_1_1sp_1_1dense__matrix__accessor-members.html new file mode 100644 index 0000000000..da3b829e07 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__accessor-members.html @@ -0,0 +1,111 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::dense_matrix_accessor< T, Iter > Member List
+
+
+ +

This is the complete list of members for dr::sp::dense_matrix_accessor< T, Iter >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
data() const noexcept (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >inline
dense_matrix_accessor() noexcept=default (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
dense_matrix_accessor(const dense_matrix_accessor &) noexcept=default (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
dense_matrix_accessor(Iter data, key_type idx, key_type matrix_shape, size_type ld) noexcept (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >inline
dense_matrix_accessor(Iter data, key_type idx, key_type idx_offset, key_type matrix_shape, size_type ld) noexcept (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >inline
difference_type typedef (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
iterator_accessor typedef (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
iterator_category typedef (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
key_type typedef (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
nonconst_iterator_accessor typedef (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
operator*() const noexcept (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >inline
operator+=(difference_type offset) noexcept (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >inline
operator=(const dense_matrix_accessor &) noexcept=default (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
operator==(const iterator_accessor &other) const noexcept (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >inline
reference typedef (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
scalar_reference typedef (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
scalar_type typedef (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
size_type typedef (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
value_type typedef (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
~dense_matrix_accessor() noexcept=default (defined in dr::sp::dense_matrix_accessor< T, Iter >)dr::sp::dense_matrix_accessor< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__accessor.html b/doxygen/classdr_1_1sp_1_1dense__matrix__accessor.html new file mode 100644 index 0000000000..518a584381 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__accessor.html @@ -0,0 +1,162 @@ + + + + + + + +Distributed Ranges: dr::sp::dense_matrix_accessor< T, Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::dense_matrix_accessor< T, Iter > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using scalar_type = std::iter_value_t< Iter >
 
+using scalar_reference = std::iter_reference_t< Iter >
 
+using value_type = dr::sp::matrix_entry< scalar_type, std::size_t >
 
+using reference = dr::sp::matrix_ref< T, std::size_t, scalar_reference >
 
+using iterator_category = std::random_access_iterator_tag
 
+using iterator_accessor = dense_matrix_accessor
 
+using const_iterator_accessor = iterator_accessor
 
+using nonconst_iterator_accessor = iterator_accessor
 
+using key_type = dr::index<>
 
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr dense_matrix_accessor (const dense_matrix_accessor &) noexcept=default
 
+constexpr dense_matrix_accessoroperator= (const dense_matrix_accessor &) noexcept=default
 
+constexpr dense_matrix_accessor (Iter data, key_type idx, key_type matrix_shape, size_type ld) noexcept
 
+constexpr dense_matrix_accessor (Iter data, key_type idx, key_type idx_offset, key_type matrix_shape, size_type ld) noexcept
 
+constexpr dense_matrix_accessoroperator+= (difference_type offset) noexcept
 
+constexpr bool operator== (const iterator_accessor &other) const noexcept
 
+constexpr difference_type operator- (const iterator_accessor &other) const noexcept
 
+constexpr bool operator< (const iterator_accessor &other) const noexcept
 
+constexpr reference operator* () const noexcept
 
+Iter data () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__column__accessor-members.html b/doxygen/classdr_1_1sp_1_1dense__matrix__column__accessor-members.html new file mode 100644 index 0000000000..368f085e6c --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__column__accessor-members.html @@ -0,0 +1,109 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::dense_matrix_column_accessor< T, Iter > Member List
+
+
+ +

This is the complete list of members for dr::sp::dense_matrix_column_accessor< T, Iter >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
dense_matrix_column_accessor() noexcept=default (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
dense_matrix_column_accessor(const dense_matrix_column_accessor &) noexcept=default (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
dense_matrix_column_accessor(Iter data, std::size_t i, std::size_t j, std::size_t ld) noexcept (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >inline
difference_type typedef (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
iterator_accessor typedef (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
iterator_category typedef (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
key_type typedef (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
nonconst_iterator_accessor typedef (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
operator*() const noexcept (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >inline
operator+=(difference_type offset) noexcept (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >inline
operator=(const dense_matrix_column_accessor &) noexcept=default (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
operator==(const iterator_accessor &other) const noexcept (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >inline
reference typedef (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
scalar_reference typedef (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
scalar_value_type typedef (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
size_type typedef (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
value_type typedef (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
~dense_matrix_column_accessor() noexcept=default (defined in dr::sp::dense_matrix_column_accessor< T, Iter >)dr::sp::dense_matrix_column_accessor< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__column__accessor.html b/doxygen/classdr_1_1sp_1_1dense__matrix__column__accessor.html new file mode 100644 index 0000000000..449bd01f52 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__column__accessor.html @@ -0,0 +1,156 @@ + + + + + + + +Distributed Ranges: dr::sp::dense_matrix_column_accessor< T, Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::dense_matrix_column_accessor< T, Iter > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using scalar_value_type = std::iter_value_t< Iter >
 
+using scalar_reference = std::iter_reference_t< Iter >
 
+using value_type = dr::sp::matrix_entry< scalar_value_type, std::size_t >
 
+using reference = dr::sp::matrix_ref< T, std::size_t, scalar_reference >
 
+using iterator_category = std::random_access_iterator_tag
 
+using iterator_accessor = dense_matrix_column_accessor
 
+using const_iterator_accessor = iterator_accessor
 
+using nonconst_iterator_accessor = iterator_accessor
 
+using key_type = dr::index<>
 
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr dense_matrix_column_accessor (const dense_matrix_column_accessor &) noexcept=default
 
+constexpr dense_matrix_column_accessoroperator= (const dense_matrix_column_accessor &) noexcept=default
 
+constexpr dense_matrix_column_accessor (Iter data, std::size_t i, std::size_t j, std::size_t ld) noexcept
 
+constexpr dense_matrix_column_accessoroperator+= (difference_type offset) noexcept
 
+constexpr bool operator== (const iterator_accessor &other) const noexcept
 
+constexpr difference_type operator- (const iterator_accessor &other) const noexcept
 
+constexpr bool operator< (const iterator_accessor &other) const noexcept
 
+constexpr reference operator* () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__column__view-members.html b/doxygen/classdr_1_1sp_1_1dense__matrix__column__view-members.html new file mode 100644 index 0000000000..fd16e68210 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__column__view-members.html @@ -0,0 +1,103 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::dense_matrix_column_view< T, Iter > Member List
+
+
+ +

This is the complete list of members for dr::sp::dense_matrix_column_view< T, Iter >, including all inherited members.

+ + + + + + + + + + + + + + + + +
begin() const (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >inline
column_idx_ (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >
data_ (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >
dense_matrix_column_view(Iter data, size_type column_idx, size_type size, size_type ld) (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >inline
difference_type typedef (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >
end() const (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >inline
iterator typedef (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >
key_type typedef (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >
ld_ (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >
map_type typedef (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >
operator[](size_type idx) (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >inline
scalar_reference typedef (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >
size() const noexcept (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >inline
size_ (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >
size_type typedef (defined in dr::sp::dense_matrix_column_view< T, Iter >)dr::sp::dense_matrix_column_view< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__column__view.html b/doxygen/classdr_1_1sp_1_1dense__matrix__column__view.html new file mode 100644 index 0000000000..21896cf0ff --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__column__view.html @@ -0,0 +1,157 @@ + + + + + + + +Distributed Ranges: dr::sp::dense_matrix_column_view< T, Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Public Attributes | +List of all members
+
dr::sp::dense_matrix_column_view< T, Iter > Class Template Reference
+
+
+
+Collaboration diagram for dr::sp::dense_matrix_column_view< T, Iter >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using scalar_reference = std::iter_reference_t< Iter >
 
+using key_type = dr::index<>
 
+using map_type = T
 
+using iterator = dense_matrix_column_iterator< T, Iter >
 
+ + + + + + + + + + + +

+Public Member Functions

dense_matrix_column_view (Iter data, size_type column_idx, size_type size, size_type ld)
 
+scalar_reference operator[] (size_type idx)
 
+iterator begin () const
 
+iterator end () const
 
+size_type size () const noexcept
 
+ + + + + + + + + +

+Public Attributes

+Iter data_
 
+size_type column_idx_
 
+size_type size_
 
+size_type ld_
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__column__view__coll__graph.map b/doxygen/classdr_1_1sp_1_1dense__matrix__column__view__coll__graph.map new file mode 100644 index 0000000000..17f59a267b --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__column__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__column__view__coll__graph.md5 b/doxygen/classdr_1_1sp_1_1dense__matrix__column__view__coll__graph.md5 new file mode 100644 index 0000000000..f0ca41c607 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__column__view__coll__graph.md5 @@ -0,0 +1 @@ +86a6c157873e4335a9edb520f6688572 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__column__view__coll__graph.png b/doxygen/classdr_1_1sp_1_1dense__matrix__column__view__coll__graph.png new file mode 100644 index 0000000000..e01ce5592e Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1dense__matrix__column__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__row__accessor-members.html b/doxygen/classdr_1_1sp_1_1dense__matrix__row__accessor-members.html new file mode 100644 index 0000000000..28d516d6c4 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__row__accessor-members.html @@ -0,0 +1,109 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::dense_matrix_row_accessor< T, Iter > Member List
+
+
+ +

This is the complete list of members for dr::sp::dense_matrix_row_accessor< T, Iter >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
dense_matrix_row_accessor() noexcept=default (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
dense_matrix_row_accessor(const dense_matrix_row_accessor &) noexcept=default (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
dense_matrix_row_accessor(Iter data, std::size_t i, std::size_t j) noexcept (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >inline
difference_type typedef (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
iterator_accessor typedef (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
iterator_category typedef (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
key_type typedef (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
nonconst_iterator_accessor typedef (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
operator*() const noexcept (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >inline
operator+=(difference_type offset) noexcept (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >inline
operator=(const dense_matrix_row_accessor &) noexcept=default (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
operator==(const iterator_accessor &other) const noexcept (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >inline
reference typedef (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
scalar_reference typedef (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
scalar_value_type typedef (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
size_type typedef (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
value_type typedef (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
~dense_matrix_row_accessor() noexcept=default (defined in dr::sp::dense_matrix_row_accessor< T, Iter >)dr::sp::dense_matrix_row_accessor< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__row__accessor.html b/doxygen/classdr_1_1sp_1_1dense__matrix__row__accessor.html new file mode 100644 index 0000000000..e7d1bcc25b --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__row__accessor.html @@ -0,0 +1,156 @@ + + + + + + + +Distributed Ranges: dr::sp::dense_matrix_row_accessor< T, Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::dense_matrix_row_accessor< T, Iter > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using scalar_value_type = std::iter_value_t< Iter >
 
+using scalar_reference = std::iter_reference_t< Iter >
 
+using value_type = dr::sp::matrix_entry< scalar_value_type, std::size_t >
 
+using reference = dr::sp::matrix_ref< T, std::size_t, scalar_reference >
 
+using iterator_category = std::random_access_iterator_tag
 
+using iterator_accessor = dense_matrix_row_accessor
 
+using const_iterator_accessor = iterator_accessor
 
+using nonconst_iterator_accessor = iterator_accessor
 
+using key_type = dr::index<>
 
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr dense_matrix_row_accessor (const dense_matrix_row_accessor &) noexcept=default
 
+constexpr dense_matrix_row_accessoroperator= (const dense_matrix_row_accessor &) noexcept=default
 
+constexpr dense_matrix_row_accessor (Iter data, std::size_t i, std::size_t j) noexcept
 
+constexpr dense_matrix_row_accessoroperator+= (difference_type offset) noexcept
 
+constexpr bool operator== (const iterator_accessor &other) const noexcept
 
+constexpr difference_type operator- (const iterator_accessor &other) const noexcept
 
+constexpr bool operator< (const iterator_accessor &other) const noexcept
 
+constexpr reference operator* () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__row__view-members.html b/doxygen/classdr_1_1sp_1_1dense__matrix__row__view-members.html new file mode 100644 index 0000000000..898908a7b0 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__row__view-members.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::dense_matrix_row_view< T, Iter > Member List
+
+
+ +

This is the complete list of members for dr::sp::dense_matrix_row_view< T, Iter >, including all inherited members.

+ + + + + + + + + + + + + + + +
begin() const (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >inline
data_ (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >
dense_matrix_row_view(Iter data, size_type row_idx, size_type size) (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >inline
difference_type typedef (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >
end() const (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >inline
iterator typedef (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >
key_type typedef (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >
map_type typedef (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >
operator[](size_type idx) (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >inline
row_idx_ (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >
scalar_reference typedef (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >
size() const noexcept (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >inline
size_ (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >
size_type typedef (defined in dr::sp::dense_matrix_row_view< T, Iter >)dr::sp::dense_matrix_row_view< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__row__view.html b/doxygen/classdr_1_1sp_1_1dense__matrix__row__view.html new file mode 100644 index 0000000000..3de45cfa89 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__row__view.html @@ -0,0 +1,154 @@ + + + + + + + +Distributed Ranges: dr::sp::dense_matrix_row_view< T, Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Public Attributes | +List of all members
+
dr::sp::dense_matrix_row_view< T, Iter > Class Template Reference
+
+
+
+Collaboration diagram for dr::sp::dense_matrix_row_view< T, Iter >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using scalar_reference = std::iter_reference_t< Iter >
 
+using key_type = dr::index<>
 
+using map_type = T
 
+using iterator = dense_matrix_row_iterator< T, Iter >
 
+ + + + + + + + + + + +

+Public Member Functions

dense_matrix_row_view (Iter data, size_type row_idx, size_type size)
 
+scalar_reference operator[] (size_type idx)
 
+iterator begin () const
 
+iterator end () const
 
+size_type size () const noexcept
 
+ + + + + + + +

+Public Attributes

+Iter data_
 
+size_type row_idx_
 
+size_type size_
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__row__view__coll__graph.map b/doxygen/classdr_1_1sp_1_1dense__matrix__row__view__coll__graph.map new file mode 100644 index 0000000000..5978a484e5 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__row__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__row__view__coll__graph.md5 b/doxygen/classdr_1_1sp_1_1dense__matrix__row__view__coll__graph.md5 new file mode 100644 index 0000000000..74501e52be --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__row__view__coll__graph.md5 @@ -0,0 +1 @@ +1137af73c131f7c89a3577c3626fa635 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__row__view__coll__graph.png b/doxygen/classdr_1_1sp_1_1dense__matrix__row__view__coll__graph.png new file mode 100644 index 0000000000..9973ff5727 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1dense__matrix__row__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__view-members.html b/doxygen/classdr_1_1sp_1_1dense__matrix__view-members.html new file mode 100644 index 0000000000..35c30ae83b --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__view-members.html @@ -0,0 +1,109 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::dense_matrix_view< T, Iter > Member List
+
+
+ +

This is the complete list of members for dr::sp::dense_matrix_view< T, Iter >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
begin() const (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
column(size_type column_index) const (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
data() const (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
dense_matrix_view(Iter data, key_type shape, size_type ld, size_type rank) (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
dense_matrix_view(Iter data, key_type shape, key_type idx_offset, size_type ld, size_type rank) (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
dense_matrix_view(dense_matrix< T, Allocator > &m) (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
difference_type typedef (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >
end() const (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
iterator typedef (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >
key_type typedef (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >
ld() const (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
local() const (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
map_type typedef (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >
operator[](key_type idx) const (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
rank() const (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
reference typedef (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >
row(size_type row_index) const (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
scalar_reference typedef (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >
shape() const noexcept (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
size() const noexcept (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >inline
size_type typedef (defined in dr::sp::dense_matrix_view< T, Iter >)dr::sp::dense_matrix_view< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__view.html b/doxygen/classdr_1_1sp_1_1dense__matrix__view.html new file mode 100644 index 0000000000..55bff2dad3 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__view.html @@ -0,0 +1,182 @@ + + + + + + + +Distributed Ranges: dr::sp::dense_matrix_view< T, Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::dense_matrix_view< T, Iter > Class Template Reference
+
+
+
+Inheritance diagram for dr::sp::dense_matrix_view< T, Iter >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::sp::dense_matrix_view< T, Iter >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using scalar_reference = std::iter_reference_t< Iter >
 
+using reference = dr::sp::matrix_ref< T, std::size_t, scalar_reference >
 
+using key_type = dr::index<>
 
+using map_type = T
 
+using iterator = dense_matrix_view_iterator< T, Iter >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

dense_matrix_view (Iter data, key_type shape, size_type ld, size_type rank)
 
dense_matrix_view (Iter data, key_type shape, key_type idx_offset, size_type ld, size_type rank)
 
+template<typename Allocator >
+requires (std::is_same_v<typename std::allocator_traits<Allocator>::pointer, Iter>)
 dense_matrix_view (dense_matrix< T, Allocator > &m)
 
+key_type shape () const noexcept
 
+size_type size () const noexcept
 
+scalar_reference operator[] (key_type idx) const
 
+iterator begin () const
 
+iterator end () const
 
+auto row (size_type row_index) const
 
+auto column (size_type column_index) const
 
+Iter data () const
 
+std::size_t rank () const
 
+size_type ld () const
 
+auto local () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__view__coll__graph.map b/doxygen/classdr_1_1sp_1_1dense__matrix__view__coll__graph.map new file mode 100644 index 0000000000..e7d4c559c8 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__view__coll__graph.md5 b/doxygen/classdr_1_1sp_1_1dense__matrix__view__coll__graph.md5 new file mode 100644 index 0000000000..4b218fe147 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__view__coll__graph.md5 @@ -0,0 +1 @@ +1764ab512137a5ba56a131edb75658b2 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__view__coll__graph.png b/doxygen/classdr_1_1sp_1_1dense__matrix__view__coll__graph.png new file mode 100644 index 0000000000..020be4de62 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1dense__matrix__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__view__inherit__graph.map b/doxygen/classdr_1_1sp_1_1dense__matrix__view__inherit__graph.map new file mode 100644 index 0000000000..e7d4c559c8 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__view__inherit__graph.md5 b/doxygen/classdr_1_1sp_1_1dense__matrix__view__inherit__graph.md5 new file mode 100644 index 0000000000..4b218fe147 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1dense__matrix__view__inherit__graph.md5 @@ -0,0 +1 @@ +1764ab512137a5ba56a131edb75658b2 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1dense__matrix__view__inherit__graph.png b/doxygen/classdr_1_1sp_1_1dense__matrix__view__inherit__graph.png new file mode 100644 index 0000000000..020be4de62 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1dense__matrix__view__inherit__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1device__allocator-members.html b/doxygen/classdr_1_1sp_1_1device__allocator-members.html new file mode 100644 index 0000000000..f3a71e7c0a --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__allocator-members.html @@ -0,0 +1,108 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::device_allocator< T, Alignment > Member List
+
+
+ +

This is the complete list of members for dr::sp::device_allocator< T, Alignment >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
allocate(std::size_t size) (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >inline
const_pointer typedef (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
const_reference typedef (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
deallocate(pointer ptr, std::size_t n) (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >inline
device_allocator(const device_allocator< U, Alignment > &other) noexcept (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >inline
device_allocator(const sycl::queue &q) noexcept (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >inline
device_allocator(const sycl::context &ctxt, const sycl::device &dev) noexcept (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >inline
device_allocator(const device_allocator &)=default (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
difference_type typedef (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
get_context() const noexcept (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >inline
get_device() const noexcept (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >inline
is_always_equal typedef (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
operator!=(const device_allocator &) const =default (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
operator=(const device_allocator &)=default (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
operator==(const device_allocator &) const =default (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
pointer typedef (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
reference typedef (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
size_type typedef (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
value_type typedef (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
~device_allocator()=default (defined in dr::sp::device_allocator< T, Alignment >)dr::sp::device_allocator< T, Alignment >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1device__allocator.html b/doxygen/classdr_1_1sp_1_1device__allocator.html new file mode 100644 index 0000000000..5b22ccaa43 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__allocator.html @@ -0,0 +1,163 @@ + + + + + + + +Distributed Ranges: dr::sp::device_allocator< T, Alignment > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Public Types | +Public Member Functions | +List of all members
+
dr::sp::device_allocator< T, Alignment > Class Template Reference
+
+
+ + + + +

+Classes

struct  rebind
 
+ + + + + + + + + + + + + + + + + +

+Public Types

+using value_type = T
 
+using pointer = device_ptr< T >
 
+using const_pointer = device_ptr< T >
 
+using reference = device_ref< T >
 
+using const_reference = device_ref< const T >
 
+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using is_always_equal = std::false_type
 
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+template<typename U >
 device_allocator (const device_allocator< U, Alignment > &other) noexcept
 
device_allocator (const sycl::queue &q) noexcept
 
device_allocator (const sycl::context &ctxt, const sycl::device &dev) noexcept
 
device_allocator (const device_allocator &)=default
 
+device_allocatoroperator= (const device_allocator &)=default
 
+pointer allocate (std::size_t size)
 
+void deallocate (pointer ptr, std::size_t n)
 
+bool operator== (const device_allocator &) const =default
 
+bool operator!= (const device_allocator &) const =default
 
+sycl::device get_device () const noexcept
 
+sycl::context get_context () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1device__ptr-members.html b/doxygen/classdr_1_1sp_1_1device__ptr-members.html new file mode 100644 index 0000000000..cb5a66fb67 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__ptr-members.html @@ -0,0 +1,130 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::device_ptr< T > Member List
+
+
+ +

This is the complete list of members for dr::sp::device_ptr< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
const_pointer typedef (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
const_pointer (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
device_ptr(T *pointer) noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
device_ptr() noexcept=default (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
device_ptr(const device_ptr &) noexcept=default (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
device_ptr(std::nullptr_t) noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
difference_type typedef (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
get_raw_pointer() const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
iterator_category typedef (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
local() const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
nonconst_pointer typedef (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
nonconst_pointer (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
operator const_pointer() const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator device_ptr< const void >() const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator device_ptr< void >() const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator!=(std::nullptr_t) const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator!=(const device_ptr &) const noexcept=default (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
operator*() const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator+(difference_type offset) const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator+ (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >friend
operator++() noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator++(int) noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator+=(difference_type offset) noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator-(difference_type offset) const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator-(const_pointer other) const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator-(pointer other) const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator--() noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator--(int) noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator-=(difference_type offset) noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator<(const_pointer other) const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator<=(const_pointer other) const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator=(const device_ptr &) noexcept=default (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
operator=(std::nullptr_t) noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator==(std::nullptr_t) const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator==(const device_ptr &) const noexcept=default (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
operator>(const_pointer other) const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator>=(const_pointer other) const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
operator[](difference_type offset) const noexcept (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >inline
pointer typedef (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
reference typedef (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
value_type typedef (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
~device_ptr() noexcept=default (defined in dr::sp::device_ptr< T >)dr::sp::device_ptr< T >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1device__ptr.html b/doxygen/classdr_1_1sp_1_1device__ptr.html new file mode 100644 index 0000000000..65bfb92af7 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__ptr.html @@ -0,0 +1,227 @@ + + + + + + + +Distributed Ranges: dr::sp::device_ptr< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Public Attributes | +Friends | +List of all members
+
dr::sp::device_ptr< T > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + +

+Public Types

+using value_type = T
 
+using difference_type = std::ptrdiff_t
 
+using pointer = device_ptr< T >
 
+using const_pointer = device_ptr< std::add_const_t< T > >
 
+using nonconst_pointer = device_ptr< std::remove_const_t< T > >
 
+using iterator_category = std::random_access_iterator_tag
 
+using reference = device_ref< T >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

device_ptr (T *pointer) noexcept
 
device_ptr (const device_ptr &) noexcept=default
 
+device_ptroperator= (const device_ptr &) noexcept=default
 
device_ptr (std::nullptr_t) noexcept
 
+device_ptroperator= (std::nullptr_t) noexcept
 
operator device_ptr< void > () const noexcept
 
operator device_ptr< const void > () const noexcept
 
operator const_pointer () const noexcept
 
+bool operator== (std::nullptr_t) const noexcept
 
+bool operator!= (std::nullptr_t) const noexcept
 
+bool operator== (const device_ptr &) const noexcept=default
 
+bool operator!= (const device_ptr &) const noexcept=default
 
+pointer operator+ (difference_type offset) const noexcept
 
+pointer operator- (difference_type offset) const noexcept
 
+difference_type operator- (const_pointer other) const noexcept
 
+difference_type operator- (pointer other) const noexcept
 
+bool operator< (const_pointer other) const noexcept
 
+bool operator> (const_pointer other) const noexcept
 
+bool operator<= (const_pointer other) const noexcept
 
+bool operator>= (const_pointer other) const noexcept
 
+pointeroperator++ () noexcept
 
+pointer operator++ (int) noexcept
 
+pointeroperator-- () noexcept
 
+pointer operator-- (int) noexcept
 
+pointeroperator+= (difference_type offset) noexcept
 
+pointeroperator-= (difference_type offset) noexcept
 
+reference operator* () const noexcept
 
+reference operator[] (difference_type offset) const noexcept
 
+T * get_raw_pointer () const noexcept
 
+T * local () const noexcept
 
+ + + + + +

+Public Attributes

+friend const_pointer
 
+friend nonconst_pointer
 
+ + + +

+Friends

+pointer operator+ (difference_type n, pointer iter)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1device__ref-members.html b/doxygen/classdr_1_1sp_1_1device__ref-members.html new file mode 100644 index 0000000000..29e8f3f78c --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__ref-members.html @@ -0,0 +1,95 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::device_ref< T > Member List
+
+
+ +

This is the complete list of members for dr::sp::device_ref< T >, including all inherited members.

+ + + + + + + + +
device_ref()=delete (defined in dr::sp::device_ref< T >)dr::sp::device_ref< T >
device_ref(const device_ref &)=default (defined in dr::sp::device_ref< T >)dr::sp::device_ref< T >
device_ref(T *pointer) (defined in dr::sp::device_ref< T >)dr::sp::device_ref< T >inline
operator T() const (defined in dr::sp::device_ref< T >)dr::sp::device_ref< T >inline
operator=(const T &value) const (defined in dr::sp::device_ref< T >)dr::sp::device_ref< T >inline
operator=(const device_ref &other) const (defined in dr::sp::device_ref< T >)dr::sp::device_ref< T >inline
~device_ref()=default (defined in dr::sp::device_ref< T >)dr::sp::device_ref< T >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1device__ref.html b/doxygen/classdr_1_1sp_1_1device__ref.html new file mode 100644 index 0000000000..8b9aafbb00 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__ref.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: dr::sp::device_ref< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::sp::device_ref< T > Class Template Reference
+
+
+ + + + + + + + + + + + +

+Public Member Functions

device_ref (const device_ref &)=default
 
device_ref (T *pointer)
 
operator T () const
 
+device_ref operator= (const T &value) const
 
+device_ref operator= (const device_ref &other) const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1device__span-members.html b/doxygen/classdr_1_1sp_1_1device__span-members.html new file mode 100644 index 0000000000..fd4a4b5e77 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__span-members.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::device_span< T, Iter > Member List
+
+
+ +

This is the complete list of members for dr::sp::device_span< T, Iter >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
begin() const noexcept (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
device_span() noexcept (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >inline
device_span(R &&r) (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >inline
device_span(R &&r, std::size_t rank) (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >inline
device_span(It first, std::size_t count, std::size_t rank) (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >inline
device_span(It first, End last, std::size_t rank) (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >inline
difference_type typedef (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >
empty() const noexcept (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
end() const noexcept (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
first(std::size_t n) const (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >inline
iterator typedef (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >
last(std::size_t n) const (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >inline
operator=(const span &) noexcept=default (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >
operator[](size_type index) const (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
rank() const noexcept (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >inline
reference typedef (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >
size() const noexcept (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
size_type typedef (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >
span(R &&r) (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
span(Iter first, Iter last) (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
span(Iter first, std::size_t count) (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
span()=default (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >
span(const span &) noexcept=default (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >
subspan(std::size_t offset, std::size_t count) const (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >inline
value_type typedef (defined in dr::sp::device_span< T, Iter >)dr::sp::device_span< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1device__span.html b/doxygen/classdr_1_1sp_1_1device__span.html new file mode 100644 index 0000000000..0c05e3c31a --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__span.html @@ -0,0 +1,217 @@ + + + + + + + +Distributed Ranges: dr::sp::device_span< T, Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::device_span< T, Iter > Class Template Reference
+
+
+
+Inheritance diagram for dr::sp::device_span< T, Iter >:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for dr::sp::device_span< T, Iter >:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using value_type = T
 
+using size_type = std::size_t
 
+using difference_type = std::size_t
 
+using reference = std::iter_reference_t< Iter >
 
- Public Types inherited from dr::sp::span< T, Iter >
+using value_type = std::iter_value_t< Iter >
 
+using size_type = std::size_t
 
+using difference_type = std::iter_difference_t< Iter >
 
+using reference = std::iter_reference_t< Iter >
 
+using iterator = Iter
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+template<rng::random_access_range R>
+requires (dr::remote_range<R>)
 device_span (R &&r)
 
+template<rng::random_access_range R>
 device_span (R &&r, std::size_t rank)
 
+template<class It >
constexpr device_span (It first, std::size_t count, std::size_t rank)
 
+template<class It , class End >
constexpr device_span (It first, End last, std::size_t rank)
 
+constexpr std::size_t rank () const noexcept
 
+device_span first (std::size_t n) const
 
+device_span last (std::size_t n) const
 
+device_span subspan (std::size_t offset, std::size_t count) const
 
- Public Member Functions inherited from dr::sp::span< T, Iter >
+template<rng::random_access_range R>
 span (R &&r)
 
span (Iter first, Iter last)
 
span (Iter first, std::size_t count)
 
span (const span &) noexcept=default
 
+spanoperator= (const span &) noexcept=default
 
+std::size_t size () const noexcept
 
+bool empty () const noexcept
 
+Iter begin () const noexcept
 
+Iter end () const noexcept
 
+reference operator[] (size_type index) const
 
+span first (size_type n) const
 
+span last (size_type n) const
 
+span subspan (std::size_t offset, std::size_t count) const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1device__span__coll__graph.map b/doxygen/classdr_1_1sp_1_1device__span__coll__graph.map new file mode 100644 index 0000000000..29ef7b1ade --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__span__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/classdr_1_1sp_1_1device__span__coll__graph.md5 b/doxygen/classdr_1_1sp_1_1device__span__coll__graph.md5 new file mode 100644 index 0000000000..85b959b29a --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__span__coll__graph.md5 @@ -0,0 +1 @@ +5f31eb58af854b2f5a815d6a249f0d9e \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1device__span__coll__graph.png b/doxygen/classdr_1_1sp_1_1device__span__coll__graph.png new file mode 100644 index 0000000000..a4ce5bd5c2 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1device__span__coll__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1device__span__inherit__graph.map b/doxygen/classdr_1_1sp_1_1device__span__inherit__graph.map new file mode 100644 index 0000000000..29ef7b1ade --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__span__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/classdr_1_1sp_1_1device__span__inherit__graph.md5 b/doxygen/classdr_1_1sp_1_1device__span__inherit__graph.md5 new file mode 100644 index 0000000000..85b959b29a --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__span__inherit__graph.md5 @@ -0,0 +1 @@ +5f31eb58af854b2f5a815d6a249f0d9e \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1device__span__inherit__graph.png b/doxygen/classdr_1_1sp_1_1device__span__inherit__graph.png new file mode 100644 index 0000000000..a4ce5bd5c2 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1device__span__inherit__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1device__vector-members.html b/doxygen/classdr_1_1sp_1_1device__vector-members.html new file mode 100644 index 0000000000..9364f3ea97 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__vector-members.html @@ -0,0 +1,95 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::device_vector< T, Allocator > Member List
+
+
+ +

This is the complete list of members for dr::sp::device_vector< T, Allocator >, including all inherited members.

+ + + + + + + + +
base typedef (defined in dr::sp::device_vector< T, Allocator >)dr::sp::device_vector< T, Allocator >
device_vector() noexcept (defined in dr::sp::device_vector< T, Allocator >)dr::sp::device_vector< T, Allocator >inline
device_vector(size_type count, const Allocator &alloc, size_type rank) (defined in dr::sp::device_vector< T, Allocator >)dr::sp::device_vector< T, Allocator >inline
difference_type typedef (defined in dr::sp::device_vector< T, Allocator >)dr::sp::device_vector< T, Allocator >
rank() const noexcept (defined in dr::sp::device_vector< T, Allocator >)dr::sp::device_vector< T, Allocator >inline
size_type typedef (defined in dr::sp::device_vector< T, Allocator >)dr::sp::device_vector< T, Allocator >
value_type typedef (defined in dr::sp::device_vector< T, Allocator >)dr::sp::device_vector< T, Allocator >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1device__vector.html b/doxygen/classdr_1_1sp_1_1device__vector.html new file mode 100644 index 0000000000..b7b3a404b2 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__vector.html @@ -0,0 +1,254 @@ + + + + + + + +Distributed Ranges: dr::sp::device_vector< T, Allocator > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::device_vector< T, Allocator > Class Template Reference
+
+
+
+Inheritance diagram for dr::sp::device_vector< T, Allocator >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::sp::device_vector< T, Allocator >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using base = dr::sp::vector< T, Allocator >
 
+using value_type = T
 
+using size_type = std::size_t
 
+using difference_type = std::size_t
 
- Public Types inherited from dr::sp::vector< T, Allocator >
+using value_type = T
 
+using allocator_type = Allocator
 
+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using pointer = typename std::allocator_traits< allocator_type >::pointer
 
+using const_pointer = typename std::allocator_traits< allocator_type >::const_pointer
 
+using reference = decltype(*std::declval< pointer >())
 
+using const_reference = decltype(*std::declval< const_pointer >())
 
+using iterator = pointer
 
+using const_iterator = const_pointer
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr device_vector (size_type count, const Allocator &alloc, size_type rank)
 
+constexpr std::size_t rank () const noexcept
 
- Public Member Functions inherited from dr::sp::vector< T, Allocator >
vector (const Allocator &allocator) noexcept
 
vector (size_type count, const T &value, const Allocator &alloc=Allocator())
 
vector (size_type count, const Allocator &alloc=Allocator())
 
+constexpr vector (Iter first, Iter last, const Allocator &alloc=Allocator())
 
vector (const vector &other)
 
vector (const vector &other, const Allocator &alloc)
 
vector (vector &&other) noexcept
 
vector (vector &&other, const Allocator &alloc) noexcept
 
vector (std::initializer_list< T > init, const Allocator &alloc=Allocator())
 
+vectoroperator= (const vector &other)
 
+void assign (Iter first, Iter last)
 
+size_type size () const noexcept
 
+bool empty () const noexcept
 
+size_type capacity () const noexcept
 
+pointer data () noexcept
 
+const_pointer data () const noexcept
 
+allocator_type get_allocator () const noexcept
 
+iterator begin () noexcept
 
+const_iterator begin () const noexcept
 
+iterator end () noexcept
 
+const_iterator end () const noexcept
 
+reference operator[] (size_type pos)
 
+const_reference operator[] (size_type pos) const
 
+void reserve (size_type new_cap)
 
+void push_back (const T &value)
 
+void push_back (T &&value)
 
+bool try_push_back (const T &value)
 
+void resize (size_type count)
 
+void resize (size_type count, const value_type &value)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1device__vector__coll__graph.map b/doxygen/classdr_1_1sp_1_1device__vector__coll__graph.map new file mode 100644 index 0000000000..6813076ebe --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__vector__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1device__vector__coll__graph.md5 b/doxygen/classdr_1_1sp_1_1device__vector__coll__graph.md5 new file mode 100644 index 0000000000..d360019607 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__vector__coll__graph.md5 @@ -0,0 +1 @@ +47e38a81836ea07904d6a2a85bf6ea85 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1device__vector__coll__graph.png b/doxygen/classdr_1_1sp_1_1device__vector__coll__graph.png new file mode 100644 index 0000000000..03b37cb788 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1device__vector__coll__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1device__vector__inherit__graph.map b/doxygen/classdr_1_1sp_1_1device__vector__inherit__graph.map new file mode 100644 index 0000000000..6813076ebe --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__vector__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1device__vector__inherit__graph.md5 b/doxygen/classdr_1_1sp_1_1device__vector__inherit__graph.md5 new file mode 100644 index 0000000000..d360019607 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1device__vector__inherit__graph.md5 @@ -0,0 +1 @@ +47e38a81836ea07904d6a2a85bf6ea85 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1device__vector__inherit__graph.png b/doxygen/classdr_1_1sp_1_1device__vector__inherit__graph.png new file mode 100644 index 0000000000..03b37cb788 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1device__vector__inherit__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1distributed__dense__matrix-members.html b/doxygen/classdr_1_1sp_1_1distributed__dense__matrix-members.html new file mode 100644 index 0000000000..d397c7c79d --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__dense__matrix-members.html @@ -0,0 +1,112 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::distributed_dense_matrix< T > Member List
+
+
+ +

This is the complete list of members for dr::sp::distributed_dense_matrix< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
begin() (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
const_reference typedef (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >
const_scalar_reference typedef (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >
difference_type typedef (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >
distributed_dense_matrix(key_type shape) (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
distributed_dense_matrix(key_type shape, const matrix_partition &partition) (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
end() (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
get_tile(key_type tile_index, const Allocator &alloc=Allocator{}) (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
get_tile_async(key_type tile_index, const Allocator &alloc=Allocator{}) (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
grid_shape() const noexcept (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
iterator typedef (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >
key_type typedef (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >
operator[](key_type index) (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
operator[](key_type index) const (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
reference typedef (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >
scalar_reference typedef (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >
segments() (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
shape() const noexcept (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
size() const noexcept (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
size_type typedef (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >
tile(key_type tile_index) (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
tile_shape() const noexcept (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
tiles() (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >inline
value_type typedef (defined in dr::sp::distributed_dense_matrix< T >)dr::sp::distributed_dense_matrix< T >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__dense__matrix.html b/doxygen/classdr_1_1sp_1_1distributed__dense__matrix.html new file mode 100644 index 0000000000..673291d651 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__dense__matrix.html @@ -0,0 +1,173 @@ + + + + + + + +Distributed Ranges: dr::sp::distributed_dense_matrix< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::distributed_dense_matrix< T > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using value_type = dr::sp::matrix_entry< T >
 
+using scalar_reference = rng::range_reference_t< dr::sp::device_vector< T, dr::sp::device_allocator< T > > >
 
+using const_scalar_reference = rng::range_reference_t< const dr::sp::device_vector< T, dr::sp::device_allocator< T > > >
 
+using reference = dr::sp::matrix_ref< T, scalar_reference >
 
+using const_reference = dr::sp::matrix_ref< const T, const_scalar_reference >
 
+using key_type = dr::index<>
 
+using iterator = distributed_dense_matrix_iterator< T, dr::sp::device_vector< T, dr::sp::device_allocator< T > > >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

distributed_dense_matrix (key_type shape)
 
distributed_dense_matrix (key_type shape, const matrix_partition &partition)
 
+size_type size () const noexcept
 
+key_type shape () const noexcept
 
+scalar_reference operator[] (key_type index)
 
+const_scalar_reference operator[] (key_type index) const
 
+iterator begin ()
 
+iterator end ()
 
+key_type tile_shape () const noexcept
 
+key_type grid_shape () const noexcept
 
+auto tile (key_type tile_index)
 
+std::vector< dense_matrix_view< T, rng::iterator_t< dr::sp::device_vector< T, dr::sp::device_allocator< T > > > > > tiles ()
 
+template<typename Allocator = std::allocator<T>>
auto get_tile (key_type tile_index, const Allocator &alloc=Allocator{})
 
+template<typename Allocator = std::allocator<T>>
auto get_tile_async (key_type tile_index, const Allocator &alloc=Allocator{})
 
+auto segments ()
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__dense__matrix__accessor-members.html b/doxygen/classdr_1_1sp_1_1distributed__dense__matrix__accessor-members.html new file mode 100644 index 0000000000..87c50a9a57 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__dense__matrix__accessor-members.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::distributed_dense_matrix_accessor< T, L > Member List
+
+
+ +

This is the complete list of members for dr::sp::distributed_dense_matrix_accessor< T, L >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
difference_type typedef (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
distributed_dense_matrix_accessor() noexcept=default (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
distributed_dense_matrix_accessor(const distributed_dense_matrix_accessor &) noexcept=default (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
distributed_dense_matrix_accessor(std::span< tile_type > tiles, key_type grid_idx, key_type tile_idx, key_type grid_shape, key_type tile_shape, key_type matrix_shape) noexcept (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >inline
iterator_accessor typedef (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
iterator_category typedef (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
key_type typedef (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
nonconst_iterator_accessor typedef (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
operator*() const noexcept (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >inline
operator+=(difference_type offset) noexcept (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >inline
operator=(const distributed_dense_matrix_accessor &) noexcept=default (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
operator==(const iterator_accessor &other) const noexcept (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >inline
reference typedef (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
scalar_reference typedef (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
scalar_value_type typedef (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
size_type typedef (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
tile_type typedef (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
value_type typedef (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
~distributed_dense_matrix_accessor() noexcept=default (defined in dr::sp::distributed_dense_matrix_accessor< T, L >)dr::sp::distributed_dense_matrix_accessor< T, L >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__dense__matrix__accessor.html b/doxygen/classdr_1_1sp_1_1distributed__dense__matrix__accessor.html new file mode 100644 index 0000000000..aafe6db2a7 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__dense__matrix__accessor.html @@ -0,0 +1,159 @@ + + + + + + + +Distributed Ranges: dr::sp::distributed_dense_matrix_accessor< T, L > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::distributed_dense_matrix_accessor< T, L > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using scalar_value_type = rng::range_value_t< L >
 
+using scalar_reference = rng::range_reference_t< L >
 
+using value_type = dr::sp::matrix_entry< scalar_value_type, std::size_t >
 
+using reference = dr::sp::matrix_ref< T, std::size_t, scalar_reference >
 
+using iterator_category = std::random_access_iterator_tag
 
+using iterator_accessor = distributed_dense_matrix_accessor
 
+using const_iterator_accessor = iterator_accessor
 
+using nonconst_iterator_accessor = iterator_accessor
 
+using tile_type = L
 
+using key_type = dr::index<>
 
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr distributed_dense_matrix_accessor (const distributed_dense_matrix_accessor &) noexcept=default
 
+constexpr distributed_dense_matrix_accessoroperator= (const distributed_dense_matrix_accessor &) noexcept=default
 
+constexpr distributed_dense_matrix_accessor (std::span< tile_type > tiles, key_type grid_idx, key_type tile_idx, key_type grid_shape, key_type tile_shape, key_type matrix_shape) noexcept
 
+constexpr distributed_dense_matrix_accessoroperator+= (difference_type offset) noexcept
 
+constexpr bool operator== (const iterator_accessor &other) const noexcept
 
+constexpr difference_type operator- (const iterator_accessor &other) const noexcept
 
+constexpr bool operator< (const iterator_accessor &other) const noexcept
 
+constexpr reference operator* () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__range__accessor-members.html b/doxygen/classdr_1_1sp_1_1distributed__range__accessor-members.html new file mode 100644 index 0000000000..36d5869f9c --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__range__accessor-members.html @@ -0,0 +1,107 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::distributed_range_accessor< Segments > Member List
+
+
+ +

This is the complete list of members for dr::sp::distributed_range_accessor< Segments >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
difference_type typedef (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
distributed_range_accessor() noexcept=default (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
distributed_range_accessor(const distributed_range_accessor &) noexcept=default (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
distributed_range_accessor(Segments segments, size_type segment_id, size_type idx) noexcept (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >inline
iterator_accessor typedef (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
iterator_category typedef (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
nonconst_iterator_accessor typedef (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
operator*() const noexcept (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >inline
operator+=(difference_type offset) noexcept (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >inline
operator=(const distributed_range_accessor &) noexcept=default (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
operator==(const iterator_accessor &other) const noexcept (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >inline
reference typedef (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
segment_type typedef (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
size_type typedef (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
value_type typedef (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
~distributed_range_accessor() noexcept=default (defined in dr::sp::distributed_range_accessor< Segments >)dr::sp::distributed_range_accessor< Segments >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__range__accessor.html b/doxygen/classdr_1_1sp_1_1distributed__range__accessor.html new file mode 100644 index 0000000000..1dfc8f4308 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__range__accessor.html @@ -0,0 +1,150 @@ + + + + + + + +Distributed Ranges: dr::sp::distributed_range_accessor< Segments > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::distributed_range_accessor< Segments > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + +

+Public Types

+using segment_type = rng::range_value_t< Segments >
 
+using value_type = rng::range_value_t< segment_type >
 
+using size_type = rng::range_size_t< segment_type >
 
+using difference_type = rng::range_difference_t< segment_type >
 
+using reference = rng::range_reference_t< segment_type >
 
+using iterator_category = std::random_access_iterator_tag
 
+using iterator_accessor = distributed_range_accessor
 
+using const_iterator_accessor = iterator_accessor
 
+using nonconst_iterator_accessor = iterator_accessor
 
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr distributed_range_accessor (const distributed_range_accessor &) noexcept=default
 
+constexpr distributed_range_accessoroperator= (const distributed_range_accessor &) noexcept=default
 
+constexpr distributed_range_accessor (Segments segments, size_type segment_id, size_type idx) noexcept
 
+constexpr distributed_range_accessoroperator+= (difference_type offset) noexcept
 
+constexpr bool operator== (const iterator_accessor &other) const noexcept
 
+constexpr difference_type operator- (const iterator_accessor &other) const noexcept
 
+constexpr bool operator< (const iterator_accessor &other) const noexcept
 
+constexpr reference operator* () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__span-members.html b/doxygen/classdr_1_1sp_1_1distributed__span-members.html new file mode 100644 index 0000000000..61e7b50005 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__span-members.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::distributed_span< T, L > Member List
+
+
+ +

This is the complete list of members for dr::sp::distributed_span< T, L >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
back() (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
begin() (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
difference_type typedef (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >
distributed_span() noexcept=default (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >
distributed_span(const distributed_span &) noexcept=default (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >
distributed_span(R &&segments) (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
distributed_span(R &&r) (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
element_type typedef (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >
empty() const noexcept (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
end() (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
first(size_type Count) const (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
front() (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
iterator typedef (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >
last(size_type Count) const (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
operator=(const distributed_span &) noexcept=default (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >
operator[](size_type idx) const (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
reference typedef (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >
segment_type typedef (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >
segments() (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
segments() const (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
size() const noexcept (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
size_bytes() const noexcept (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
size_type typedef (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >
subspan(size_type Offset, size_type Count=std::dynamic_extent) const (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >inline
value_type typedef (defined in dr::sp::distributed_span< T, L >)dr::sp::distributed_span< T, L >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__span.html b/doxygen/classdr_1_1sp_1_1distributed__span.html new file mode 100644 index 0000000000..6d24b3e2d2 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__span.html @@ -0,0 +1,192 @@ + + + + + + + +Distributed Ranges: dr::sp::distributed_span< T, L > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::distributed_span< T, L > Class Template Reference
+
+
+
+Inheritance diagram for dr::sp::distributed_span< T, L >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::sp::distributed_span< T, L >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

+using element_type = T
 
+using value_type = std::remove_cv_t< T >
 
+using segment_type = dr::sp::device_span< T, L >
 
+using size_type = rng::range_size_t< segment_type >
 
+using difference_type = rng::range_difference_t< segment_type >
 
+using reference = rng::range_reference_t< segment_type >
 
+using iterator = distributed_span_iterator< T, segment_type >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr distributed_span (const distributed_span &) noexcept=default
 
+constexpr distributed_spanoperator= (const distributed_span &) noexcept=default
 
+template<rng::input_range R>
+requires (dr::remote_range<rng::range_reference_t<R>>)
constexpr distributed_span (R &&segments)
 
+template<dr::distributed_range R>
constexpr distributed_span (R &&r)
 
+constexpr size_type size () const noexcept
 
+constexpr size_type size_bytes () const noexcept
 
+constexpr reference operator[] (size_type idx) const
 
+constexpr bool empty () const noexcept
 
+constexpr distributed_span subspan (size_type Offset, size_type Count=std::dynamic_extent) const
 
+constexpr distributed_span first (size_type Count) const
 
+constexpr distributed_span last (size_type Count) const
 
+iterator begin ()
 
+iterator end ()
 
+constexpr reference front ()
 
+constexpr reference back ()
 
+std::span< segment_typesegments ()
 
+std::span< const segment_typesegments () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__span__accessor-members.html b/doxygen/classdr_1_1sp_1_1distributed__span__accessor-members.html new file mode 100644 index 0000000000..f10a473301 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__span__accessor-members.html @@ -0,0 +1,109 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::distributed_span_accessor< T, L > Member List
+
+
+ +

This is the complete list of members for dr::sp::distributed_span_accessor< T, L >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
difference_type typedef (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
distributed_span_accessor() noexcept=default (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
distributed_span_accessor(const distributed_span_accessor &) noexcept=default (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
distributed_span_accessor(std::span< segment_type > segments, size_type segment_id, size_type idx) noexcept (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >inline
element_type typedef (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
iterator_accessor typedef (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
iterator_category typedef (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
nonconst_iterator_accessor typedef (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
operator*() const noexcept (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >inline
operator+=(difference_type offset) noexcept (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >inline
operator=(const distributed_span_accessor &) noexcept=default (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
operator==(const iterator_accessor &other) const noexcept (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >inline
reference typedef (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
segment_type typedef (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
segments() const noexcept (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >inline
size_type typedef (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
value_type typedef (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
~distributed_span_accessor() noexcept=default (defined in dr::sp::distributed_span_accessor< T, L >)dr::sp::distributed_span_accessor< T, L >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__span__accessor.html b/doxygen/classdr_1_1sp_1_1distributed__span__accessor.html new file mode 100644 index 0000000000..60288ac004 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__span__accessor.html @@ -0,0 +1,156 @@ + + + + + + + +Distributed Ranges: dr::sp::distributed_span_accessor< T, L > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::distributed_span_accessor< T, L > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using element_type = T
 
+using value_type = std::remove_cv_t< T >
 
+using segment_type = L
 
+using size_type = rng::range_size_t< segment_type >
 
+using difference_type = rng::range_difference_t< segment_type >
 
+using reference = rng::range_reference_t< segment_type >
 
+using iterator_category = std::random_access_iterator_tag
 
+using iterator_accessor = distributed_span_accessor
 
+using const_iterator_accessor = iterator_accessor
 
+using nonconst_iterator_accessor = iterator_accessor
 
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr distributed_span_accessor (const distributed_span_accessor &) noexcept=default
 
+constexpr distributed_span_accessoroperator= (const distributed_span_accessor &) noexcept=default
 
+constexpr distributed_span_accessor (std::span< segment_type > segments, size_type segment_id, size_type idx) noexcept
 
+constexpr distributed_span_accessoroperator+= (difference_type offset) noexcept
 
+constexpr bool operator== (const iterator_accessor &other) const noexcept
 
+constexpr difference_type operator- (const iterator_accessor &other) const noexcept
 
+constexpr bool operator< (const iterator_accessor &other) const noexcept
 
+constexpr reference operator* () const noexcept
 
+auto segments () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__span__coll__graph.map b/doxygen/classdr_1_1sp_1_1distributed__span__coll__graph.map new file mode 100644 index 0000000000..7098bc72ed --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__span__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__span__coll__graph.md5 b/doxygen/classdr_1_1sp_1_1distributed__span__coll__graph.md5 new file mode 100644 index 0000000000..e4ab789c51 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__span__coll__graph.md5 @@ -0,0 +1 @@ +61598c1a1bea9a2346a803da620153f9 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1distributed__span__coll__graph.png b/doxygen/classdr_1_1sp_1_1distributed__span__coll__graph.png new file mode 100644 index 0000000000..4fdb76734c Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1distributed__span__coll__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1distributed__span__inherit__graph.map b/doxygen/classdr_1_1sp_1_1distributed__span__inherit__graph.map new file mode 100644 index 0000000000..7098bc72ed --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__span__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__span__inherit__graph.md5 b/doxygen/classdr_1_1sp_1_1distributed__span__inherit__graph.md5 new file mode 100644 index 0000000000..e4ab789c51 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__span__inherit__graph.md5 @@ -0,0 +1 @@ +61598c1a1bea9a2346a803da620153f9 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1distributed__span__inherit__graph.png b/doxygen/classdr_1_1sp_1_1distributed__span__inherit__graph.png new file mode 100644 index 0000000000..4fdb76734c Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1distributed__span__inherit__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1distributed__vector__accessor-members.html b/doxygen/classdr_1_1sp_1_1distributed__vector__accessor-members.html new file mode 100644 index 0000000000..89905e1ac9 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__vector__accessor-members.html @@ -0,0 +1,111 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::distributed_vector_accessor< T, L > Member List
+
+
+ +

This is the complete list of members for dr::sp::distributed_vector_accessor< T, L >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
const_segment_type typedef (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
difference_type typedef (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
distributed_vector_accessor() noexcept=default (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
distributed_vector_accessor(const distributed_vector_accessor &) noexcept=default (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
distributed_vector_accessor(std::span< segment_type > segments, size_type segment_id, size_type idx, size_type segment_size) noexcept (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >inline
element_type typedef (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
iterator_accessor typedef (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
iterator_category typedef (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
nonconst_iterator_accessor typedef (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
nonconst_segment_type typedef (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
operator*() const noexcept (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >inline
operator+=(difference_type offset) noexcept (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >inline
operator=(const distributed_vector_accessor &) noexcept=default (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
operator==(const iterator_accessor &other) const noexcept (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >inline
reference typedef (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
segment_type typedef (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
segments() const noexcept (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >inline
size_type typedef (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
value_type typedef (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
~distributed_vector_accessor() noexcept=default (defined in dr::sp::distributed_vector_accessor< T, L >)dr::sp::distributed_vector_accessor< T, L >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1distributed__vector__accessor.html b/doxygen/classdr_1_1sp_1_1distributed__vector__accessor.html new file mode 100644 index 0000000000..cd1d1bf952 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1distributed__vector__accessor.html @@ -0,0 +1,162 @@ + + + + + + + +Distributed Ranges: dr::sp::distributed_vector_accessor< T, L > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::distributed_vector_accessor< T, L > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using element_type = T
 
+using value_type = std::remove_cv_t< T >
 
+using segment_type = L
 
+using const_segment_type = std::add_const_t< L >
 
+using nonconst_segment_type = std::remove_const_t< L >
 
+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using reference = rng::range_reference_t< segment_type >
 
+using iterator_category = std::random_access_iterator_tag
 
+using iterator_accessor = distributed_vector_accessor
 
+using const_iterator_accessor = iterator_accessor
 
+using nonconst_iterator_accessor = iterator_accessor
 
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr distributed_vector_accessor (const distributed_vector_accessor &) noexcept=default
 
+constexpr distributed_vector_accessoroperator= (const distributed_vector_accessor &) noexcept=default
 
+constexpr distributed_vector_accessor (std::span< segment_type > segments, size_type segment_id, size_type idx, size_type segment_size) noexcept
 
+constexpr distributed_vector_accessoroperator+= (difference_type offset) noexcept
 
+constexpr bool operator== (const iterator_accessor &other) const noexcept
 
+constexpr difference_type operator- (const iterator_accessor &other) const noexcept
 
+constexpr bool operator< (const iterator_accessor &other) const noexcept
 
+constexpr reference operator* () const noexcept
 
+auto segments () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1duplicated__vector-members.html b/doxygen/classdr_1_1sp_1_1duplicated__vector-members.html new file mode 100644 index 0000000000..50a793092b --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1duplicated__vector-members.html @@ -0,0 +1,97 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::duplicated_vector< T, Allocator > Member List
+
+
+ +

This is the complete list of members for dr::sp::duplicated_vector< T, Allocator >, including all inherited members.

+ + + + + + + + + + +
allocator_type typedef (defined in dr::sp::duplicated_vector< T, Allocator >)dr::sp::duplicated_vector< T, Allocator >
difference_type typedef (defined in dr::sp::duplicated_vector< T, Allocator >)dr::sp::duplicated_vector< T, Allocator >
duplicated_vector(std::size_t count=0) (defined in dr::sp::duplicated_vector< T, Allocator >)dr::sp::duplicated_vector< T, Allocator >inline
local_vector(std::size_t rank) (defined in dr::sp::duplicated_vector< T, Allocator >)dr::sp::duplicated_vector< T, Allocator >inline
local_vector(std::size_t rank) const (defined in dr::sp::duplicated_vector< T, Allocator >)dr::sp::duplicated_vector< T, Allocator >inline
segment_type typedef (defined in dr::sp::duplicated_vector< T, Allocator >)dr::sp::duplicated_vector< T, Allocator >
size() const noexcept (defined in dr::sp::duplicated_vector< T, Allocator >)dr::sp::duplicated_vector< T, Allocator >inline
size_type typedef (defined in dr::sp::duplicated_vector< T, Allocator >)dr::sp::duplicated_vector< T, Allocator >
value_type typedef (defined in dr::sp::duplicated_vector< T, Allocator >)dr::sp::duplicated_vector< T, Allocator >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1duplicated__vector.html b/doxygen/classdr_1_1sp_1_1duplicated__vector.html new file mode 100644 index 0000000000..328054570c --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1duplicated__vector.html @@ -0,0 +1,126 @@ + + + + + + + +Distributed Ranges: dr::sp::duplicated_vector< T, Allocator > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::duplicated_vector< T, Allocator > Class Template Reference
+
+
+ + + + + + + + + + + + +

+Public Types

+using segment_type = dr::sp::device_vector< T, Allocator >
 
+using value_type = T
 
+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using allocator_type = Allocator
 
+ + + + + + + + + +

+Public Member Functions

duplicated_vector (std::size_t count=0)
 
+size_type size () const noexcept
 
+segment_typelocal_vector (std::size_t rank)
 
+const segment_typelocal_vector (std::size_t rank) const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1future-members.html b/doxygen/classdr_1_1sp_1_1future-members.html new file mode 100644 index 0000000000..cb14e5776d --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1future-members.html @@ -0,0 +1,100 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::future< T, Event > Member List
+
+
+ +

This is the complete list of members for dr::sp::future< T, Event >, including all inherited members.

+ + + + + + + + + + + + + +
event_type typedef (defined in dr::sp::future< T, Event >)dr::sp::future< T, Event >
events() const (defined in dr::sp::future< T, Event >)dr::sp::future< T, Event >inline
future(std::unique_ptr< T > &&value, const std::vector< Event > &events) (defined in dr::sp::future< T, Event >)dr::sp::future< T, Event >inline
future(T &&value, const std::vector< Event > &events) (defined in dr::sp::future< T, Event >)dr::sp::future< T, Event >inline
future(future &&)=default (defined in dr::sp::future< T, Event >)dr::sp::future< T, Event >
future(const future &)=delete (defined in dr::sp::future< T, Event >)dr::sp::future< T, Event >
get() (defined in dr::sp::future< T, Event >)dr::sp::future< T, Event >inline
operator=(future &&)=default (defined in dr::sp::future< T, Event >)dr::sp::future< T, Event >
operator=(const future &)=delete (defined in dr::sp::future< T, Event >)dr::sp::future< T, Event >
update(const Event &event) (defined in dr::sp::future< T, Event >)dr::sp::future< T, Event >inline
value() const (defined in dr::sp::future< T, Event >)dr::sp::future< T, Event >inline
wait() (defined in dr::sp::future< T, Event >)dr::sp::future< T, Event >inline
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1future.html b/doxygen/classdr_1_1sp_1_1future.html new file mode 100644 index 0000000000..e10198468a --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1future.html @@ -0,0 +1,135 @@ + + + + + + + +Distributed Ranges: dr::sp::future< T, Event > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::future< T, Event > Class Template Reference
+
+
+ + + + +

+Public Types

+using event_type = Event
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

future (std::unique_ptr< T > &&value, const std::vector< Event > &events)
 
future (T &&value, const std::vector< Event > &events)
 
+void update (const Event &event)
 
future (future &&)=default
 
+futureoperator= (future &&)=default
 
future (const future &)=delete
 
+futureoperator= (const future &)=delete
 
+T get ()
 
+std::vector< Event > events () const
 
+T & value () const
 
+void wait ()
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1id-members.html b/doxygen/classdr_1_1sp_1_1id-members.html new file mode 100644 index 0000000000..f7c23b983e --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1id-members.html @@ -0,0 +1,94 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::id< dimensions > Member List
+
+
+ +

This is the complete list of members for dr::sp::id< dimensions >, including all inherited members.

+ + + + + + + +
get(int dimension) const (defined in dr::sp::id< dimensions >)dr::sp::id< dimensions >inline
id() noexcept=default (defined in dr::sp::id< dimensions >)dr::sp::id< dimensions >
id(std::size_t segment_id, std::size_t local_id, std::size_t global_id) (defined in dr::sp::id< dimensions >)dr::sp::id< dimensions >inline
local_id() const (defined in dr::sp::id< dimensions >)dr::sp::id< dimensions >inline
operator std::size_t() const (defined in dr::sp::id< dimensions >)dr::sp::id< dimensions >inline
segment() const (defined in dr::sp::id< dimensions >)dr::sp::id< dimensions >inline
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1id.html b/doxygen/classdr_1_1sp_1_1id.html new file mode 100644 index 0000000000..f021775930 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1id.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: dr::sp::id< dimensions > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::sp::id< dimensions > Class Template Reference
+
+
+ + + + + + + + + + + + +

+Public Member Functions

id (std::size_t segment_id, std::size_t local_id, std::size_t global_id)
 
+std::size_t get (int dimension) const
 
operator std::size_t () const
 
+std::size_t segment () const
 
+std::size_t local_id () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1matrix__entry-members.html b/doxygen/classdr_1_1sp_1_1matrix__entry-members.html new file mode 100644 index 0000000000..65668b6ad0 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1matrix__entry-members.html @@ -0,0 +1,107 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::matrix_entry< T, I > Member List
+
+
+ +

This is the complete list of members for dr::sp::matrix_entry< T, I >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
get() const noexcept (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >inline
index() const noexcept (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >inline
index_type typedef (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >
map_type typedef (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >
matrix_entry(dr::index< I > index, const map_type &value) (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >inline
matrix_entry(dr::index< I > index, map_type &&value) (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >inline
matrix_entry(dr::index< I > index, U &&value) (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >inline
matrix_entry(Entry &&entry) (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >inline
matrix_entry()=default (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >
matrix_entry(const matrix_entry &)=default (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >
matrix_entry(matrix_entry &&)=default (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >
operator matrix_entry< std::add_const_t< T >, U >() const noexcept (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >inline
operator matrix_entry< T, U >() const noexcept (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >inline
operator std::pair< std::pair< I, I >, T >() const noexcept (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >inline
operator<(const matrix_entry &other) const noexcept (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >inline
operator=(const matrix_entry &)=default (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >
operator=(matrix_entry &&)=default (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >
value() const noexcept (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >inline
~matrix_entry()=default (defined in dr::sp::matrix_entry< T, I >)dr::sp::matrix_entry< T, I >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1matrix__entry.html b/doxygen/classdr_1_1sp_1_1matrix__entry.html new file mode 100644 index 0000000000..598571397b --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1matrix__entry.html @@ -0,0 +1,158 @@ + + + + + + + +Distributed Ranges: dr::sp::matrix_entry< T, I > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::matrix_entry< T, I > Class Template Reference
+
+
+ + + + + + +

+Public Types

+using index_type = I
 
+using map_type = T
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

matrix_entry (dr::index< I > index, const map_type &value)
 
matrix_entry (dr::index< I > index, map_type &&value)
 
+template<typename U >
+requires (std::is_constructible_v<T, U>)
 matrix_entry (dr::index< I > index, U &&value)
 
+template<typename Entry >
 matrix_entry (Entry &&entry)
 
+template<std::size_t Index>
auto get () const noexcept
 
operator std::pair< std::pair< I, I >, T > () const noexcept
 
+dr::index< I > index () const noexcept
 
+map_type value () const noexcept
 
+template<std::integral U>
+requires (!std::is_same_v<I, U> && std::numeric_limits<U>::max() >= std::numeric_limits<I>::max())
 operator matrix_entry< T, U > () const noexcept
 
+template<std::integral U>
+requires (!std::is_const_v<T> && !std::is_same_v<I, U> && std::numeric_limits<U>::max() >= std::numeric_limits<I>::max())
 operator matrix_entry< std::add_const_t< T >, U > () const noexcept
 
+bool operator< (const matrix_entry &other) const noexcept
 
matrix_entry (const matrix_entry &)=default
 
matrix_entry (matrix_entry &&)=default
 
+matrix_entryoperator= (const matrix_entry &)=default
 
+matrix_entryoperator= (matrix_entry &&)=default
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1matrix__partition-members.html b/doxygen/classdr_1_1sp_1_1matrix__partition-members.html new file mode 100644 index 0000000000..6c48a4aa65 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1matrix__partition-members.html @@ -0,0 +1,93 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::matrix_partition Member List
+
+
+ +

This is the complete list of members for dr::sp::matrix_partition, including all inherited members.

+ + + + + + +
clone() const =0 (defined in dr::sp::matrix_partition)dr::sp::matrix_partitionpure virtual
grid_shape(dr::index<> matrix_shape) const =0 (defined in dr::sp::matrix_partition)dr::sp::matrix_partitionpure virtual
tile_rank(dr::index<> matrix_shape, dr::index<> tile_id) const =0 (defined in dr::sp::matrix_partition)dr::sp::matrix_partitionpure virtual
tile_shape(dr::index<> matrix_shape) const =0 (defined in dr::sp::matrix_partition)dr::sp::matrix_partitionpure virtual
~matrix_partition() (defined in dr::sp::matrix_partition)dr::sp::matrix_partitioninlinevirtual
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1matrix__partition.html b/doxygen/classdr_1_1sp_1_1matrix__partition.html new file mode 100644 index 0000000000..6ae6309d2e --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1matrix__partition.html @@ -0,0 +1,116 @@ + + + + + + + +Distributed Ranges: dr::sp::matrix_partition Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::sp::matrix_partition Class Referenceabstract
+
+
+
+Inheritance diagram for dr::sp::matrix_partition:
+
+
Inheritance graph
+ + + + +
[legend]
+ + + + + + + + + + +

+Public Member Functions

+virtual std::size_t tile_rank (dr::index<> matrix_shape, dr::index<> tile_id) const =0
 
+virtual dr::index grid_shape (dr::index<> matrix_shape) const =0
 
+virtual dr::index tile_shape (dr::index<> matrix_shape) const =0
 
+virtual std::unique_ptr< matrix_partitionclone () const =0
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1matrix__partition__inherit__graph.map b/doxygen/classdr_1_1sp_1_1matrix__partition__inherit__graph.map new file mode 100644 index 0000000000..f5ad551712 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1matrix__partition__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1matrix__partition__inherit__graph.md5 b/doxygen/classdr_1_1sp_1_1matrix__partition__inherit__graph.md5 new file mode 100644 index 0000000000..4ee6067725 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1matrix__partition__inherit__graph.md5 @@ -0,0 +1 @@ +080af13c76fb02ce13ea398b15c7fa50 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1matrix__partition__inherit__graph.png b/doxygen/classdr_1_1sp_1_1matrix__partition__inherit__graph.png new file mode 100644 index 0000000000..d4e3ee195c Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1matrix__partition__inherit__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1matrix__ref-members.html b/doxygen/classdr_1_1sp_1_1matrix__ref-members.html new file mode 100644 index 0000000000..2acbc5b6ac --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1matrix__ref-members.html @@ -0,0 +1,109 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::matrix_ref< T, I, TRef > Member List
+
+
+ +

This is the complete list of members for dr::sp::matrix_ref< T, I, TRef >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
get() const noexcept (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >inline
index() const noexcept (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >inline
index_type typedef (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >
key_type typedef (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >
map_type typedef (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >
matrix_ref(dr::index< I > index, scalar_reference value) (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >inline
matrix_ref()=delete (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >
matrix_ref(const matrix_ref &)=default (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >
matrix_ref(matrix_ref &&)=default (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >
operator matrix_ref< std::add_const_t< T >, U, TRef >() const noexcept (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >inline
operator matrix_ref< T, U, TRef >() const noexcept (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >inline
operator std::pair< std::pair< I, I >, T >() const noexcept (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >inline
operator value_type() const noexcept (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >inline
operator<(matrix_entry< T, I > other) const noexcept (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >inline
operator=(const matrix_ref &)=delete (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >
operator=(matrix_ref &&)=default (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >
scalar_reference typedef (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >
scalar_type typedef (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >
value() const noexcept (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >inline
value_type typedef (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >
~matrix_ref()=default (defined in dr::sp::matrix_ref< T, I, TRef >)dr::sp::matrix_ref< T, I, TRef >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1matrix__ref.html b/doxygen/classdr_1_1sp_1_1matrix__ref.html new file mode 100644 index 0000000000..64caf90595 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1matrix__ref.html @@ -0,0 +1,162 @@ + + + + + + + +Distributed Ranges: dr::sp::matrix_ref< T, I, TRef > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::matrix_ref< T, I, TRef > Class Template Reference
+
+
+ + + + + + + + + + + + + + +

+Public Types

+using scalar_type = T
 
+using index_type = I
 
+using key_type = dr::index< I >
 
+using map_type = T
 
+using scalar_reference = TRef
 
+using value_type = dr::sp::matrix_entry< T, I >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

matrix_ref (dr::index< I > index, scalar_reference value)
 
operator value_type () const noexcept
 
operator std::pair< std::pair< I, I >, T > () const noexcept
 
+template<std::size_t Index>
+requires (Index <= 1)
decltype(auto) get () const noexcept
 
+dr::index< I > index () const noexcept
 
+scalar_reference value () const noexcept
 
+template<std::integral U>
+requires (!std::is_same_v<I, U> && std::numeric_limits<U>::max() >= std::numeric_limits<I>::max())
 operator matrix_ref< T, U, TRef > () const noexcept
 
+template<std::integral U>
+requires (!std::is_const_v<T> && !std::is_same_v<I, U> && std::numeric_limits<U>::max() >= std::numeric_limits<I>::max())
 operator matrix_ref< std::add_const_t< T >, U, TRef > () const noexcept
 
+bool operator< (matrix_entry< T, I > other) const noexcept
 
matrix_ref (const matrix_ref &)=default
 
+matrix_refoperator= (const matrix_ref &)=delete
 
matrix_ref (matrix_ref &&)=default
 
+matrix_refoperator= (matrix_ref &&)=default
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1segment__range-members.html b/doxygen/classdr_1_1sp_1_1segment__range-members.html new file mode 100644 index 0000000000..a2cf3bdd2b --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1segment__range-members.html @@ -0,0 +1,99 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::segment_range< dimensions > Member List
+
+
+ +

This is the complete list of members for dr::sp::segment_range< dimensions >, including all inherited members.

+ + + + + + + + + + + + +
begin() const (defined in dr::sp::segment_range< dimensions >)dr::sp::segment_range< dimensions >inline
different_type typedef (defined in dr::sp::segment_range< dimensions >)dr::sp::segment_range< dimensions >
end() const (defined in dr::sp::segment_range< dimensions >)dr::sp::segment_range< dimensions >inline
iterator typedef (defined in dr::sp::segment_range< dimensions >)dr::sp::segment_range< dimensions >
operator[](std::size_t idx) (defined in dr::sp::segment_range< dimensions >)dr::sp::segment_range< dimensions >inline
rank() const noexcept (defined in dr::sp::segment_range< dimensions >)dr::sp::segment_range< dimensions >inline
reference typedef (defined in dr::sp::segment_range< dimensions >)dr::sp::segment_range< dimensions >
segment_range(std::size_t segment_id, std::size_t segment_size, std::size_t global_offset) (defined in dr::sp::segment_range< dimensions >)dr::sp::segment_range< dimensions >inline
size() const noexcept (defined in dr::sp::segment_range< dimensions >)dr::sp::segment_range< dimensions >inline
size_type typedef (defined in dr::sp::segment_range< dimensions >)dr::sp::segment_range< dimensions >
value_type typedef (defined in dr::sp::segment_range< dimensions >)dr::sp::segment_range< dimensions >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1segment__range.html b/doxygen/classdr_1_1sp_1_1segment__range.html new file mode 100644 index 0000000000..83f9e960fb --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1segment__range.html @@ -0,0 +1,132 @@ + + + + + + + +Distributed Ranges: dr::sp::segment_range< dimensions > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::segment_range< dimensions > Class Template Reference
+
+
+ + + + + + + + + + + + +

+Public Types

+using value_type = id< dimensions >
 
+using size_type = std::size_t
 
+using different_type = std::ptrdiff_t
 
+using reference = value_type
 
+using iterator = segment_range_iterator
 
+ + + + + + + + + + + + + +

+Public Member Functions

segment_range (std::size_t segment_id, std::size_t segment_size, std::size_t global_offset)
 
+iterator begin () const
 
+iterator end () const
 
+size_type size () const noexcept
 
+value_type operator[] (std::size_t idx)
 
+size_type rank () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1segment__range__accessor-members.html b/doxygen/classdr_1_1sp_1_1segment__range__accessor-members.html new file mode 100644 index 0000000000..858bd34eef --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1segment__range__accessor-members.html @@ -0,0 +1,107 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::segment_range_accessor Member List
+
+
+ +

This is the complete list of members for dr::sp::segment_range_accessor, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
difference_type typedef (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
element_type typedef (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
iterator_accessor typedef (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
iterator_category typedef (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
nonconst_iterator_accessor typedef (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
operator*() const noexcept (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessorinline
operator+=(difference_type offset) noexcept (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessorinline
operator-(const iterator_accessor &other) const noexcept (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessorinline
operator<(const iterator_accessor &other) const noexcept (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessorinline
operator=(const segment_range_accessor &) noexcept=default (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
operator==(const iterator_accessor &other) const noexcept (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessorinline
reference typedef (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
segment_range_accessor() noexcept=default (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
segment_range_accessor(const segment_range_accessor &) noexcept=default (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
segment_range_accessor(size_type segment_id, size_type idx, size_type global_offset) noexcept (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessorinline
size_type typedef (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
value_type typedef (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
~segment_range_accessor() noexcept=default (defined in dr::sp::segment_range_accessor)dr::sp::segment_range_accessor
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1segment__range__accessor.html b/doxygen/classdr_1_1sp_1_1segment__range__accessor.html new file mode 100644 index 0000000000..862646c47b --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1segment__range__accessor.html @@ -0,0 +1,150 @@ + + + + + + + +Distributed Ranges: dr::sp::segment_range_accessor Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::segment_range_accessor Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + +

+Public Types

+using element_type = id< 1 >
 
+using value_type = element_type
 
+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using reference = value_type
 
+using iterator_category = std::random_access_iterator_tag
 
+using iterator_accessor = segment_range_accessor
 
+using const_iterator_accessor = iterator_accessor
 
+using nonconst_iterator_accessor = iterator_accessor
 
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr segment_range_accessor (const segment_range_accessor &) noexcept=default
 
+constexpr segment_range_accessoroperator= (const segment_range_accessor &) noexcept=default
 
+constexpr segment_range_accessor (size_type segment_id, size_type idx, size_type global_offset) noexcept
 
+constexpr segment_range_accessoroperator+= (difference_type offset) noexcept
 
+constexpr bool operator== (const iterator_accessor &other) const noexcept
 
+constexpr difference_type operator- (const iterator_accessor &other) const noexcept
 
+constexpr bool operator< (const iterator_accessor &other) const noexcept
 
+reference operator* () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1span-members.html b/doxygen/classdr_1_1sp_1_1span-members.html new file mode 100644 index 0000000000..bc829a3930 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1span-members.html @@ -0,0 +1,107 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::span< T, Iter > Member List
+
+
+ +

This is the complete list of members for dr::sp::span< T, Iter >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
begin() const noexcept (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
difference_type typedef (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >
empty() const noexcept (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
end() const noexcept (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
first(size_type n) const (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
iterator typedef (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >
last(size_type n) const (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
operator=(const span &) noexcept=default (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >
operator[](size_type index) const (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
reference typedef (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >
size() const noexcept (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
size_type typedef (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >
span(R &&r) (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
span(Iter first, Iter last) (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
span(Iter first, std::size_t count) (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
span()=default (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >
span(const span &) noexcept=default (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >
subspan(std::size_t offset, std::size_t count) const (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >inline
value_type typedef (defined in dr::sp::span< T, Iter >)dr::sp::span< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1span.html b/doxygen/classdr_1_1sp_1_1span.html new file mode 100644 index 0000000000..65a8f21035 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1span.html @@ -0,0 +1,173 @@ + + + + + + + +Distributed Ranges: dr::sp::span< T, Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::span< T, Iter > Class Template Reference
+
+
+
+Inheritance diagram for dr::sp::span< T, Iter >:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for dr::sp::span< T, Iter >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + +

+Public Types

+using value_type = std::iter_value_t< Iter >
 
+using size_type = std::size_t
 
+using difference_type = std::iter_difference_t< Iter >
 
+using reference = std::iter_reference_t< Iter >
 
+using iterator = Iter
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+template<rng::random_access_range R>
 span (R &&r)
 
span (Iter first, Iter last)
 
span (Iter first, std::size_t count)
 
span (const span &) noexcept=default
 
+spanoperator= (const span &) noexcept=default
 
+std::size_t size () const noexcept
 
+bool empty () const noexcept
 
+Iter begin () const noexcept
 
+Iter end () const noexcept
 
+reference operator[] (size_type index) const
 
+span first (size_type n) const
 
+span last (size_type n) const
 
+span subspan (std::size_t offset, std::size_t count) const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1span__coll__graph.map b/doxygen/classdr_1_1sp_1_1span__coll__graph.map new file mode 100644 index 0000000000..d90885f0b3 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1span__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1span__coll__graph.md5 b/doxygen/classdr_1_1sp_1_1span__coll__graph.md5 new file mode 100644 index 0000000000..efe1bf6d6c --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1span__coll__graph.md5 @@ -0,0 +1 @@ +4574556b396bd81b17bcc1b14e5f7bad \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1span__coll__graph.png b/doxygen/classdr_1_1sp_1_1span__coll__graph.png new file mode 100644 index 0000000000..44b5ca2803 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1span__coll__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1span__inherit__graph.map b/doxygen/classdr_1_1sp_1_1span__inherit__graph.map new file mode 100644 index 0000000000..499bfbd328 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1span__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/classdr_1_1sp_1_1span__inherit__graph.md5 b/doxygen/classdr_1_1sp_1_1span__inherit__graph.md5 new file mode 100644 index 0000000000..eafe33d643 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1span__inherit__graph.md5 @@ -0,0 +1 @@ +f98117b75add6b37e32e4c21f585d518 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1span__inherit__graph.png b/doxygen/classdr_1_1sp_1_1span__inherit__graph.png new file mode 100644 index 0000000000..bf294f0797 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1span__inherit__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1sparse__matrix-members.html b/doxygen/classdr_1_1sp_1_1sparse__matrix-members.html new file mode 100644 index 0000000000..2733931d83 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1sparse__matrix-members.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::sparse_matrix< T, I > Member List
+
+
+ +

This is the complete list of members for dr::sp::sparse_matrix< T, I >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
begin() (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
const_reference typedef (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >
const_scalar_reference typedef (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >
copy_tile(key_type tile_index, csr_matrix_view< T, I, Args... > tile_view) (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
copy_tile_async(key_type tile_index, csr_matrix_view< T, I, Args... > tile_view) (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
difference_type typedef (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >
end() (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
grid_shape() const noexcept (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
iterator typedef (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >
key_type typedef (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >
reference typedef (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >
scalar_reference typedef (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >
segment_type typedef (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >
segments() (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
shape() const noexcept (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
size() const noexcept (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
size_type typedef (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >
sparse_matrix(key_type shape) (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
sparse_matrix(key_type shape, double density) (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
sparse_matrix(key_type shape, double density, const matrix_partition &partition) (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
sparse_matrix(key_type shape, const matrix_partition &partition) (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
tile(key_type tile_index) (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
tile_shape() const noexcept (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
tiles() (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >inline
value_type typedef (defined in dr::sp::sparse_matrix< T, I >)dr::sp::sparse_matrix< T, I >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1sparse__matrix.html b/doxygen/classdr_1_1sp_1_1sparse__matrix.html new file mode 100644 index 0000000000..3eaf9f28f5 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1sparse__matrix.html @@ -0,0 +1,176 @@ + + + + + + + +Distributed Ranges: dr::sp::sparse_matrix< T, I > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::sparse_matrix< T, I > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using value_type = dr::sp::matrix_entry< T >
 
+using scalar_reference = rng::range_reference_t< dr::sp::device_vector< T, dr::sp::device_allocator< T > > >
 
+using const_scalar_reference = rng::range_reference_t< const dr::sp::device_vector< T, dr::sp::device_allocator< T > > >
 
+using reference = dr::sp::matrix_ref< T, scalar_reference >
 
+using const_reference = dr::sp::matrix_ref< const T, const_scalar_reference >
 
+using key_type = dr::index< I >
 
+using segment_type = dr::sp::csr_matrix_view< T, I, rng::iterator_t< dr::sp::device_vector< T, dr::sp::device_allocator< T > > >, rng::iterator_t< dr::sp::device_vector< I, dr::sp::device_allocator< I > > > >
 
+using iterator = distributed_sparse_matrix_iterator< std::span< segment_type > && >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

sparse_matrix (key_type shape)
 
sparse_matrix (key_type shape, double density)
 
sparse_matrix (key_type shape, double density, const matrix_partition &partition)
 
sparse_matrix (key_type shape, const matrix_partition &partition)
 
+size_type size () const noexcept
 
+key_type shape () const noexcept
 
+iterator begin ()
 
+iterator end ()
 
+segment_type tile (key_type tile_index)
 
+template<typename... Args>
auto copy_tile_async (key_type tile_index, csr_matrix_view< T, I, Args... > tile_view)
 
+template<typename... Args>
void copy_tile (key_type tile_index, csr_matrix_view< T, I, Args... > tile_view)
 
+key_type tile_shape () const noexcept
 
+key_type grid_shape () const noexcept
 
+std::span< segment_typetiles ()
 
+std::span< segment_typesegments ()
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1vector-members.html b/doxygen/classdr_1_1sp_1_1vector-members.html new file mode 100644 index 0000000000..7f6d61c0e9 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1vector-members.html @@ -0,0 +1,129 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::vector< T, Allocator > Member List
+
+
+ +

This is the complete list of members for dr::sp::vector< T, Allocator >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
allocator_type typedef (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >
assign(Iter first, Iter last) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
begin() noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
begin() const noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
capacity() const noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
const_iterator typedef (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >
const_pointer typedef (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >
const_reference typedef (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >
data() noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
data() const noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
difference_type typedef (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >
empty() const noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
end() noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
end() const noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
get_allocator() const noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
iterator typedef (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >
operator=(const vector &other) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
operator[](size_type pos) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
operator[](size_type pos) const (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
pointer typedef (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >
push_back(const T &value) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
push_back(T &&value) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
reference typedef (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >
reserve(size_type new_cap) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
resize(size_type count) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
resize(size_type count, const value_type &value) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
size() const noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
size_type typedef (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >
try_push_back(const T &value) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
value_type typedef (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >
vector() noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
vector(const Allocator &allocator) noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inlineexplicit
vector(size_type count, const T &value, const Allocator &alloc=Allocator()) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inlineexplicit
vector(size_type count, const Allocator &alloc=Allocator()) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inlineexplicit
vector(Iter first, Iter last, const Allocator &alloc=Allocator()) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
vector(const vector &other) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
vector(const vector &other, const Allocator &alloc) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
vector(vector &&other) noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
vector(vector &&other, const Allocator &alloc) noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
vector(std::initializer_list< T > init, const Allocator &alloc=Allocator()) (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
~vector() noexcept (defined in dr::sp::vector< T, Allocator >)dr::sp::vector< T, Allocator >inline
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1vector.html b/doxygen/classdr_1_1sp_1_1vector.html new file mode 100644 index 0000000000..a96b04fd9e --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1vector.html @@ -0,0 +1,218 @@ + + + + + + + +Distributed Ranges: dr::sp::vector< T, Allocator > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::vector< T, Allocator > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using value_type = T
 
+using allocator_type = Allocator
 
+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using pointer = typename std::allocator_traits< allocator_type >::pointer
 
+using const_pointer = typename std::allocator_traits< allocator_type >::const_pointer
 
+using reference = decltype(*std::declval< pointer >())
 
+using const_reference = decltype(*std::declval< const_pointer >())
 
+using iterator = pointer
 
+using const_iterator = const_pointer
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

vector (const Allocator &allocator) noexcept
 
vector (size_type count, const T &value, const Allocator &alloc=Allocator())
 
vector (size_type count, const Allocator &alloc=Allocator())
 
+template<std::forward_iterator Iter>
constexpr vector (Iter first, Iter last, const Allocator &alloc=Allocator())
 
vector (const vector &other)
 
vector (const vector &other, const Allocator &alloc)
 
vector (vector &&other) noexcept
 
vector (vector &&other, const Allocator &alloc) noexcept
 
vector (std::initializer_list< T > init, const Allocator &alloc=Allocator())
 
+vectoroperator= (const vector &other)
 
+template<std::forward_iterator Iter>
void assign (Iter first, Iter last)
 
+size_type size () const noexcept
 
+bool empty () const noexcept
 
+size_type capacity () const noexcept
 
+pointer data () noexcept
 
+const_pointer data () const noexcept
 
+allocator_type get_allocator () const noexcept
 
+iterator begin () noexcept
 
+iterator end () noexcept
 
+const_iterator begin () const noexcept
 
+const_iterator end () const noexcept
 
+reference operator[] (size_type pos)
 
+const_reference operator[] (size_type pos) const
 
+void reserve (size_type new_cap)
 
+void push_back (const T &value)
 
+void push_back (T &&value)
 
+bool try_push_back (const T &value)
 
+void resize (size_type count)
 
+void resize (size_type count, const value_type &value)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1views_1_1enumerate__adapter__closure-members.html b/doxygen/classdr_1_1sp_1_1views_1_1enumerate__adapter__closure-members.html new file mode 100644 index 0000000000..61dfe06bcf --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1views_1_1enumerate__adapter__closure-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::views::enumerate_adapter_closure Member List
+
+
+ +

This is the complete list of members for dr::sp::views::enumerate_adapter_closure, including all inherited members.

+ + + +
operator()(R &&r) const (defined in dr::sp::views::enumerate_adapter_closure)dr::sp::views::enumerate_adapter_closureinline
operator| (defined in dr::sp::views::enumerate_adapter_closure)dr::sp::views::enumerate_adapter_closurefriend
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1views_1_1enumerate__adapter__closure.html b/doxygen/classdr_1_1sp_1_1views_1_1enumerate__adapter__closure.html new file mode 100644 index 0000000000..3f5a6c4013 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1views_1_1enumerate__adapter__closure.html @@ -0,0 +1,108 @@ + + + + + + + +Distributed Ranges: dr::sp::views::enumerate_adapter_closure Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Friends | +List of all members
+
dr::sp::views::enumerate_adapter_closure Class Reference
+
+
+ + + + + +

+Public Member Functions

+template<rng::viewable_range R>
+requires (rng::sized_range<R>)
auto operator() (R &&r) const
 
+ + + + +

+Friends

+template<rng::viewable_range R>
auto operator| (R &&r, const enumerate_adapter_closure &closure)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1views_1_1enumerate__fn__-members.html b/doxygen/classdr_1_1sp_1_1views_1_1enumerate__fn__-members.html new file mode 100644 index 0000000000..dfcc70f582 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1views_1_1enumerate__fn__-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::views::enumerate_fn_ Member List
+
+
+ +

This is the complete list of members for dr::sp::views::enumerate_fn_, including all inherited members.

+ + + +
enumerate() const (defined in dr::sp::views::enumerate_fn_)dr::sp::views::enumerate_fn_inline
operator()(R &&r) const (defined in dr::sp::views::enumerate_fn_)dr::sp::views::enumerate_fn_inline
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1views_1_1enumerate__fn__.html b/doxygen/classdr_1_1sp_1_1views_1_1enumerate__fn__.html new file mode 100644 index 0000000000..e86738129b --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1views_1_1enumerate__fn__.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: dr::sp::views::enumerate_fn_ Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::sp::views::enumerate_fn_ Class Reference
+
+
+ + + + + + + +

+Public Member Functions

+template<rng::viewable_range R>
constexpr auto operator() (R &&r) const
 
+auto enumerate () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1views_1_1slice__adaptor__closure-members.html b/doxygen/classdr_1_1sp_1_1views_1_1slice__adaptor__closure-members.html new file mode 100644 index 0000000000..ae3dd2134c --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1views_1_1slice__adaptor__closure-members.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::views::slice_adaptor_closure Member List
+
+
+ +

This is the complete list of members for dr::sp::views::slice_adaptor_closure, including all inherited members.

+ + + + +
operator()(R &&r) const (defined in dr::sp::views::slice_adaptor_closure)dr::sp::views::slice_adaptor_closureinline
operator| (defined in dr::sp::views::slice_adaptor_closure)dr::sp::views::slice_adaptor_closurefriend
slice_adaptor_closure(dr::index<> slice_indices) (defined in dr::sp::views::slice_adaptor_closure)dr::sp::views::slice_adaptor_closureinline
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1views_1_1slice__adaptor__closure.html b/doxygen/classdr_1_1sp_1_1views_1_1slice__adaptor__closure.html new file mode 100644 index 0000000000..d35ce0f20b --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1views_1_1slice__adaptor__closure.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: dr::sp::views::slice_adaptor_closure Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Friends | +List of all members
+
dr::sp::views::slice_adaptor_closure Class Reference
+
+
+ + + + + + + +

+Public Member Functions

slice_adaptor_closure (dr::index<> slice_indices)
 
+template<rng::random_access_range R>
auto operator() (R &&r) const
 
+ + + + +

+Friends

+template<rng::random_access_range R>
auto operator| (R &&r, const slice_adaptor_closure &closure)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1zip__accessor-members.html b/doxygen/classdr_1_1sp_1_1zip__accessor-members.html new file mode 100644 index 0000000000..c54e0218af --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1zip__accessor-members.html @@ -0,0 +1,107 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::zip_accessor< Iters > Member List
+
+
+ +

This is the complete list of members for dr::sp::zip_accessor< Iters >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
difference_type typedef (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
element_type typedef (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
iterator_accessor typedef (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
iterator_category typedef (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
nonconst_iterator_accessor typedef (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
operator*() const noexcept (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >inline
operator+=(difference_type offset) (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >inline
operator=(const zip_accessor &) noexcept=default (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
operator==(const iterator_accessor &other) const noexcept (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >inline
reference typedef (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
size_type typedef (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
value_type typedef (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
zip_accessor() noexcept=default (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
zip_accessor(const zip_accessor &) noexcept=default (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
zip_accessor(Iters... iters) (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >inline
~zip_accessor() noexcept=default (defined in dr::sp::zip_accessor< Iters >)dr::sp::zip_accessor< Iters >
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1zip__accessor.html b/doxygen/classdr_1_1sp_1_1zip__accessor.html new file mode 100644 index 0000000000..ea67934acc --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1zip__accessor.html @@ -0,0 +1,150 @@ + + + + + + + +Distributed Ranges: dr::sp::zip_accessor< Iters > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::sp::zip_accessor< Iters > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + +

+Public Types

+using element_type = __detail::tuple_or_pair_t< std::iter_value_t< Iters >... >
 
+using value_type = element_type
 
+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+using reference = __detail::tuple_or_pair_t< std::iter_reference_t< Iters >... >
 
+using iterator_category = std::random_access_iterator_tag
 
+using iterator_accessor = zip_accessor
 
+using const_iterator_accessor = iterator_accessor
 
+using nonconst_iterator_accessor = iterator_accessor
 
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

+constexpr zip_accessor (const zip_accessor &) noexcept=default
 
+constexpr zip_accessoroperator= (const zip_accessor &) noexcept=default
 
+constexpr zip_accessor (Iters... iters)
 
+zip_accessoroperator+= (difference_type offset)
 
+constexpr bool operator== (const iterator_accessor &other) const noexcept
 
+constexpr difference_type operator- (const iterator_accessor &other) const noexcept
 
+constexpr bool operator< (const iterator_accessor &other) const noexcept
 
+constexpr reference operator* () const noexcept
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1zip__view-members.html b/doxygen/classdr_1_1sp_1_1zip__view-members.html new file mode 100644 index 0000000000..d1df74ae74 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1zip__view-members.html @@ -0,0 +1,101 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::zip_view< Rs > Member List
+
+
+ +

This is the complete list of members for dr::sp::zip_view< Rs >, including all inherited members.

+ + + + + + + + + + + + + + +
begin() const (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >inline
difference_type typedef (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >
end() const (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >inline
get_view() const (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >inline
local() const noexcept (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >inline
num_views (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >static
operator[](std::size_t idx) const (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >inline
rank() const (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >inline
segments() const (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >inline
size() const noexcept (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >inline
size_type typedef (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >
zip_view(Rs... rs) (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >inline
zipped_segments() const (defined in dr::sp::zip_view< Rs >)dr::sp::zip_view< Rs >inline
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1zip__view.html b/doxygen/classdr_1_1sp_1_1zip__view.html new file mode 100644 index 0000000000..bf2b5a4dcc --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1zip__view.html @@ -0,0 +1,169 @@ + + + + + + + +Distributed Ranges: dr::sp::zip_view< Rs > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Static Public Attributes | +List of all members
+
dr::sp::zip_view< Rs > Class Template Reference
+
+
+ +

zip + More...

+ +

#include <zip_view.hpp>

+
+Inheritance diagram for dr::sp::zip_view< Rs >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::sp::zip_view< Rs >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + +

+Public Types

+using size_type = std::size_t
 
+using difference_type = std::ptrdiff_t
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

zip_view (Rs... rs)
 
+std::size_t size () const noexcept
 
+auto begin () const
 
+auto end () const
 
+auto operator[] (std::size_t idx) const
 
+template<std::size_t I>
decltype(auto) get_view () const
 
+auto segments () const
 
+auto zipped_segments () const
 
+auto local () const noexcept
 
+std::size_t rank () const
 
+ + + +

+Static Public Attributes

+static constexpr bool num_views = sizeof...(Rs)
 
+

Detailed Description

+
template<rng::random_access_range... Rs>
+class dr::sp::zip_view< Rs >

zip

+

The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1sp_1_1zip__view__coll__graph.map b/doxygen/classdr_1_1sp_1_1zip__view__coll__graph.map new file mode 100644 index 0000000000..3ea2945c51 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1zip__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1zip__view__coll__graph.md5 b/doxygen/classdr_1_1sp_1_1zip__view__coll__graph.md5 new file mode 100644 index 0000000000..45c3a9debc --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1zip__view__coll__graph.md5 @@ -0,0 +1 @@ +10112d5bff88d99c157b9ad1ed59b028 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1zip__view__coll__graph.png b/doxygen/classdr_1_1sp_1_1zip__view__coll__graph.png new file mode 100644 index 0000000000..1fe8f4e997 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1zip__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1sp_1_1zip__view__inherit__graph.map b/doxygen/classdr_1_1sp_1_1zip__view__inherit__graph.map new file mode 100644 index 0000000000..3ea2945c51 --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1zip__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1sp_1_1zip__view__inherit__graph.md5 b/doxygen/classdr_1_1sp_1_1zip__view__inherit__graph.md5 new file mode 100644 index 0000000000..45c3a9debc --- /dev/null +++ b/doxygen/classdr_1_1sp_1_1zip__view__inherit__graph.md5 @@ -0,0 +1 @@ +10112d5bff88d99c157b9ad1ed59b028 \ No newline at end of file diff --git a/doxygen/classdr_1_1sp_1_1zip__view__inherit__graph.png b/doxygen/classdr_1_1sp_1_1zip__view__inherit__graph.png new file mode 100644 index 0000000000..1fe8f4e997 Binary files /dev/null and b/doxygen/classdr_1_1sp_1_1zip__view__inherit__graph.png differ diff --git a/doxygen/classdr_1_1timer-members.html b/doxygen/classdr_1_1timer-members.html new file mode 100644 index 0000000000..88e88fcf34 --- /dev/null +++ b/doxygen/classdr_1_1timer-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::timer Member List
+
+
+ +

This is the complete list of members for dr::timer, including all inherited members.

+ + + +
elapsed() (defined in dr::timer)dr::timerinline
timer() (defined in dr::timer)dr::timerinline
+ + + + diff --git a/doxygen/classdr_1_1timer.html b/doxygen/classdr_1_1timer.html new file mode 100644 index 0000000000..40037d80ed --- /dev/null +++ b/doxygen/classdr_1_1timer.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::timer Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::timer Class Reference
+
+
+ + + + +

+Public Member Functions

+auto elapsed ()
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1transform__iterator-members.html b/doxygen/classdr_1_1transform__iterator-members.html new file mode 100644 index 0000000000..7c8f0363db --- /dev/null +++ b/doxygen/classdr_1_1transform__iterator-members.html @@ -0,0 +1,118 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::transform_iterator< Iter, F > Member List
+
+
+ +

This is the complete list of members for dr::transform_iterator< Iter, F >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
difference_type typedef (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >
iterator typedef (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >
iterator_category typedef (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >
local() const (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator!=(const transform_iterator &other) const noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator*() const noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator+(difference_type offset) const noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator+ (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >friend
operator++() noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator++(int) noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator+=(difference_type offset) noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator-(difference_type offset) const noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator-(iterator other) const noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator--() noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator--(int) noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator-=(difference_type offset) noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator<(iterator other) const noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator<=(iterator other) const noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator=(const transform_iterator &) noexcept=default (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >
operator==(const transform_iterator &other) const noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator>(iterator other) const noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator>=(iterator other) const noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
operator[](difference_type offset) const noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
pointer typedef (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >
reference typedef (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >
transform_iterator(Iter iter, F fn) noexcept (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >inline
transform_iterator() noexcept=default (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >
transform_iterator(const transform_iterator &) noexcept=default (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >
value_type typedef (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >
~transform_iterator() noexcept=default (defined in dr::transform_iterator< Iter, F >)dr::transform_iterator< Iter, F >
+ + + + diff --git a/doxygen/classdr_1_1transform__iterator.html b/doxygen/classdr_1_1transform__iterator.html new file mode 100644 index 0000000000..fe83f8da50 --- /dev/null +++ b/doxygen/classdr_1_1transform__iterator.html @@ -0,0 +1,187 @@ + + + + + + + +Distributed Ranges: dr::transform_iterator< Iter, F > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Friends | +List of all members
+
dr::transform_iterator< Iter, F > Class Template Reference
+
+
+ + + + + + + + + + + + + + +

+Public Types

+using value_type = std::invoke_result_t< F, std::iter_value_t< Iter > >
 
+using difference_type = std::iter_difference_t< Iter >
 
+using iterator = transform_iterator< Iter, F >
 
+using reference = value_type
 
+using pointer = iterator
 
+using iterator_category = std::random_access_iterator_tag
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

transform_iterator (Iter iter, F fn) noexcept
 
transform_iterator (const transform_iterator &) noexcept=default
 
+transform_iteratoroperator= (const transform_iterator &) noexcept=default
 
+bool operator== (const transform_iterator &other) const noexcept
 
+bool operator!= (const transform_iterator &other) const noexcept
 
+iterator operator+ (difference_type offset) const noexcept
 
+iterator operator- (difference_type offset) const noexcept
 
+difference_type operator- (iterator other) const noexcept
 
+bool operator< (iterator other) const noexcept
 
+bool operator> (iterator other) const noexcept
 
+bool operator<= (iterator other) const noexcept
 
+bool operator>= (iterator other) const noexcept
 
+iteratoroperator++ () noexcept
 
+iterator operator++ (int) noexcept
 
+iteratoroperator-- () noexcept
 
+iterator operator-- (int) noexcept
 
+iteratoroperator+= (difference_type offset) noexcept
 
+iteratoroperator-= (difference_type offset) noexcept
 
+reference operator* () const noexcept
 
+reference operator[] (difference_type offset) const noexcept
 
+auto local () const
 
+ + + +

+Friends

+iterator operator+ (difference_type n, iterator iter)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1transform__view-members.html b/doxygen/classdr_1_1transform__view-members.html new file mode 100644 index 0000000000..ff51b2da72 --- /dev/null +++ b/doxygen/classdr_1_1transform__view-members.html @@ -0,0 +1,95 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::transform_view< V, F > Member List
+
+
+ +

This is the complete list of members for dr::transform_view< V, F >, including all inherited members.

+ + + + + + + + +
base() const (defined in dr::transform_view< V, F >)dr::transform_view< V, F >inline
begin() const (defined in dr::transform_view< V, F >)dr::transform_view< V, F >inline
end() const (defined in dr::transform_view< V, F >)dr::transform_view< V, F >inline
rank() const (defined in dr::transform_view< V, F >)dr::transform_view< V, F >inline
segments() const (defined in dr::transform_view< V, F >)dr::transform_view< V, F >inline
size() const (defined in dr::transform_view< V, F >)dr::transform_view< V, F >inline
transform_view(R &&r, F fn) (defined in dr::transform_view< V, F >)dr::transform_view< V, F >inline
+ + + + diff --git a/doxygen/classdr_1_1transform__view.html b/doxygen/classdr_1_1transform__view.html new file mode 100644 index 0000000000..ce0523740d --- /dev/null +++ b/doxygen/classdr_1_1transform__view.html @@ -0,0 +1,135 @@ + + + + + + + +Distributed Ranges: dr::transform_view< V, F > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::transform_view< V, F > Class Template Reference
+
+
+
+Inheritance diagram for dr::transform_view< V, F >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::transform_view< V, F >:
+
+
Collaboration graph
+ + + + +
[legend]
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

+template<rng::viewable_range R>
 transform_view (R &&r, F fn)
 
+auto begin () const
 
+auto end () const
 
+auto size () const
 
+auto segments () const
 
+auto rank () const
 
+V base () const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1transform__view__coll__graph.map b/doxygen/classdr_1_1transform__view__coll__graph.map new file mode 100644 index 0000000000..e3502e0949 --- /dev/null +++ b/doxygen/classdr_1_1transform__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1transform__view__coll__graph.md5 b/doxygen/classdr_1_1transform__view__coll__graph.md5 new file mode 100644 index 0000000000..e4824fd23c --- /dev/null +++ b/doxygen/classdr_1_1transform__view__coll__graph.md5 @@ -0,0 +1 @@ +69fdf31c5b75e1d33329c73c77e5c73c \ No newline at end of file diff --git a/doxygen/classdr_1_1transform__view__coll__graph.png b/doxygen/classdr_1_1transform__view__coll__graph.png new file mode 100644 index 0000000000..a8907d9b7b Binary files /dev/null and b/doxygen/classdr_1_1transform__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1transform__view__inherit__graph.map b/doxygen/classdr_1_1transform__view__inherit__graph.map new file mode 100644 index 0000000000..e3502e0949 --- /dev/null +++ b/doxygen/classdr_1_1transform__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1transform__view__inherit__graph.md5 b/doxygen/classdr_1_1transform__view__inherit__graph.md5 new file mode 100644 index 0000000000..e4824fd23c --- /dev/null +++ b/doxygen/classdr_1_1transform__view__inherit__graph.md5 @@ -0,0 +1 @@ +69fdf31c5b75e1d33329c73c77e5c73c \ No newline at end of file diff --git a/doxygen/classdr_1_1transform__view__inherit__graph.png b/doxygen/classdr_1_1transform__view__inherit__graph.png new file mode 100644 index 0000000000..a8907d9b7b Binary files /dev/null and b/doxygen/classdr_1_1transform__view__inherit__graph.png differ diff --git a/doxygen/classdr_1_1views_1_1transform__adapter__closure-members.html b/doxygen/classdr_1_1views_1_1transform__adapter__closure-members.html new file mode 100644 index 0000000000..8405549ed6 --- /dev/null +++ b/doxygen/classdr_1_1views_1_1transform__adapter__closure-members.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::views::transform_adapter_closure< F > Member List
+
+
+ +

This is the complete list of members for dr::views::transform_adapter_closure< F >, including all inherited members.

+ + + + +
operator()(R &&r) const (defined in dr::views::transform_adapter_closure< F >)dr::views::transform_adapter_closure< F >inline
operator| (defined in dr::views::transform_adapter_closure< F >)dr::views::transform_adapter_closure< F >friend
transform_adapter_closure(F fn) (defined in dr::views::transform_adapter_closure< F >)dr::views::transform_adapter_closure< F >inline
+ + + + diff --git a/doxygen/classdr_1_1views_1_1transform__adapter__closure.html b/doxygen/classdr_1_1views_1_1transform__adapter__closure.html new file mode 100644 index 0000000000..99de9c6b9e --- /dev/null +++ b/doxygen/classdr_1_1views_1_1transform__adapter__closure.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: dr::views::transform_adapter_closure< F > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Friends | +List of all members
+
dr::views::transform_adapter_closure< F > Class Template Reference
+
+
+ + + + + + + +

+Public Member Functions

transform_adapter_closure (F fn)
 
+template<rng::viewable_range R>
auto operator() (R &&r) const
 
+ + + + +

+Friends

+template<rng::viewable_range R>
auto operator| (R &&r, const transform_adapter_closure &closure)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1views_1_1transform__fn__-members.html b/doxygen/classdr_1_1views_1_1transform__fn__-members.html new file mode 100644 index 0000000000..89cfac799b --- /dev/null +++ b/doxygen/classdr_1_1views_1_1transform__fn__-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::views::transform_fn_ Member List
+
+
+ +

This is the complete list of members for dr::views::transform_fn_, including all inherited members.

+ + + +
operator()(R &&r, F &&f) const (defined in dr::views::transform_fn_)dr::views::transform_fn_inline
operator()(F &&fn) const (defined in dr::views::transform_fn_)dr::views::transform_fn_inline
+ + + + diff --git a/doxygen/classdr_1_1views_1_1transform__fn__.html b/doxygen/classdr_1_1views_1_1transform__fn__.html new file mode 100644 index 0000000000..fc14f17cf9 --- /dev/null +++ b/doxygen/classdr_1_1views_1_1transform__fn__.html @@ -0,0 +1,103 @@ + + + + + + + +Distributed Ranges: dr::views::transform_fn_ Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::views::transform_fn_ Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

+template<rng::viewable_range R, std::copy_constructible F>
auto operator() (R &&r, F &&f) const
 
+template<std::copy_constructible F>
auto operator() (F &&fn) const
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classes.html b/doxygen/classes.html new file mode 100644 index 0000000000..a3b55f40e3 --- /dev/null +++ b/doxygen/classes.html @@ -0,0 +1,144 @@ + + + + + + + +Distributed Ranges: Class Index + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
A | B | C | D | E | F | G | H | I | L | M | N | O | P | R | S | T | U | V | Z
+
+
+
A
+
allocator (dr::mp::__detail)
any (dr::mp::__detail)
+
+
B
+
block_cyclic (dr::sp)
buffer (dr::mp::__detail)
buffered_allocator (dr::sp)
+
+
C
+
communicator (dr)
coo_matrix (dr::sp::__detail)
count_fn_ (dr::mp)
count_if_fn_ (dr::mp)
csr_matrix_view (dr::sp)
csr_matrix_view_accessor (dr::sp)
+
+
D
+
default_memory (dr)
dense_matrix (dr::sp)
dense_matrix_accessor (dr::sp)
dense_matrix_column_accessor (dr::sp)
dense_matrix_column_view (dr::sp)
dense_matrix_row_accessor (dr::sp)
dense_matrix_row_view (dr::sp)
dense_matrix_view (dr::sp)
device_allocator (dr::sp)
device_policy (dr::mp)
device_policy (dr::sp)
device_ptr (dr::sp)
device_ref (dr::sp)
device_span (dr::sp)
device_vector (dr::sp)
direct_iterator (dr::__detail)
distributed_dense_matrix (dr::sp)
distributed_dense_matrix_accessor (dr::sp)
distributed_mdarray (dr::mp)
distributed_range_accessor (dr::sp)
distributed_span (dr::sp)
distributed_span_accessor (dr::sp)
distributed_vector (dr::mp)
distributed_vector (dr::sp)
distributed_vector_accessor (dr::sp)
distribution (dr::mp)
duplicated_vector (dr::sp)
dv_segment (dr::mp)
dv_segment_iterator (dr::mp)
dv_segment_reference (dr::mp)
+
+
E
+
enumerate_adapter_closure (dr::__detail)
enumerate_adapter_closure (dr::mp::views)
enumerate_adapter_closure (dr::sp::views)
enumerate_fn_ (dr::__detail)
enumerate_fn_ (dr::mp::views)
enumerate_fn_ (dr::sp::views)
event (dr::__detail)
+
+
F
+
formatter< Mdspan, char > (fmt)
future (dr::sp)
+
+
G
+
global_context (dr::mp::__detail)
+
+
H
+
halo_bounds (dr::mp)
halo_impl (dr::mp)
+
+
I
+
id (dr::sp)
index (dr)
index_group (dr::mp)
iota_fn_ (dr::views)
is_drop_view (dr)
is_drop_view< rng::drop_view< T > > (dr)
is_iota_view (dr)
is_iota_view< rng::iota_view< W > > (dr)
is_owning_view (dr)
is_ref_view (dr)
is_ref_view< rng::ref_view< R > > (dr)
is_sliding_view (dr)
is_sliding_view< rng::sliding_view< T > > (dr)
is_subrange_view (dr)
is_subrange_view< rng::subrange< T > > (dr)
is_take_view (dr)
is_take_view< rng::take_view< T > > (dr)
is_zip_view (dr)
is_zip_view< rng::zip_view< Views... > > (dr)
distributed_vector::iterator (dr::mp)
iterator_adaptor (dr)
+
+
L
+
local_fn_ (dr::ranges::__detail)
logger (dr)
+
+
M
+
matrix_entry (dr::sp)
matrix_partition (dr::sp)
matrix_ref (dr::sp)
halo_impl::max_op (dr::mp)
md_segment (dr::mp::__detail)
mdspan_adapter_closure (dr::mp::views)
mdspan_fn_ (dr::mp::views)
mdspan_iter_accessor (dr::__detail)
mdspan_view (dr::mp)
mdsub_segment (dr::mp::__detail)
mdtranspose (dr::__detail)
halo_impl::min_op (dr::mp)
MpiBackend (dr::mp)
halo_impl::multiplies_op (dr::mp)
+
+
N
+
normal_distributed_iterator_accessor (dr)
+
+
O
+
owning_view (dr::__detail)
+
+
P
+
halo_impl::plus_op (dr::mp)
+
+
R
+
range_size (dr::mp::views::__detail)
range_size< R > (dr::mp::views::__detail)
device_allocator::rebind (dr::sp)
remote_subrange (dr)
rma_window (dr)
+
+
S
+
halo_impl::second_op (dr::mp)
segment_range (dr::sp)
segment_range_accessor (dr::sp)
segmented_view (dr::mp)
segmented_view_iterator (dr::mp)
slice_adaptor_closure (dr::sp::views)
sliding_fn (dr::mp::views::__detail)
source_location (nostd)
span (dr::sp)
span_group (dr::mp)
span_halo (dr::mp)
sparse_matrix (dr::sp)
submdspan_adapter_closure (dr::mp::views)
submdspan_fn_ (dr::mp::views)
submdspan_view (dr::mp)
subrange (dr::mp)
subrange_iterator (dr::mp)
+
+
T
+
timer (dr)
tmp_buffer (dr::mp::__detail)
transform_adapter_closure (dr::views)
transform_fn_ (dr::views)
transform_iterator (dr)
transform_view (dr)
tuple_element< Index, dr::index< I > > (std)
tuple_element< Index, dr::sp::matrix_entry< T, I > > (std)
tuple_element< Index, dr::sp::matrix_ref< T, I, TRef > > (std)
tuple_or_pair (dr::sp::__detail)
tuple_or_pair< T, U > (dr::sp::__detail)
tuple_size< dr::index< I > > (std)
tuple_size< dr::sp::matrix_entry< T, I > > (std)
tuple_size< dr::sp::matrix_ref< T, I, TRef > > (std)
+
+
U
+
unstructured_halo (dr::mp)
+
+
V
+
vector (dr::sp)
+
+
Z
+
zip_accessor (dr::sp)
zip_iterator (dr::mp)
zip_view (dr::mp)
zip_view (dr::sp)
+
+
+ + + + diff --git a/doxygen/closed.png b/doxygen/closed.png new file mode 100644 index 0000000000..98cc2c909d Binary files /dev/null and b/doxygen/closed.png differ diff --git a/doxygen/common__support_8hpp_source.html b/doxygen/common__support_8hpp_source.html new file mode 100644 index 0000000000..d9c1079099 --- /dev/null +++ b/doxygen/common__support_8hpp_source.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/common_support.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
common_support.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7// file for helper functions implemented for both SYCL and non-SYCL compilations
+
8
+
9namespace dr::mp::__detail {
+
10
+
11template <typename T> void copy(const T *src, T *dst, std::size_t sz) {
+
12 if (mp::use_sycl()) {
+
13 sycl_copy<T>(src, dst, sz);
+
14 } else {
+
15 memcpy(dst, src, sz * sizeof(T));
+
16 }
+
17}
+
18
+
19} // namespace dr::mp::__detail
+
+ + + + diff --git a/doxygen/communicator_8hpp_source.html b/doxygen/communicator_8hpp_source.html new file mode 100644 index 0000000000..0a6c4fe4e0 --- /dev/null +++ b/doxygen/communicator_8hpp_source.html @@ -0,0 +1,412 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/communicator.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
communicator.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#define MPI_SUPPORTS_RGET_C \
+
8 (MPI_VERSION >= 4) || \
+
9 (defined(I_MPI_NUMVERSION) && (I_MPI_NUMVERSION > 20211200000))
+
10
+
11namespace dr {
+
12
+ +
14public:
+
15 communicator(MPI_Comm comm = MPI_COMM_WORLD) : mpi_comm_(comm) {
+
16 int rank, size;
+
17 MPI_Comm_rank(comm, &rank);
+
18 MPI_Comm_size(comm, &size);
+
19 rank_ = rank;
+
20 size_ = size;
+
21 }
+
22
+
23 auto size() const { return size_; }
+
24 auto rank() const { return rank_; }
+
25 auto prev() const { return (rank() + size() - 1) % size(); }
+
26 auto next() const { return (rank() + 1) % size(); }
+
27 auto first() const { return rank() == 0; }
+
28 auto last() const { return rank() == size() - 1; }
+
29
+
30 MPI_Comm mpi_comm() const { return mpi_comm_; }
+
31
+
32 void barrier() const {
+
33#ifdef DRISHMEM
+
34 DRLOG("calling COMM barrier (by calling fence) in ISHMEM");
+
35 ishmem_fence();
+
36#endif
+
37 DRLOG("calling COMM barrier in MPI");
+
38 MPI_Barrier(mpi_comm_);
+
39 DRLOG("COMM barrier finished");
+
40 }
+
41
+
42 void bcast(void *src, std::size_t count, std::size_t root) const {
+
43 MPI_Bcast(src, count, MPI_BYTE, root, mpi_comm_);
+
44 }
+
45
+
46 void scatter(const void *src, void *dst, std::size_t count,
+
47 std::size_t root) const {
+
48 MPI_Scatter(src, count, MPI_BYTE, dst, count, MPI_BYTE, root, mpi_comm_);
+
49 }
+
50
+
51 template <typename T>
+
52 void scatter(const std::span<T> src, T &dst, std::size_t root) const {
+
53 assert(rng::size(src) >= size_);
+
54 scatter(rng::data(src), &dst, sizeof(T), root);
+
55 }
+
56
+
57 void scatterv(const void *src, int *counts, int *offsets, void *dst,
+
58 int dst_count, std::size_t root) const {
+
59 assert(counts == nullptr || counts[rank()] == dst_count);
+
60 MPI_Scatterv(src, counts, offsets, MPI_BYTE, dst, dst_count, MPI_BYTE, root,
+
61 mpi_comm_);
+
62 }
+
63
+
64 void gather(const void *src, void *dst, std::size_t count,
+
65 std::size_t root) const {
+
66 MPI_Gather_c(src, count, MPI_BYTE, dst, count, MPI_BYTE, root, mpi_comm_);
+
67 }
+
68
+
69 template <typename T>
+
70 void gather(const T &src, std::span<T> dst, std::size_t root) const {
+
71 assert(rng::size(dst) >= size_);
+
72 gather(&src, rng::data(dst), sizeof(T), root);
+
73 }
+
74
+
75 template <typename T>
+
76 void all_gather(const T *src, T *dst, std::size_t count) const {
+
77 // Gather size elements from each rank
+
78 MPI_Allgather_c(src, count * sizeof(T), MPI_BYTE, dst, count * sizeof(T),
+
79 MPI_BYTE, mpi_comm_);
+
80 }
+
81
+
82 template <typename T>
+
83 void all_gather(const T &src, std::vector<T> &dst) const {
+
84 assert(rng::size(dst) >= size_);
+
85 all_gather(&src, rng::data(dst), 1);
+
86 }
+
87
+
88 template <rng::contiguous_range R>
+
89 void all_gather(const R &src, R &dst) const {
+
90 assert(rng::size(dst) >= size_ * rng::size(src));
+
91 all_gather(rng::data(src), rng::data(dst), rng::size(src));
+
92 }
+
93
+
94 template <typename T>
+
95 void i_all_gather(const T *src, T *dst, std::size_t count,
+
96 MPI_Request *req) const {
+
97 // Gather size elements from each rank
+
98 MPI_Iallgather_c(src, count * sizeof(T), MPI_BYTE, dst, count * sizeof(T),
+
99 MPI_BYTE, mpi_comm_, req);
+
100 }
+
101
+
102 template <typename T>
+
103 void i_all_gather(const T &src, std::vector<T> &dst, MPI_Request *req) const {
+
104 assert(rng::size(dst) >= size_);
+
105 i_all_gather(&src, rng::data(dst), 1, req);
+
106 }
+
107
+
108 void gatherv(const void *src, int *counts, int *offsets, void *dst,
+
109 std::size_t root) const {
+
110 MPI_Gatherv(src, counts[rank()], MPI_BYTE, dst, counts, offsets, MPI_BYTE,
+
111 root, mpi_comm_);
+
112 }
+
113
+
114 // pointer with explicit tag
+
115 template <typename T>
+
116 void isend(const T *data, std::size_t count, std::size_t dst_rank, auto tag,
+
117 MPI_Request *request) const {
+
118 MPI_Isend_c(data, count * sizeof(T), MPI_BYTE, dst_rank, int(tag),
+
119 mpi_comm_, request);
+
120 }
+
121
+
122 // pointer, no tag
+
123 template <typename T>
+
124 void isend(const T *data, std::size_t count, std::size_t dst_rank,
+
125 MPI_Request *request) const {
+
126 isend(data, count, dst_rank, 0, request);
+
127 }
+
128
+
129 // range and tag
+
130 template <rng::contiguous_range R>
+
131 void isend(const R &data, std::size_t dst_rank, auto tag,
+
132 MPI_Request *request) const {
+
133 isend(rng::data(data), rng::size(data), dst_rank, tag, request);
+
134 }
+
135
+
136 // range, no tag
+
137 template <rng::contiguous_range R>
+
138 void isend(const R &data, std::size_t dst_rank, MPI_Request *request) const {
+
139 isend(data, dst_rank, 0, request);
+
140 }
+
141
+
142 // pointer and tag
+
143 template <typename T>
+
144 void irecv(T *data, std::size_t size, std::size_t src_rank, auto tag,
+
145 MPI_Request *request) const {
+
146 MPI_Irecv_c(data, size * sizeof(T), MPI_BYTE, src_rank, int(tag), mpi_comm_,
+
147 request);
+
148 }
+
149
+
150 // pointer, no tag
+
151 template <typename T>
+
152 void irecv(T *data, std::size_t size, std::size_t src_rank,
+
153 MPI_Request *request) const {
+
154 irecv(data, size, src_rank, 0, request);
+
155 }
+
156
+
157 // range and tag
+
158 template <rng::contiguous_range R>
+
159 void irecv(R &data, std::size_t src_rank, int tag,
+
160 MPI_Request *request) const {
+
161 irecv(rng::data(data), rng::size(data), src_rank, tag, request);
+
162 }
+
163
+
164 // range, no tag
+
165 template <rng::contiguous_range R>
+
166 void irecv(R &data, std::size_t src_rank, MPI_Request *request) const {
+
167 irecv(data, src_rank, 0, request);
+
168 }
+
169
+
170 template <rng::contiguous_range R>
+
171 void alltoall(const R &sendr, R &recvr, std::size_t count) {
+
172 alltoall(rng::data(sendr), rng::data(recvr), count);
+
173 }
+
174
+
175 template <typename T>
+
176 void alltoall(const T *send, T *receive, std::size_t count) {
+
177 std::size_t bytes = count * sizeof(T);
+
178
+
179 timer time;
+
180 MPI_Alltoall_c(send, bytes, MPI_BYTE, receive, bytes, MPI_BYTE, mpi_comm_);
+
181 dr::drlog.debug(dr::logger::mpi, "alltoall bytes: {} elapsed: {}\n", bytes,
+
182 time.elapsed());
+
183 }
+
184
+
185 template <rng::contiguous_range SendR, rng::contiguous_range RecvR>
+
186 void alltoallv(const SendR &sendbuf, const std::vector<std::size_t> &sendcnt,
+
187 const std::vector<std::size_t> &senddsp, RecvR &recvbuf,
+
188 const std::vector<std::size_t> &recvcnt,
+
189 const std::vector<std::size_t> &recvdsp) {
+
190 using valT = typename RecvR::value_type;
+
191
+
192 static_assert(std::is_same_v<std::ranges::range_value_t<SendR>,
+
193 std::ranges::range_value_t<RecvR>>);
+
194
+
195 assert(rng::size(sendcnt) == size_);
+
196 assert(rng::size(senddsp) == size_);
+
197 assert(rng::size(recvcnt) == size_);
+
198 assert(rng::size(recvdsp) == size_);
+
199
+
200 std::vector<MPI_Count> _sendcnt(size_);
+
201 std::vector<MPI_Aint> _senddsp(size_);
+
202 std::vector<MPI_Count> _recvcnt(size_);
+
203 std::vector<MPI_Aint> _recvdsp(size_);
+
204
+
205 rng::transform(sendcnt, _sendcnt.begin(),
+
206 [](auto e) { return e * sizeof(valT); });
+
207 rng::transform(senddsp, _senddsp.begin(),
+
208 [](auto e) { return e * sizeof(valT); });
+
209 rng::transform(recvcnt, _recvcnt.begin(),
+
210 [](auto e) { return e * sizeof(valT); });
+
211 rng::transform(recvdsp, _recvdsp.begin(),
+
212 [](auto e) { return e * sizeof(valT); });
+
213
+
214 MPI_Alltoallv_c(rng::data(sendbuf), rng::data(_sendcnt),
+
215 rng::data(_senddsp), MPI_BYTE, rng::data(recvbuf),
+
216 rng::data(_recvcnt), rng::data(_recvdsp), MPI_BYTE,
+
217 mpi_comm_);
+
218 }
+
219
+
220 bool operator==(const communicator &other) const {
+
221 return mpi_comm_ == other.mpi_comm_;
+
222 }
+
223
+
224private:
+
225 MPI_Comm mpi_comm_;
+
226 std::size_t rank_;
+
227 std::size_t size_;
+
228};
+
229
+ +
231public:
+
232 void create(communicator comm, void *data, std::size_t size) {
+
233 local_data_ = data;
+
234 communicator_ = comm;
+
235 DRLOG("win create:: size: {} data:{}", size, data);
+
236 MPI_Win_create(data, size, 1, MPI_INFO_NULL, comm.mpi_comm(), &win_);
+
237 }
+
238
+
239 template <typename T> auto local_data() {
+
240 return static_cast<T *>(local_data_);
+
241 }
+
242
+
243 void free() { MPI_Win_free(&win_); }
+
244
+
245 bool operator==(const rma_window other) const noexcept {
+
246 return this->win_ == other.win_;
+
247 }
+
248
+
249 void set_null() { win_ = MPI_WIN_NULL; }
+
250 bool null() const noexcept { return win_ == MPI_WIN_NULL; }
+
251
+
252 template <typename T> T get(std::size_t rank, std::size_t disp) const {
+
253 T dst;
+
254 get(&dst, sizeof(T), rank, disp * sizeof(T));
+
255 return dst;
+
256 }
+
257
+
258 void get(void *dst, std::size_t size, std::size_t rank,
+
259 std::size_t disp) const {
+
260 DRLOG("MPI comm get:: ({}:{}:{})", rank, disp, size);
+
261 MPI_Request request;
+
262#if (MPI_VERSION >= 4) || \
+
263 (defined(I_MPI_NUMVERSION) && (I_MPI_NUMVERSION > 20211200000))
+
264 MPI_Rget_c(dst, size, MPI_BYTE, rank, disp, size, MPI_BYTE, win_, &request);
+
265#else
+
266 assert(
+
267 size <= (std::size_t)INT_MAX &&
+
268 "MPI API requires origin_count to be positive signed 32-bit integer");
+
269 MPI_Rget(dst, size, MPI_BYTE, rank, disp, size, MPI_BYTE, win_, &request);
+
270#endif
+
271 MPI_Wait(&request, MPI_STATUS_IGNORE);
+
272 }
+
273
+
274 void put(const auto &src, std::size_t rank, std::size_t disp) const {
+
275 put(&src, sizeof(src), rank, disp * sizeof(src));
+
276 }
+
277
+
278 void put(const void *src, std::size_t size, std::size_t rank,
+
279 std::size_t disp) const {
+
280 DRLOG("MPI comm put:: ({}:{}:{})", rank, disp, size);
+
281 MPI_Request request;
+
282
+
283#if (MPI_VERSION >= 4) || \
+
284 (defined(I_MPI_NUMVERSION) && (I_MPI_NUMVERSION > 20211200000))
+
285 MPI_Rput_c(src, size, MPI_BYTE, rank, disp, size, MPI_BYTE, win_, &request);
+
286#else
+
287 // MPI_Rput origin_count is 32-bit signed int - check range
+
288 assert(
+
289 size <= (std::size_t)INT_MAX &&
+
290 "MPI API requires origin_count to be positive signed 32-bit integer");
+
291 MPI_Rput(src, size, MPI_BYTE, rank, disp, size, MPI_BYTE, win_, &request);
+
292#endif
+
293
+
294 DRLOG("MPI comm wait:: ({}:{}:{})", rank, disp, size);
+
295 MPI_Wait(&request, MPI_STATUS_IGNORE);
+
296 DRLOG("MPI comm wait finished:: ({}:{}:{})", rank, disp, size);
+
297 }
+
298
+
299 void fence() const {
+
300 if (win_ != MPI_WIN_NULL) {
+
301 DRLOG("MPI comm fence:: win:{}", win_);
+
302 MPI_Win_fence(0, win_);
+
303 DRLOG("MPI comm fence finished:: win:{}", win_);
+
304 } else {
+
305 DRLOG("MPI comm fence skipped because win is NULL");
+
306 }
+
307 }
+
308
+
309 void flush(std::size_t rank) const {
+
310 DRLOG("MPI comm flush:: rank:{} win:{}", rank, win_);
+
311 MPI_Win_flush(rank, win_);
+
312 DRLOG("MPI comm flush finished:: rank:{} win:{}", rank, win_);
+
313 }
+
314
+
315 const auto &communicator() const { return communicator_; }
+
316 auto mpi_win() { return win_; }
+
317
+
318private:
+
319 dr::communicator communicator_;
+
320 MPI_Win win_ = MPI_WIN_NULL;
+
321 void *local_data_ = nullptr;
+
322};
+
323
+
324} // namespace dr
+
Definition: communicator.hpp:13
+
Definition: communicator.hpp:230
+
Definition: logger.hpp:18
+
+ + + + diff --git a/doxygen/conceptdr_1_1TupleLike.html b/doxygen/conceptdr_1_1TupleLike.html new file mode 100644 index 0000000000..61c17b32d5 --- /dev/null +++ b/doxygen/conceptdr_1_1TupleLike.html @@ -0,0 +1,99 @@ + + + + + + + +Distributed Ranges: dr::TupleLike Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::TupleLike Concept Reference
+
+
+

Concept definition

+
template<typename T, typename... Args>
+
concept dr::TupleLike =
+
requires {
+
typename std::tuple_size<std::remove_cvref_t<T>>::type;
+
requires std::same_as<
+
std::remove_cvref_t<
+
decltype(std::tuple_size_v<std::remove_cvref_t<T>>)>,
+
std::size_t>;
+
} && sizeof...(Args) == std::tuple_size_v<std::remove_cvref_t<T>> &&
+
[]<std::size_t... I>(std::index_sequence<I...>) {
+
return (TupleElementGettable<T, I, Args> && ...);
+
}(std::make_index_sequence<std::tuple_size_v<std::remove_cvref_t<T>>>())
+
Definition: index.hpp:22
+
+ + + + diff --git a/doxygen/conceptdr_1_1_0d4_1_1TupleElementGettable.html b/doxygen/conceptdr_1_1_0d4_1_1TupleElementGettable.html new file mode 100644 index 0000000000..67e59e4cb5 --- /dev/null +++ b/doxygen/conceptdr_1_1_0d4_1_1TupleElementGettable.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::@4::TupleElementGettable Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::@4::TupleElementGettable Concept Reference
+
+
+

Concept definition

+
template<typename T, std::size_t I, typename U std::any>
+
concept dr::@4::TupleElementGettable = requires(T tuple) {
+
{ std::get<I>(tuple) } -> std::convertible_to<U>;
+
}
+
Definition: index.hpp:16
+
+ + + + diff --git a/doxygen/conceptdr_1_1_0d5_1_1has__segments__method.html b/doxygen/conceptdr_1_1_0d5_1_1has__segments__method.html new file mode 100644 index 0000000000..427afbd46f --- /dev/null +++ b/doxygen/conceptdr_1_1_0d5_1_1has__segments__method.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::@5::has_segments_method Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::@5::has_segments_method Concept Reference
+
+
+

Concept definition

+
template<typename R>
+
concept dr::@5::has_segments_method = requires(R r) {
+
{ r.segments() };
+
}
+
Definition: iterator_adaptor.hpp:17
+
+ + + + diff --git a/doxygen/conceptdr_1_1____detail_1_1mdarray__like.html b/doxygen/conceptdr_1_1____detail_1_1mdarray__like.html new file mode 100644 index 0000000000..2ae3cb87a9 --- /dev/null +++ b/doxygen/conceptdr_1_1____detail_1_1mdarray__like.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: dr::__detail::mdarray_like Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::__detail::mdarray_like Concept Reference
+
+
+

Concept definition

+
template<typename Mdarray>
+
concept dr::__detail::mdarray_like = requires(Mdarray &mdarray) { mdarray.to_mdspan(); }
+
Definition: mdspan_utils.hpp:52
+
+ + + + diff --git a/doxygen/conceptdr_1_1____detail_1_1mdspan__like.html b/doxygen/conceptdr_1_1____detail_1_1mdspan__like.html new file mode 100644 index 0000000000..90239a2efe --- /dev/null +++ b/doxygen/conceptdr_1_1____detail_1_1mdspan__like.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: dr::__detail::mdspan_like Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::__detail::mdspan_like Concept Reference
+
+
+

Concept definition

+
template<typename Mdspan>
+
concept dr::__detail::mdspan_like = requires(Mdspan &mdspan) {
+
mdspan.rank();
+
mdspan.extents();
+
}
+
Definition: mdspan_utils.hpp:46
+
+ + + + diff --git a/doxygen/conceptdr_1_1distributed__contiguous__iterator.html b/doxygen/conceptdr_1_1distributed__contiguous__iterator.html new file mode 100644 index 0000000000..e58f11fd75 --- /dev/null +++ b/doxygen/conceptdr_1_1distributed__contiguous__iterator.html @@ -0,0 +1,96 @@ + + + + + + + +Distributed Ranges: dr::distributed_contiguous_iterator Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::distributed_contiguous_iterator Concept Reference
+
+
+

Concept definition

+
template<typename Iter>
+ +
distributed_iterator<Iter> && rng::random_access_iterator<Iter> &&
+
requires(Iter &iter) {
+
{ dr::ranges::segments(iter) } -> rng::random_access_range;
+
} &&
+
remote_contiguous_range<rng::range_value_t<decltype(dr::ranges::segments(
+
std::declval<Iter>()))>>
+
Definition: concepts.hpp:51
+
Definition: concepts.hpp:31
+
+ + + + diff --git a/doxygen/conceptdr_1_1distributed__contiguous__range.html b/doxygen/conceptdr_1_1distributed__contiguous__range.html new file mode 100644 index 0000000000..92efb0904b --- /dev/null +++ b/doxygen/conceptdr_1_1distributed__contiguous__range.html @@ -0,0 +1,96 @@ + + + + + + + +Distributed Ranges: dr::distributed_contiguous_range Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::distributed_contiguous_range Concept Reference
+
+
+

Concept definition

+
template<typename R>
+ +
distributed_range<R> && rng::random_access_range<R> &&
+
requires(R &r) {
+
{ dr::ranges::segments(r) } -> rng::random_access_range;
+
} &&
+
remote_contiguous_range<
+
rng::range_value_t<decltype(dr::ranges::segments(std::declval<R>()))>>
+
Definition: concepts.hpp:42
+
Definition: concepts.hpp:20
+
+ + + + diff --git a/doxygen/conceptdr_1_1distributed__iterator.html b/doxygen/conceptdr_1_1distributed__iterator.html new file mode 100644 index 0000000000..c2e2066a7f --- /dev/null +++ b/doxygen/conceptdr_1_1distributed__iterator.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::distributed_iterator Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::distributed_iterator Concept Reference
+
+
+

Concept definition

+
template<typename I>
+
concept dr::distributed_iterator = std::forward_iterator<I> && requires(I &iter) {
+
dr::ranges::segments(iter);
+
}
+
Definition: concepts.hpp:31
+
+ + + + diff --git a/doxygen/conceptdr_1_1distributed__mdspan__range.html b/doxygen/conceptdr_1_1distributed__mdspan__range.html new file mode 100644 index 0000000000..d2cc2e3634 --- /dev/null +++ b/doxygen/conceptdr_1_1distributed__mdspan__range.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::distributed_mdspan_range Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::distributed_mdspan_range Concept Reference
+
+
+

Concept definition

+
template<typename R>
+ +
distributed_range<R> && requires(R &r) { r.mdspan(); }
+
Definition: mdspan_utils.hpp:332
+
Definition: concepts.hpp:20
+
+ + + + diff --git a/doxygen/conceptdr_1_1distributed__range.html b/doxygen/conceptdr_1_1distributed__range.html new file mode 100644 index 0000000000..ccd64645a1 --- /dev/null +++ b/doxygen/conceptdr_1_1distributed__range.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: dr::distributed_range Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::distributed_range Concept Reference
+
+
+

Concept definition

+
template<typename R>
+ +
rng::forward_range<R> && requires(R &r) { dr::ranges::segments(r); }
+
Definition: concepts.hpp:20
+
+ + + + diff --git a/doxygen/conceptdr_1_1mp_1_1____detail_1_1is__distributed.html b/doxygen/conceptdr_1_1mp_1_1____detail_1_1is__distributed.html new file mode 100644 index 0000000000..fe564c6fd3 --- /dev/null +++ b/doxygen/conceptdr_1_1mp_1_1____detail_1_1is__distributed.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: dr::mp::__detail::is_distributed Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::__detail::is_distributed Concept Reference
+
+
+

Concept definition

+
template<typename T>
+ + +
Definition: concepts.hpp:31
+
Definition: concepts.hpp:20
+
Definition: zip.hpp:39
+
+ + + + diff --git a/doxygen/conceptdr_1_1mp_1_1____detail_1_1one__argument.html b/doxygen/conceptdr_1_1mp_1_1____detail_1_1one__argument.html new file mode 100644 index 0000000000..b45cf3e949 --- /dev/null +++ b/doxygen/conceptdr_1_1mp_1_1____detail_1_1one__argument.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::mp::__detail::one_argument Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::__detail::one_argument Concept Reference
+
+
+

Concept definition

+
template<typename F, typename Arg1>
+
concept dr::mp::__detail::one_argument = requires(F &f) {
+
{ f(Arg1{}) };
+
}
+
Definition: md_for_each.hpp:28
+
+ + + + diff --git a/doxygen/conceptdr_1_1mp_1_1____detail_1_1two__arguments.html b/doxygen/conceptdr_1_1mp_1_1____detail_1_1two__arguments.html new file mode 100644 index 0000000000..c0452486a2 --- /dev/null +++ b/doxygen/conceptdr_1_1mp_1_1____detail_1_1two__arguments.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::mp::__detail::two_arguments Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::__detail::two_arguments Concept Reference
+
+
+

Concept definition

+
template<typename F, typename Arg1, typename Arg2>
+
concept dr::mp::__detail::two_arguments = requires(F &f) {
+
{ f(Arg1{}, Arg2{}) };
+
}
+
Definition: md_for_each.hpp:33
+
+ + + + diff --git a/doxygen/conceptdr_1_1mp_1_1____detail_1_1zipable.html b/doxygen/conceptdr_1_1mp_1_1____detail_1_1zipable.html new file mode 100644 index 0000000000..f02886b391 --- /dev/null +++ b/doxygen/conceptdr_1_1mp_1_1____detail_1_1zipable.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: dr::mp::__detail::zipable Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::__detail::zipable Concept Reference
+
+
+

Concept definition

+
template<typename R>
+
concept dr::mp::__detail::zipable = rng::random_access_range<R> && rng::common_range<R>
+
Definition: zip.hpp:20
+
+ + + + diff --git a/doxygen/conceptdr_1_1mp_1_1has__halo__method.html b/doxygen/conceptdr_1_1mp_1_1has__halo__method.html new file mode 100644 index 0000000000..79429912bf --- /dev/null +++ b/doxygen/conceptdr_1_1mp_1_1has__halo__method.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: dr::mp::has_halo_method Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::has_halo_method Concept Reference
+
+
+

Concept definition

+
template<typename DR>
+
concept dr::mp::has_halo_method = dr::distributed_range<DR> && requires(DR &&dr) {
+
{ rng::begin(dr::ranges::segments(dr)[0]).halo() };
+
}
+
Definition: concepts.hpp:20
+
Definition: segment.hpp:255
+
+ + + + diff --git a/doxygen/conceptdr_1_1mp_1_1has__segments.html b/doxygen/conceptdr_1_1mp_1_1has__segments.html new file mode 100644 index 0000000000..bd45d44b42 --- /dev/null +++ b/doxygen/conceptdr_1_1mp_1_1has__segments.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: dr::mp::has_segments Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::has_segments Concept Reference
+
+
+

Concept definition

+
template<typename T>
+
concept dr::mp::has_segments = requires(T &t) { dr::ranges::segments(t); }
+
Definition: alignment.hpp:14
+
+ + + + diff --git a/doxygen/conceptdr_1_1mp_1_1is__mdspan__view.html b/doxygen/conceptdr_1_1mp_1_1is__mdspan__view.html new file mode 100644 index 0000000000..707394dbc7 --- /dev/null +++ b/doxygen/conceptdr_1_1mp_1_1is__mdspan__view.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::mp::is_mdspan_view Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::is_mdspan_view Concept Reference
+
+
+

Concept definition

+
template<typename R>
+ +
dr::distributed_range<R> && requires(R &r) { r.mdspan(); }
+
Definition: concepts.hpp:20
+
Definition: mdspan_view.hpp:206
+
+ + + + diff --git a/doxygen/conceptdr_1_1mp_1_1no__segments.html b/doxygen/conceptdr_1_1mp_1_1no__segments.html new file mode 100644 index 0000000000..0026ffbea5 --- /dev/null +++ b/doxygen/conceptdr_1_1mp_1_1no__segments.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: dr::mp::no_segments Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mp::no_segments Concept Reference
+
+
+

Concept definition

+
template<typename T>
+ +
Definition: alignment.hpp:14
+
Definition: alignment.hpp:17
+
+ + + + diff --git a/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__local__adl.html b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__local__adl.html new file mode 100644 index 0000000000..f01e53099a --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__local__adl.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::ranges::@14::has_local_adl Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@14::has_local_adl Concept Reference
+
+
+

Concept definition

+
template<typename Iter>
+
concept dr::ranges::@14::has_local_adl = requires(Iter &iter) {
+
{ local_(iter) } -> std::forward_iterator;
+
}
+
Definition: ranges.hpp:128
+
+ + + + diff --git a/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__rank__adl.html b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__rank__adl.html new file mode 100644 index 0000000000..4a9c2567cf --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__rank__adl.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::ranges::@14::has_rank_adl Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@14::has_rank_adl Concept Reference
+
+
+

Concept definition

+
template<typename R>
+
concept dr::ranges::@14::has_rank_adl = requires(R &r) {
+
{ rank_(r) } -> std::weakly_incrementable;
+
}
+
Definition: ranges.hpp:27
+
+ + + + diff --git a/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__rank__method.html b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__rank__method.html new file mode 100644 index 0000000000..3914ad9a3b --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__rank__method.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::ranges::@14::has_rank_method Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@14::has_rank_method Concept Reference
+
+
+

Concept definition

+
template<typename T>
+
concept dr::ranges::@14::has_rank_method = requires(T t) {
+
{ t.rank() } -> std::weakly_incrementable;
+
}
+
Definition: ranges.hpp:22
+
+ + + + diff --git a/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__segments__adl.html b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__segments__adl.html new file mode 100644 index 0000000000..a50eb959af --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__segments__adl.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: dr::ranges::@14::has_segments_adl Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@14::has_segments_adl Concept Reference
+
+
+

Concept definition

+
template<typename R>
+
concept dr::ranges::@14::has_segments_adl = requires(R &r) {
+
{ segments_(r) } -> segments_range;
+
}
+
Definition: ranges.hpp:95
+
Definition: ranges.hpp:86
+
+ + + + diff --git a/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__segments__method.html b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__segments__method.html new file mode 100644 index 0000000000..599f9b36c5 --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1has__segments__method.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: dr::ranges::@14::has_segments_method Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@14::has_segments_method Concept Reference
+
+
+

Concept definition

+
template<typename R>
+
concept dr::ranges::@14::has_segments_method = requires(R r) {
+
{ r.segments() } -> segments_range;
+
}
+
Definition: ranges.hpp:90
+
Definition: ranges.hpp:86
+
+ + + + diff --git a/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1is__localizable.html b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1is__localizable.html new file mode 100644 index 0000000000..d502cc83db --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1is__localizable.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: dr::ranges::@14::is_localizable Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@14::is_localizable Concept Reference
+
+
+

Concept definition

+
template<typename T>
+
concept dr::ranges::@14::is_localizable = is_localizable_helper<T>::value
+
Definition: ranges.hpp:155
+
+ + + + diff --git a/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1is__remote__iterator__shadow__impl__.html b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1is__remote__iterator__shadow__impl__.html new file mode 100644 index 0000000000..38476907de --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1is__remote__iterator__shadow__impl__.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: dr::ranges::@14::is_remote_iterator_shadow_impl_ Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@14::is_remote_iterator_shadow_impl_ Concept Reference
+
+
+

Concept definition

+
template<typename Iter>
+
concept dr::ranges::@14::is_remote_iterator_shadow_impl_ =
+
std::forward_iterator<Iter> && has_rank_method<Iter> &&
+
!disable_rank<std::remove_cv_t<Iter>>
+
Definition: ranges.hpp:22
+ +
+ + + + diff --git a/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1iter__has__local__method.html b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1iter__has__local__method.html new file mode 100644 index 0000000000..f38262ed31 --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1iter__has__local__method.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: dr::ranges::@14::iter_has_local_method Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@14::iter_has_local_method Concept Reference
+
+
+

Concept definition

+
template<typename Iter>
+
concept dr::ranges::@14::iter_has_local_method =
+
std::forward_iterator<Iter> && requires(Iter iter) {
+
{ iter.local() } -> std::forward_iterator;
+
}
+
Definition: ranges.hpp:133
+
+ + + + diff --git a/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1remote__range__shadow__impl__.html b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1remote__range__shadow__impl__.html new file mode 100644 index 0000000000..e0c44376e0 --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1remote__range__shadow__impl__.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: dr::ranges::@14::remote_range_shadow_impl_ Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@14::remote_range_shadow_impl_ Concept Reference
+
+
+

Concept definition

+
template<typename R>
+
concept dr::ranges::@14::remote_range_shadow_impl_ =
+
rng::forward_range<R> && requires(R &r) { dr::ranges::rank(r); }
+ +
+ + + + diff --git a/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1segment__has__local__method.html b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1segment__has__local__method.html new file mode 100644 index 0000000000..f82bd05a8a --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1segment__has__local__method.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: dr::ranges::@14::segment_has_local_method Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@14::segment_has_local_method Concept Reference
+
+
+

Concept definition

+
template<typename Segment>
+
concept dr::ranges::@14::segment_has_local_method =
+
rng::forward_range<Segment> && requires(Segment segment) {
+
{ segment.local() } -> rng::forward_range;
+
}
+ +
+ + + + diff --git a/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1segments__range.html b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1segments__range.html new file mode 100644 index 0000000000..ab08e725bf --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d14_1_1segments__range.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::ranges::@14::segments_range Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@14::segments_range Concept Reference
+
+
+

Concept definition

+
template<typename R>
+
concept dr::ranges::@14::segments_range =
+ + +
Definition: ranges.hpp:86
+
+ + + + diff --git a/doxygen/conceptdr_1_1ranges_1_1____detail_1_1has__local.html b/doxygen/conceptdr_1_1ranges_1_1____detail_1_1has__local.html new file mode 100644 index 0000000000..2338729a39 --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1____detail_1_1has__local.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::ranges::__detail::has_local Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::__detail::has_local Concept Reference
+
+
+

Concept definition

+
template<typename T>
+
concept dr::ranges::__detail::has_local = requires(T &t) {
+
{ dr::ranges::local(t) } -> std::convertible_to<std::any>;
+
}
+
Definition: ranges.hpp:242
+
+ + + + diff --git a/doxygen/conceptdr_1_1remote__contiguous__iterator.html b/doxygen/conceptdr_1_1remote__contiguous__iterator.html new file mode 100644 index 0000000000..1df08f1d5b --- /dev/null +++ b/doxygen/conceptdr_1_1remote__contiguous__iterator.html @@ -0,0 +1,93 @@ + + + + + + + +Distributed Ranges: dr::remote_contiguous_iterator Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::remote_contiguous_iterator Concept Reference
+
+
+

Concept definition

+
template<typename I>
+ +
std::random_access_iterator<I> && requires(I &iter) {
+
dr::ranges::rank(iter);
+
{ dr::ranges::local(iter) } -> std::contiguous_iterator;
+
}
+
Definition: concepts.hpp:24
+
+ + + + diff --git a/doxygen/conceptdr_1_1remote__contiguous__range.html b/doxygen/conceptdr_1_1remote__contiguous__range.html new file mode 100644 index 0000000000..af9ebcb366 --- /dev/null +++ b/doxygen/conceptdr_1_1remote__contiguous__range.html @@ -0,0 +1,93 @@ + + + + + + + +Distributed Ranges: dr::remote_contiguous_range Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::remote_contiguous_range Concept Reference
+
+
+

Concept definition

+
template<typename R>
+ +
remote_range<R> && rng::random_access_range<R> && requires(R &r) {
+
{ dr::ranges::local(r) } -> rng::contiguous_range;
+
}
+
Definition: concepts.hpp:36
+
Definition: concepts.hpp:16
+
+ + + + diff --git a/doxygen/conceptdr_1_1remote__iterator.html b/doxygen/conceptdr_1_1remote__iterator.html new file mode 100644 index 0000000000..0f041999a8 --- /dev/null +++ b/doxygen/conceptdr_1_1remote__iterator.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: dr::remote_iterator Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::remote_iterator Concept Reference
+
+
+

Concept definition

+
template<typename I>
+ +
std::forward_iterator<I> && requires(I &iter) { dr::ranges::rank(iter); }
+
Definition: concepts.hpp:12
+
+ + + + diff --git a/doxygen/conceptdr_1_1remote__range.html b/doxygen/conceptdr_1_1remote__range.html new file mode 100644 index 0000000000..29233c5e1f --- /dev/null +++ b/doxygen/conceptdr_1_1remote__range.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: dr::remote_range Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::remote_range Concept Reference
+
+
+

Concept definition

+
template<typename R>
+
concept dr::remote_range =
+
rng::forward_range<R> && requires(R &r) { dr::ranges::rank(r); }
+
Definition: concepts.hpp:16
+
+ + + + diff --git a/doxygen/conceptdr_1_1sp_1_1____detail_1_1is__syclmemcopyable.html b/doxygen/conceptdr_1_1sp_1_1____detail_1_1is__syclmemcopyable.html new file mode 100644 index 0000000000..1a68ef41bd --- /dev/null +++ b/doxygen/conceptdr_1_1sp_1_1____detail_1_1is__syclmemcopyable.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: dr::sp::__detail::is_syclmemcopyable Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::__detail::is_syclmemcopyable Concept Reference
+
+
+

Concept definition

+
template<typename Src, typename Dest>
+
concept dr::sp::__detail::is_syclmemcopyable = std::is_same_v<std::remove_const_t<Src>, Dest> &&
+
std::is_trivially_copyable_v<Dest>
+
Definition: detail.hpp:21
+
+ + + + diff --git a/doxygen/conceptdr_1_1sp_1_1____detail_1_1sycl__device__selector.html b/doxygen/conceptdr_1_1sp_1_1____detail_1_1sycl__device__selector.html new file mode 100644 index 0000000000..6fc78ea436 --- /dev/null +++ b/doxygen/conceptdr_1_1sp_1_1____detail_1_1sycl__device__selector.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::sp::__detail::sycl_device_selector Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::sp::__detail::sycl_device_selector Concept Reference
+
+
+

Concept definition

+
template<typename T>
+
concept dr::sp::__detail::sycl_device_selector = requires(T &t, const sycl::device &device) {
+
{ t(device) } -> std::convertible_to<int>;
+
}
+ +
+ + + + diff --git a/doxygen/concepts.html b/doxygen/concepts.html new file mode 100644 index 0000000000..b73c9af540 --- /dev/null +++ b/doxygen/concepts.html @@ -0,0 +1,116 @@ + + + + + + + +Distributed Ranges: Concepts + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Concepts
+
+
+
Here is a list of all documented concepts with brief descriptions:
+
[detail level 1234]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Ndr
 N__detail
 Rmdspan_like
 Rmdarray_like
 Nmp
 N__detail
 Rone_argument
 Rtwo_arguments
 Rzipable
 Ris_distributed
 Rhas_segments
 Rno_segments
 Rhas_halo_method
 Ris_mdspan_view
 Nranges
 N__detail
 Rhas_local
 Nsp
 N__detail
 Ris_syclmemcopyable
 Rsycl_device_selector
 Rremote_iterator
 Rremote_range
 Rdistributed_range
 Rremote_contiguous_iterator
 Rdistributed_iterator
 Rremote_contiguous_range
 Rdistributed_contiguous_range
 Rdistributed_contiguous_iterator
 RTupleLike
 Rdistributed_mdspan_range
+
+
+ + + + diff --git a/doxygen/concepts_8hpp_source.html b/doxygen/concepts_8hpp_source.html new file mode 100644 index 0000000000..a4428f0249 --- /dev/null +++ b/doxygen/concepts_8hpp_source.html @@ -0,0 +1,152 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/concepts/concepts.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
concepts.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/detail/ranges.hpp>
+
8
+
9namespace dr {
+
10
+
11template <typename I>
+ +
13 std::forward_iterator<I> && requires(I &iter) { dr::ranges::rank(iter); };
+
14
+
15template <typename R>
+
16concept remote_range =
+
17 rng::forward_range<R> && requires(R &r) { dr::ranges::rank(r); };
+
18
+
19template <typename R>
+ +
21 rng::forward_range<R> && requires(R &r) { dr::ranges::segments(r); };
+
22
+
23template <typename I>
+ +
25 std::random_access_iterator<I> && requires(I &iter) {
+
26 dr::ranges::rank(iter);
+
27 { dr::ranges::local(iter) } -> std::contiguous_iterator;
+
28 };
+
29
+
30template <typename I>
+
31concept distributed_iterator = std::forward_iterator<I> && requires(I &iter) {
+
32 dr::ranges::segments(iter);
+
33};
+
34
+
35template <typename R>
+ +
37 remote_range<R> && rng::random_access_range<R> && requires(R &r) {
+
38 { dr::ranges::local(r) } -> rng::contiguous_range;
+
39 };
+
40
+
41template <typename R>
+ +
43 distributed_range<R> && rng::random_access_range<R> &&
+
44 requires(R &r) {
+
45 { dr::ranges::segments(r) } -> rng::random_access_range;
+
46 } &&
+ +
48 rng::range_value_t<decltype(dr::ranges::segments(std::declval<R>()))>>;
+
49
+
50template <typename Iter>
+ +
52 distributed_iterator<Iter> && rng::random_access_iterator<Iter> &&
+
53 requires(Iter &iter) {
+
54 { dr::ranges::segments(iter) } -> rng::random_access_range;
+
55 } &&
+
56 remote_contiguous_range<rng::range_value_t<decltype(dr::ranges::segments(
+
57 std::declval<Iter>()))>>;
+
58
+
59} // namespace dr
+
Definition: concepts.hpp:51
+
Definition: concepts.hpp:42
+
Definition: concepts.hpp:31
+
Definition: concepts.hpp:20
+
Definition: concepts.hpp:24
+
Definition: concepts.hpp:36
+
Definition: concepts.hpp:12
+
Definition: concepts.hpp:16
+
+ + + + diff --git a/doxygen/containers_2detail_8hpp_source.html b/doxygen/containers_2detail_8hpp_source.html new file mode 100644 index 0000000000..53db167faa --- /dev/null +++ b/doxygen/containers_2detail_8hpp_source.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/detail.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
detail.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <cmath>
+
8
+
9namespace dr::sp {
+
10
+
11namespace detail {
+
12
+
13// Factor n into 2 roughly equal factors
+
14// n = pq, p >= q
+
15inline std::tuple<std::size_t, std::size_t> factor(std::size_t n) {
+
16 std::size_t q = std::sqrt(n);
+
17
+
18 while (q > 1 && n / q != static_cast<double>(n) / q) {
+
19 q--;
+
20 }
+
21 std::size_t p = n / q;
+
22
+
23 return {p, q};
+
24}
+
25
+
26} // namespace detail
+
27
+
28} // namespace dr::sp
+
+ + + + diff --git a/doxygen/coo__matrix_8hpp_source.html b/doxygen/coo__matrix_8hpp_source.html new file mode 100644 index 0000000000..dc51cf5cdc --- /dev/null +++ b/doxygen/coo__matrix_8hpp_source.html @@ -0,0 +1,259 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/util/coo_matrix.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
coo_matrix.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/sp/containers/matrix_entry.hpp>
+
8#include <memory>
+
9#include <vector>
+
10
+
11namespace dr::sp {
+
12
+
13namespace __detail {
+
14
+
15template <typename T, typename I, typename Allocator = std::allocator<T>>
+ +
17public:
+ +
19 using scalar_type = T;
+
20 using index_type = I;
+
21 using size_type = std::size_t;
+
22 using difference_type = std::ptrdiff_t;
+
23
+
24 using allocator_type = Allocator;
+
25
+
26 using key_type = dr::index<I>;
+
27 using map_type = T;
+
28
+
29 using backend_allocator_type = typename std::allocator_traits<
+
30 allocator_type>::template rebind_alloc<value_type>;
+
31 using backend_type = std::vector<value_type, backend_allocator_type>;
+
32
+
33 using iterator = typename backend_type::iterator;
+
34 using const_iterator = typename backend_type::const_iterator;
+
35
+ + +
38
+
39 using scalar_reference = T &;
+
40
+
41 coo_matrix(dr::index<I> shape) : shape_(shape) {}
+
42
+
43 dr::index<I> shape() const noexcept { return shape_; }
+
44
+
45 size_type size() const noexcept { return tuples_.size(); }
+
46
+
47 void reserve(size_type new_cap) { tuples_.reserve(new_cap); }
+
48
+
49 iterator begin() noexcept { return tuples_.begin(); }
+
50
+
51 const_iterator begin() const noexcept { return tuples_.begin(); }
+
52
+
53 iterator end() noexcept { return tuples_.end(); }
+
54
+
55 const_iterator end() const noexcept { return tuples_.end(); }
+
56
+
57 template <typename InputIt> void insert(InputIt first, InputIt last) {
+
58 for (auto iter = first; iter != last; ++iter) {
+
59 insert(*iter);
+
60 }
+
61 }
+
62
+
63 template <typename InputIt> void push_back(InputIt first, InputIt last) {
+
64 for (auto iter = first; iter != last; ++iter) {
+
65 push_back(*iter);
+
66 }
+
67 }
+
68
+
69 void push_back(const value_type &value) { tuples_.push_back(value); }
+
70
+
71 template <typename InputIt> void assign_tuples(InputIt first, InputIt last) {
+
72 tuples_.assign(first, last);
+
73 }
+
74
+
75 std::pair<iterator, bool> insert(value_type &&value) {
+
76 auto &&[insert_index, insert_value] = value;
+
77 for (auto iter = begin(); iter != end(); ++iter) {
+
78 auto &&[index, v] = *iter;
+
79 if (index == insert_index) {
+
80 return {iter, false};
+
81 }
+
82 }
+
83 tuples_.push_back(value);
+
84 return {--tuples_.end(), true};
+
85 }
+
86
+
87 std::pair<iterator, bool> insert(const value_type &value) {
+
88 auto &&[insert_index, insert_value] = value;
+
89 for (auto iter = begin(); iter != end(); ++iter) {
+
90 auto &&[index, v] = *iter;
+
91 if (index == insert_index) {
+
92 return {iter, false};
+
93 }
+
94 }
+
95 tuples_.push_back(value);
+
96 return {--tuples_.end(), true};
+
97 }
+
98
+
99 template <class M>
+
100 std::pair<iterator, bool> insert_or_assign(key_type k, M &&obj) {
+
101 for (auto iter = begin(); iter != end(); ++iter) {
+
102 auto &&[index, v] = *iter;
+
103 if (index == k) {
+
104 v = std::forward<M>(obj);
+
105 return {iter, false};
+
106 }
+
107 }
+
108 tuples_.push_back({k, std::forward<M>(obj)});
+
109 return {--tuples_.end(), true};
+
110 }
+
111
+
112 iterator find(key_type key) noexcept {
+
113 return std::find_if(begin(), end(), [&](auto &&v) {
+
114 auto &&[i, v_] = v;
+
115 return i == key;
+
116 });
+
117 }
+
118
+
119 const_iterator find(key_type key) const noexcept {
+
120 return std::find_if(begin(), end(), [&](auto &&v) {
+
121 auto &&[i, v_] = v;
+
122 return i == key;
+
123 });
+
124 }
+
125
+
126 void reshape(dr::index<I> shape) {
+
127 bool all_inside = true;
+
128 for (auto &&[index, v] : *this) {
+
129 auto &&[i, j] = index;
+
130 if (!(i < shape[0] && j < shape[1])) {
+
131 all_inside = false;
+
132 break;
+
133 }
+
134 }
+
135
+
136 if (all_inside) {
+
137 shape_ = shape;
+
138 return;
+
139 } else {
+
140 coo_matrix<T, I> new_tuples(shape);
+
141 for (auto &&[index, v] : *this) {
+
142 auto &&[i, j] = index;
+
143 if (i < shape[0] && j < shape[1]) {
+
144 new_tuples.insert({index, v});
+
145 }
+
146 }
+
147 shape_ = shape;
+
148 assign_tuples(new_tuples.begin(), new_tuples.end());
+
149 }
+
150 }
+
151
+
152 coo_matrix() = default;
+
153 ~coo_matrix() = default;
+
154 coo_matrix(const coo_matrix &) = default;
+
155 coo_matrix(coo_matrix &&) = default;
+
156 coo_matrix &operator=(const coo_matrix &) = default;
+
157 coo_matrix &operator=(coo_matrix &&) = default;
+
158
+
159 std::size_t nbytes() const noexcept {
+
160 return tuples_.size() * sizeof(value_type);
+
161 }
+
162
+
163private:
+
164 dr::index<I> shape_;
+
165 backend_type tuples_;
+
166};
+
167
+
168} // namespace __detail
+
169
+
170} // namespace dr::sp
+ +
Definition: coo_matrix.hpp:16
+
Definition: matrix_entry.hpp:15
+
Definition: matrix_entry.hpp:112
+
+ + + + diff --git a/doxygen/count_8hpp_source.html b/doxygen/count_8hpp_source.html new file mode 100644 index 0000000000..0a5e477e5c --- /dev/null +++ b/doxygen/count_8hpp_source.html @@ -0,0 +1,214 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/count.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
count.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7namespace dr::mp::__detail {
+
8
+
9inline auto add_counts(rng::forward_range auto &&r) {
+
10 rng::range_difference_t<decltype(r)> zero{};
+
11
+
12 return std::accumulate(rng::begin(r), rng::end(r), zero);
+
13}
+
14
+
15inline auto count_if_local(rng::forward_range auto &&r, auto &&pred) {
+
16 if (mp::use_sycl()) {
+
17 dr::drlog.debug(" with DPL\n");
+
18#ifdef SYCL_LANGUAGE_VERSION
+
19 return std::count_if(mp::dpl_policy(),
+
20 dr::__detail::direct_iterator(rng::begin(r)),
+
21 dr::__detail::direct_iterator(rng::end(r)), pred);
+
22#else
+
23 assert(false);
+
24#endif
+
25 } else {
+
26 dr::drlog.debug(" with CPU\n");
+
27 return std::count_if(std::execution::par_unseq,
+
28 dr::__detail::direct_iterator(rng::begin(r)),
+
29 dr::__detail::direct_iterator(rng::end(r)), pred);
+
30 }
+
31}
+
32
+
33template <dr::distributed_range DR>
+
34auto count_if(std::size_t root, bool root_provided, DR &&dr, auto &&pred) {
+
35 using count_type = rng::range_difference_t<decltype(dr)>;
+
36 auto comm = mp::default_comm();
+
37
+
38 if (rng::empty(dr)) {
+
39 return count_type{};
+
40 }
+
41
+
42 dr::drlog.debug("Parallel count\n");
+
43
+
44 // Count within the local segments
+
45 auto count = [=](auto &&r) {
+
46 assert(rng::size(r) > 0);
+
47 return count_if_local(r, pred);
+
48 };
+
49 auto locals = rng::views::transform(local_segments(dr), count);
+
50 auto local = add_counts(locals);
+
51
+
52 std::vector<count_type> all(comm.size());
+
53 if (root_provided) {
+
54 // Everyone gathers to root, only root adds up the counts
+
55 comm.gather(local, std::span{all}, root);
+
56 if (root == comm.rank()) {
+
57 return add_counts(all);
+
58 } else {
+
59 return count_type{};
+
60 }
+
61 } else {
+
62 // Everyone gathers and everyone adds up the counts
+
63 comm.all_gather(local, all);
+
64 return add_counts(all);
+
65 }
+
66}
+
67
+
68} // namespace dr::mp::__detail
+
69
+
70namespace dr::mp {
+
71
+
72class count_fn_ {
+
73public:
+
74 template <typename T, dr::distributed_range DR>
+
75 auto operator()(std::size_t root, DR &&dr, const T &value) const {
+
76 auto pred = [=](auto &&v) { return v == value; };
+
77 return __detail::count_if(root, true, dr, pred);
+
78 }
+
79
+
80 template <typename T, dr::distributed_range DR>
+
81 auto operator()(DR &&dr, const T &value) const {
+
82 auto pred = [=](auto &&v) { return v == value; };
+
83 return __detail::count_if(0, false, dr, pred);
+
84 }
+
85
+
86 template <typename T, dr::distributed_iterator DI>
+
87 auto operator()(std::size_t root, DI first, DI last, const T &value) const {
+
88 auto pred = [=](auto &&v) { return v == value; };
+
89 return __detail::count_if(root, true, rng::subrange(first, last), pred);
+
90 }
+
91
+
92 template <typename T, dr::distributed_iterator DI>
+
93 auto operator()(DI first, DI last, const T &value) const {
+
94 auto pred = [=](auto &&v) { return v == value; };
+
95 return __detail::count_if(0, false, rng::subrange(first, last), pred);
+
96 }
+
97};
+
98
+
99inline constexpr count_fn_ count;
+
100
+ +
102public:
+
103 template <dr::distributed_range DR>
+
104 auto operator()(std::size_t root, DR &&dr, auto &&pred) const {
+
105 return __detail::count_if(root, true, dr, pred);
+
106 }
+
107
+
108 template <dr::distributed_range DR>
+
109 auto operator()(DR &&dr, auto &&pred) const {
+
110 return __detail::count_if(0, false, dr, pred);
+
111 }
+
112
+
113 template <dr::distributed_iterator DI>
+
114 auto operator()(std::size_t root, DI first, DI last, auto &&pred) const {
+
115 return __detail::count_if(root, true, rng::subrange(first, last), pred);
+
116 }
+
117
+
118 template <dr::distributed_iterator DI>
+
119 auto operator()(DI first, DI last, auto &&pred) const {
+
120 return __detail::count_if(0, false, rng::subrange(first, last), pred);
+
121 }
+
122};
+
123
+
124inline constexpr count_if_fn_ count_if;
+
125
+
126}; // namespace dr::mp
+
Definition: onedpl_direct_iterator.hpp:15
+
Definition: count.hpp:72
+
Definition: count.hpp:101
+
+ + + + diff --git a/doxygen/csr__matrix__view_8hpp_source.html b/doxygen/csr__matrix__view_8hpp_source.html new file mode 100644 index 0000000000..c8f8f773bc --- /dev/null +++ b/doxygen/csr__matrix__view_8hpp_source.html @@ -0,0 +1,316 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/views/csr_matrix_view.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
csr_matrix_view.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/detail/index.hpp>
+
8#include <dr/sp/containers/matrix_entry.hpp>
+
9#include <iterator>
+
10
+
11namespace dr::sp {
+
12
+
13template <typename T, typename I, typename TIter, typename IIter>
+ +
15public:
+
16 using size_type = std::size_t;
+
17 using difference_type = std::ptrdiff_t;
+
18
+
19 using scalar_type = std::iter_value_t<TIter>;
+
20 using scalar_reference = std::iter_reference_t<TIter>;
+
21
+
22 using index_type = I;
+
23
+ +
25
+ +
27
+
28 using iterator_category = std::random_access_iterator_tag;
+
29
+ + + +
33
+
34 using key_type = dr::index<I>;
+
35
+
36 constexpr csr_matrix_view_accessor() noexcept = default;
+
37 constexpr ~csr_matrix_view_accessor() noexcept = default;
+ +
39 const csr_matrix_view_accessor &) noexcept = default;
+
40 constexpr csr_matrix_view_accessor &
+
41 operator=(const csr_matrix_view_accessor &) noexcept = default;
+
42
+
43 constexpr csr_matrix_view_accessor(TIter values, IIter rowptr, IIter colind,
+
44 size_type idx, index_type row,
+
45 size_type row_dim) noexcept
+
46 : values_(values), rowptr_(rowptr), colind_(colind), idx_(idx), row_(row),
+
47 row_dim_(row_dim), idx_offset_(key_type{0, 0}) {
+
48 fast_forward_row();
+
49 }
+
50
+
51 constexpr csr_matrix_view_accessor(TIter values, IIter rowptr, IIter colind,
+
52 size_type idx, index_type row,
+
53 size_type row_dim,
+
54 key_type idx_offset) noexcept
+
55 : values_(values), rowptr_(rowptr), colind_(colind), idx_(idx), row_(row),
+
56 row_dim_(row_dim), idx_offset_(idx_offset) {
+
57 fast_forward_row();
+
58 }
+
59
+
60 // Given that `idx_` has just been advanced to an element
+
61 // possibly in a new row, advance `row_` to find the new row.
+
62 // That is:
+
63 // Advance `row_` until idx_ >= rowptr_[row_] && idx_ < rowptr_[row_+1]
+
64 void fast_forward_row() noexcept {
+
65 while (row_ < row_dim_ - 1 && idx_ >= rowptr_[row_ + 1]) {
+
66 row_++;
+
67 }
+
68 }
+
69
+
70 // Given that `idx_` has just been retreated to an element
+
71 // possibly in a previous row, retreat `row_` to find the new row.
+
72 // That is:
+
73 // Retreat `row_` until idx_ >= rowptr_[row_] && idx_ < rowptr_[row_+1]
+
74 void fast_backward_row() noexcept {
+
75 while (idx_ < rowptr_[row_]) {
+
76 row_--;
+
77 }
+
78 }
+
79
+
80 constexpr csr_matrix_view_accessor &
+
81 operator+=(difference_type offset) noexcept {
+
82 idx_ += offset;
+
83 if (offset < 0) {
+
84 fast_backward_row();
+
85 } else {
+
86 fast_forward_row();
+
87 }
+
88 return *this;
+
89 }
+
90
+
91 constexpr bool operator==(const iterator_accessor &other) const noexcept {
+
92 return idx_ == other.idx_;
+
93 }
+
94
+
95 constexpr difference_type
+
96 operator-(const iterator_accessor &other) const noexcept {
+
97 return difference_type(idx_) - difference_type(other.idx_);
+
98 }
+
99
+
100 constexpr bool operator<(const iterator_accessor &other) const noexcept {
+
101 return idx_ < other.idx_;
+
102 }
+
103
+
104 constexpr reference operator*() const noexcept {
+
105 return reference(
+
106 key_type(row_ + idx_offset_[0], colind_[idx_] + idx_offset_[1]),
+
107 values_[idx_]);
+
108 }
+
109
+
110private:
+
111 TIter values_;
+
112 IIter rowptr_;
+
113 IIter colind_;
+
114 size_type idx_;
+
115 index_type row_;
+
116 size_type row_dim_;
+
117 key_type idx_offset_;
+
118};
+
119
+
120template <typename T, typename I, typename TIter, typename IIter>
+ + +
123
+
124template <typename T, typename I, typename TIter = T *, typename IIter = I *>
+ +
126 : public rng::view_interface<csr_matrix_view<T, I, TIter, IIter>> {
+
127public:
+
128 using size_type = std::size_t;
+
129 using difference_type = std::ptrdiff_t;
+
130
+
131 using scalar_reference = std::iter_reference_t<TIter>;
+ +
133
+
134 using scalar_type = T;
+
135 using index_type = I;
+
136
+
137 using key_type = dr::index<I>;
+
138 using map_type = T;
+
139
+ +
141
+
142 csr_matrix_view(TIter values, IIter rowptr, IIter colind, key_type shape,
+
143 size_type nnz, size_type rank)
+
144 : values_(values), rowptr_(rowptr), colind_(colind), shape_(shape),
+
145 nnz_(nnz), rank_(rank), idx_offset_(key_type{0, 0}) {}
+
146
+
147 csr_matrix_view(TIter values, IIter rowptr, IIter colind, key_type shape,
+
148 size_type nnz, size_type rank, key_type idx_offset)
+
149 : values_(values), rowptr_(rowptr), colind_(colind), shape_(shape),
+
150 nnz_(nnz), rank_(rank), idx_offset_(idx_offset) {}
+
151
+
152 key_type shape() const noexcept { return shape_; }
+
153
+
154 size_type size() const noexcept { return nnz_; }
+
155
+
156 std::size_t rank() const { return rank_; }
+
157
+
158 iterator begin() const {
+
159 return iterator(values_, rowptr_, colind_, 0, 0, shape()[0], idx_offset_);
+
160 }
+
161
+
162 iterator end() const {
+
163 return iterator(values_, rowptr_, colind_, nnz_, shape()[0], shape()[0],
+
164 idx_offset_);
+
165 }
+
166
+
167 auto row(I row_index) const {
+
168 I first = rowptr_[row_index];
+
169 I last = rowptr_[row_index + 1];
+
170
+
171 TIter values = values_;
+
172 IIter colind = colind_;
+
173
+
174 auto row_elements = rng::views::iota(first, last);
+
175
+
176 return row_elements | rng::views::transform([=](auto idx) {
+
177 return reference(key_type(row_index, colind[idx]), values[idx]);
+
178 });
+
179 }
+
180
+
181 auto submatrix(key_type rows, key_type columns) const {
+
182 return rng::views::iota(rows[0], rows[1]) |
+
183 rng::views::transform([=, *this](auto &&row_index) {
+
184 return row(row_index) | rng::views::drop_while([=](auto &&e) {
+
185 auto &&[index, v] = e;
+
186 return index[1] < columns[0];
+
187 }) |
+
188 rng::views::take_while([=](auto &&e) {
+
189 auto &&[index, v] = e;
+
190 return index[1] < columns[1];
+
191 }) |
+
192 rng::views::transform([=](auto &&elem) {
+
193 auto &&[index, v] = elem;
+
194 auto &&[i, j] = index;
+
195 return reference(key_type(i - rows[0], j - columns[0]),
+
196 v);
+
197 });
+
198 }) |
+
199 rng::views::join;
+
200 }
+
201
+
202 auto values_data() const { return values_; }
+
203
+
204 auto rowptr_data() const { return rowptr_; }
+
205
+
206 auto colind_data() const { return colind_; }
+
207
+
208private:
+
209 TIter values_;
+
210 IIter rowptr_;
+
211 IIter colind_;
+
212
+
213 key_type shape_;
+
214 size_type nnz_;
+
215
+
216 size_type rank_;
+
217 key_type idx_offset_;
+
218};
+
219
+
220template <typename TIter, typename IIter, typename... Args>
+
221csr_matrix_view(TIter, IIter, IIter, Args &&...)
+
222 -> csr_matrix_view<std::iter_value_t<TIter>, std::iter_value_t<IIter>,
+
223 TIter, IIter>;
+
224
+
225} // namespace dr::sp
+ +
Definition: iterator_adaptor.hpp:23
+
Definition: csr_matrix_view.hpp:14
+
Definition: csr_matrix_view.hpp:126
+
Definition: matrix_entry.hpp:15
+
Definition: matrix_entry.hpp:112
+
+ + + + diff --git a/doxygen/dense__column__view_8hpp_source.html b/doxygen/dense__column__view_8hpp_source.html new file mode 100644 index 0000000000..589d9bed95 --- /dev/null +++ b/doxygen/dense__column__view_8hpp_source.html @@ -0,0 +1,202 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/views/dense_column_view.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dense_column_view.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/detail/index.hpp>
+
8#include <dr/sp/containers/matrix_entry.hpp>
+
9#include <iterator>
+
10
+
11namespace dr::sp {
+
12template <typename T, typename Iter> class dense_matrix_column_accessor {
+
13public:
+
14 using size_type = std::size_t;
+
15 using difference_type = std::ptrdiff_t;
+
16
+
17 using scalar_value_type = std::iter_value_t<Iter>;
+
18 using scalar_reference = std::iter_reference_t<Iter>;
+
19
+ +
21
+ +
23
+
24 using iterator_category = std::random_access_iterator_tag;
+
25
+ + + +
29
+
30 using key_type = dr::index<>;
+
31
+
32 constexpr dense_matrix_column_accessor() noexcept = default;
+
33 constexpr ~dense_matrix_column_accessor() noexcept = default;
+ +
35 const dense_matrix_column_accessor &) noexcept = default;
+ +
37 operator=(const dense_matrix_column_accessor &) noexcept = default;
+
38
+
39 constexpr dense_matrix_column_accessor(Iter data, std::size_t i,
+
40 std::size_t j, std::size_t ld) noexcept
+
41 : data_(data), i_(i), j_(j), ld_(ld) {}
+
42
+ +
44 operator+=(difference_type offset) noexcept {
+
45 i_ += offset;
+
46 return *this;
+
47 }
+
48
+
49 constexpr bool operator==(const iterator_accessor &other) const noexcept {
+
50 return i_ == other.i_;
+
51 }
+
52
+
53 constexpr difference_type
+
54 operator-(const iterator_accessor &other) const noexcept {
+
55 return difference_type(i_) - difference_type(other.i_);
+
56 }
+
57
+
58 constexpr bool operator<(const iterator_accessor &other) const noexcept {
+
59 return i_ < other.i_;
+
60 }
+
61
+
62 constexpr reference operator*() const noexcept {
+
63 return reference(key_type({i_, j_}), data_[i_ * ld_]);
+
64 }
+
65
+
66private:
+
67 size_type i_, j_;
+
68 size_type ld_;
+
69
+
70 Iter data_;
+
71};
+
72
+
73template <typename T, typename Iter>
+ + +
76
+
77template <typename T, typename Iter> class dense_matrix_column_view {
+
78public:
+
79 using size_type = std::size_t;
+
80 using difference_type = std::ptrdiff_t;
+
81
+
82 using scalar_reference = std::iter_reference_t<Iter>;
+
83
+
84 using key_type = dr::index<>;
+
85 using map_type = T;
+
86
+ +
88
+
89 dense_matrix_column_view(Iter data, size_type column_idx, size_type size,
+
90 size_type ld)
+
91 : data_(data), column_idx_(column_idx), size_(size), ld_(ld) {}
+
92
+
93 scalar_reference operator[](size_type idx) { return data_[idx * ld_]; }
+
94
+
95 iterator begin() const { return iterator(data_, 0, column_idx_, ld_); }
+
96
+
97 iterator end() const { return iterator(data_, size_, column_idx_, ld_); }
+
98
+
99 size_type size() const noexcept { return size_; }
+
100
+
101 Iter data_;
+
102 size_type column_idx_;
+
103 size_type size_;
+
104 size_type ld_;
+
105};
+
106
+
107template <std::random_access_iterator Iter>
+
108dense_matrix_column_view(Iter, std::size_t, std::size_t, std::size_t)
+ +
110
+
111} // namespace dr::sp
+
Definition: index.hpp:34
+
Definition: iterator_adaptor.hpp:23
+
Definition: dense_column_view.hpp:12
+
Definition: dense_column_view.hpp:77
+
Definition: matrix_entry.hpp:15
+
Definition: matrix_entry.hpp:112
+
+ + + + diff --git a/doxygen/dense__matrix_8hpp_source.html b/doxygen/dense__matrix_8hpp_source.html new file mode 100644 index 0000000000..a8f13eb09d --- /dev/null +++ b/doxygen/dense__matrix_8hpp_source.html @@ -0,0 +1,232 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/sequential/dense_matrix.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dense_matrix.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <iterator>
+
8
+
9#include <dr/detail/index.hpp>
+
10#include <dr/detail/iterator_adaptor.hpp>
+
11#include <dr/sp/containers/matrix_entry.hpp>
+
12#include <dr/sp/views/dense_column_view.hpp>
+
13#include <dr/sp/views/dense_matrix_iterator.hpp>
+
14#include <dr/sp/views/dense_row_view.hpp>
+
15
+
16namespace dr::sp {
+
17
+
18template <typename T, typename Allocator = std::allocator<T>>
+ +
20public:
+
21 using size_type = std::size_t;
+
22 using difference_type = std::ptrdiff_t;
+
23
+
24 using allocator_type = Allocator;
+
25
+
26 using scalar_pointer = typename std::allocator_traits<Allocator>::pointer;
+
27
+
28 using scalar_reference = std::iter_reference_t<scalar_pointer>;
+ +
30
+
31 using key_type = dr::index<>;
+
32 using map_type = T;
+
33
+ +
35
+ +
37 : allocator_(Allocator()), shape_(shape), ld_(shape[1]) {
+
38 data_ = allocator_.allocate(shape_[0] * shape_[1]);
+
39 }
+
40
+
41 dense_matrix(key_type shape, std::size_t ld)
+
42 requires(std::is_default_constructible_v<Allocator>)
+
43 : allocator_(Allocator()), shape_(shape), ld_(ld) {
+
44 data_ = allocator_.allocate(shape_[0] * ld_);
+
45 }
+
46
+
47 dense_matrix(key_type shape, std::size_t ld, const Allocator &alloc)
+
48 : allocator_(alloc), shape_(shape), ld_(ld) {
+
49 data_ = allocator_.allocate(shape_[0] * ld_);
+
50 }
+
51
+ +
53 : allocator_(other.allocator_), data_(other.data_), shape_(other.shape_),
+
54 ld_(other.ld_) {
+
55 other.null_data_();
+
56 }
+
57
+
58 dense_matrix &operator=(dense_matrix &&other) {
+
59 deallocate_storage_();
+
60 allocator_ = other.allocator_;
+
61 data_ = other.data_;
+
62 shape_ = other.shape_;
+
63 ld_ = other.ld_;
+
64
+
65 other.null_data_();
+
66 }
+
67
+
68 dense_matrix(const dense_matrix &other) = delete;
+
69 dense_matrix &operator=(const dense_matrix &other) = delete;
+
70
+
71 ~dense_matrix() { deallocate_storage_(); }
+
72
+
73 key_type shape() const noexcept { return shape_; }
+
74
+
75 size_type size() const noexcept { return shape()[0] * shape()[1]; }
+
76
+
77 scalar_reference operator[](key_type idx) const {
+
78 return data_[idx[0] * ld_ + idx[1]];
+
79 }
+
80
+
81 iterator begin() const {
+
82 return iterator(data_, key_type{0, 0}, shape_, ld_);
+
83 }
+
84
+
85 iterator end() const {
+
86 return iterator(data_, key_type{shape_[0], 0}, shape_, ld_);
+
87 }
+
88
+
89 auto row(size_type row_index) const {
+
90 // return dense_matrix_row_view(data_ + row_index * ld_, row_index,
+
91 // shape()[1]);
+
92 auto row_elements = rng::views::iota(size_type(0), size_type(shape()[1]));
+
93 scalar_pointer data = data_ + row_index * ld_;
+
94
+
95 return row_elements | rng::views::transform([=](auto column_index) {
+
96 return reference(key_type(row_index, column_index),
+
97 data[column_index]);
+
98 });
+
99 }
+
100
+
101 auto column(size_type column_index) const {
+
102 // return dense_matrix_column_view(data_ + column_index, column_index,
+
103 // shape()[0], ld_);
+
104 auto column_elements =
+
105 rng::views::iota(size_type(0), size_type(shape()[0]));
+
106 scalar_pointer data = data_ + column_index;
+
107 size_type ld = ld_;
+
108
+
109 return column_elements | rng::views::transform([=](auto row_index) {
+
110 return reference(key_type(row_index, column_index),
+
111 data[row_index * ld]);
+
112 });
+
113 }
+
114
+
115 scalar_pointer data() const { return data_; }
+
116
+
117 size_type ld() const { return ld_; }
+
118
+
119 /*
+
120 auto local() const {
+
121 }
+
122 */
+
123
+
124private:
+
125 void deallocate_storage_() {
+
126 if (data_ != nullptr) {
+
127 allocator_.deallocate(data_, shape_[0] * ld_);
+
128 }
+
129 }
+
130
+
131 void null_data_() {
+
132 data_ = nullptr;
+
133 shape_ = {0, 0};
+
134 ld_ = 0;
+
135 }
+
136
+
137 allocator_type allocator_;
+
138 scalar_pointer data_;
+
139 key_type shape_;
+
140 size_type ld_;
+
141};
+
142
+
143} // namespace dr::sp
+
Definition: index.hpp:34
+
Definition: iterator_adaptor.hpp:23
+
Definition: dense_matrix.hpp:19
+
Definition: matrix_entry.hpp:112
+
+ + + + diff --git a/doxygen/dense__matrix__iterator_8hpp_source.html b/doxygen/dense__matrix__iterator_8hpp_source.html new file mode 100644 index 0000000000..2de9689f66 --- /dev/null +++ b/doxygen/dense__matrix__iterator_8hpp_source.html @@ -0,0 +1,199 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/views/dense_matrix_iterator.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dense_matrix_iterator.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <iterator>
+
8
+
9#include <dr/detail/index.hpp>
+
10#include <dr/detail/iterator_adaptor.hpp>
+
11#include <dr/sp/containers/matrix_entry.hpp>
+
12#include <dr/sp/views/dense_column_view.hpp>
+
13#include <dr/sp/views/dense_row_view.hpp>
+
14
+
15namespace dr::sp {
+
16
+
17template <typename T, typename Iter> class dense_matrix_accessor {
+
18public:
+
19 using size_type = std::size_t;
+
20 using difference_type = std::ptrdiff_t;
+
21
+
22 using scalar_type = std::iter_value_t<Iter>;
+
23 using scalar_reference = std::iter_reference_t<Iter>;
+
24
+ +
26
+ +
28
+
29 using iterator_category = std::random_access_iterator_tag;
+
30
+ + + +
34
+
35 using key_type = dr::index<>;
+
36
+
37 constexpr dense_matrix_accessor() noexcept = default;
+
38 constexpr ~dense_matrix_accessor() noexcept = default;
+
39 constexpr dense_matrix_accessor(const dense_matrix_accessor &) noexcept =
+
40 default;
+
41 constexpr dense_matrix_accessor &
+
42 operator=(const dense_matrix_accessor &) noexcept = default;
+
43
+
44 constexpr dense_matrix_accessor(Iter data, key_type idx,
+
45 key_type matrix_shape, size_type ld) noexcept
+
46 : data_(data), idx_(idx), matrix_shape_(matrix_shape), ld_(ld),
+
47 idx_offset_({0, 0}) {}
+
48
+
49 constexpr dense_matrix_accessor(Iter data, key_type idx, key_type idx_offset,
+
50 key_type matrix_shape, size_type ld) noexcept
+
51 : data_(data), idx_(idx), matrix_shape_(matrix_shape), ld_(ld),
+
52 idx_offset_(idx_offset) {}
+
53
+
54 constexpr dense_matrix_accessor &operator+=(difference_type offset) noexcept {
+
55 size_type new_idx = get_global_idx() + offset;
+
56 idx_ = {new_idx / matrix_shape_[1], new_idx % matrix_shape_[1]};
+
57
+
58 return *this;
+
59 }
+
60
+
61 constexpr bool operator==(const iterator_accessor &other) const noexcept {
+
62 return idx_ == other.idx_;
+
63 }
+
64
+
65 constexpr difference_type
+
66 operator-(const iterator_accessor &other) const noexcept {
+
67 return difference_type(get_global_idx()) - other.get_global_idx();
+
68 }
+
69
+
70 constexpr bool operator<(const iterator_accessor &other) const noexcept {
+
71 if (idx_[0] < other.idx_[0]) {
+
72 return true;
+
73 } else if (idx_[0] == other.idx_[0]) {
+
74 return idx_[1] < other.idx_[1];
+
75 } else {
+
76 return false;
+
77 }
+
78 }
+
79
+
80 constexpr reference operator*() const noexcept {
+
81 return reference(
+
82 key_type(idx_[0] + idx_offset_[0], idx_[1] + idx_offset_[1]),
+
83 data_[idx_[0] * ld_ + idx_[1]]);
+
84 }
+
85
+
86 Iter data() const noexcept { return data_; }
+
87
+
88private:
+
89 size_type get_global_idx() const noexcept {
+
90 return idx_[0] * matrix_shape_[1] + idx_[1];
+
91 }
+
92
+
93private:
+
94 Iter data_;
+
95 key_type idx_;
+
96 key_type matrix_shape_;
+
97 size_type ld_;
+
98
+
99 key_type idx_offset_;
+
100};
+
101
+
102template <typename T, typename Iter>
+ + +
105
+
106template <typename T, typename Iter>
+ +
108
+
109} // namespace dr::sp
+
Definition: index.hpp:34
+
Definition: iterator_adaptor.hpp:23
+
Definition: dense_matrix_iterator.hpp:17
+
Definition: matrix_entry.hpp:15
+
Definition: matrix_entry.hpp:112
+
+ + + + diff --git a/doxygen/dense__matrix__view_8hpp_source.html b/doxygen/dense__matrix__view_8hpp_source.html new file mode 100644 index 0000000000..03c4455741 --- /dev/null +++ b/doxygen/dense__matrix__view_8hpp_source.html @@ -0,0 +1,214 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/views/dense_matrix_view.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dense_matrix_view.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <iterator>
+
8
+
9#include <dr/detail/index.hpp>
+
10#include <dr/detail/iterator_adaptor.hpp>
+
11#include <dr/sp/containers/matrix_entry.hpp>
+
12#include <dr/sp/containers/sequential/dense_matrix.hpp>
+
13#include <dr/sp/views/dense_column_view.hpp>
+
14#include <dr/sp/views/dense_matrix_iterator.hpp>
+
15#include <dr/sp/views/dense_row_view.hpp>
+
16
+
17namespace dr::sp {
+
18
+
19template <typename T, typename Iter = T *>
+ +
21 : public rng::view_interface<dense_matrix_view<T, Iter>> {
+
22public:
+
23 using size_type = std::size_t;
+
24 using difference_type = std::ptrdiff_t;
+
25
+
26 using scalar_reference = std::iter_reference_t<Iter>;
+ +
28
+
29 using key_type = dr::index<>;
+
30 using map_type = T;
+
31
+ +
33
+
34 dense_matrix_view(Iter data, key_type shape, size_type ld, size_type rank)
+
35 : data_(data), shape_(shape), idx_offset_(key_type{0, 0}), ld_(ld),
+
36 rank_(rank) {}
+
37
+
38 dense_matrix_view(Iter data, key_type shape, key_type idx_offset,
+
39 size_type ld, size_type rank)
+
40 : data_(data), shape_(shape), idx_offset_(idx_offset), ld_(ld),
+
41 rank_(rank) {}
+
42
+
43 template <typename Allocator>
+
44 requires(std::is_same_v<typename std::allocator_traits<Allocator>::pointer,
+
45 Iter>)
+ +
47 : data_(m.data()), shape_(m.shape()), idx_offset_(key_type{0, 0}),
+
48 ld_(m.ld()), rank_(0) {}
+
49
+
50 key_type shape() const noexcept { return shape_; }
+
51
+
52 size_type size() const noexcept { return shape()[0] * shape()[1]; }
+
53
+
54 scalar_reference operator[](key_type idx) const {
+
55 return data_[idx[0] * ld_ + idx[1]];
+
56 }
+
57
+
58 iterator begin() const {
+
59 return iterator(data_, key_type{0, 0}, idx_offset_, shape_, ld_);
+
60 }
+
61
+
62 iterator end() const {
+
63 return iterator(data_, key_type{shape_[0], 0}, idx_offset_, shape_, ld_);
+
64 }
+
65
+
66 auto row(size_type row_index) const {
+
67 // return dense_matrix_row_view(data_ + row_index * ld_, row_index,
+
68 // shape()[1]);
+
69 auto row_elements = rng::views::iota(size_type(0), size_type(shape()[1]));
+
70 Iter data = data_ + row_index * ld_;
+
71
+
72 return row_elements | rng::views::transform([=](auto column_index) {
+
73 return reference(key_type(row_index, column_index),
+
74 data[column_index]);
+
75 });
+
76 }
+
77
+
78 auto column(size_type column_index) const {
+
79 // return dense_matrix_column_view(data_ + column_index, column_index,
+
80 // shape()[0], ld_);
+
81 auto column_elements =
+
82 rng::views::iota(size_type(0), size_type(shape()[0]));
+
83 Iter data = data_ + column_index;
+
84 size_type ld = ld_;
+
85
+
86 return column_elements | rng::views::transform([=](auto row_index) {
+
87 return reference(key_type(row_index, column_index),
+
88 data[row_index * ld]);
+
89 });
+
90 }
+
91
+
92 Iter data() const { return data_; }
+
93
+
94 std::size_t rank() const { return rank_; }
+
95
+
96 size_type ld() const { return ld_; }
+
97
+
98 auto local() const {
+
99 auto local_data = __detail::local(data_);
+ +
101 local_data, shape_, idx_offset_, ld(), rank());
+
102 }
+
103
+
104private:
+
105 Iter data_;
+
106 key_type shape_;
+
107 key_type idx_offset_;
+
108 size_type ld_;
+
109 size_type rank_;
+
110};
+
111
+
112template <std::random_access_iterator Iter>
+
113dense_matrix_view(Iter, dr::index<>, std::size_t)
+ +
115
+
116template <std::random_access_iterator Iter>
+ + +
119
+
120template <typename T, typename Allocator>
+ + +
123
+
124} // namespace dr::sp
+
Definition: index.hpp:34
+
Definition: iterator_adaptor.hpp:23
+
Definition: dense_matrix_view.hpp:21
+
Definition: dense_matrix.hpp:19
+
Definition: matrix_entry.hpp:112
+
+ + + + diff --git a/doxygen/dense__row__view_8hpp_source.html b/doxygen/dense__row__view_8hpp_source.html new file mode 100644 index 0000000000..1ca2a39125 --- /dev/null +++ b/doxygen/dense__row__view_8hpp_source.html @@ -0,0 +1,200 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/views/dense_row_view.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dense_row_view.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/detail/index.hpp>
+
8#include <dr/detail/iterator_adaptor.hpp>
+
9#include <dr/sp/containers/matrix_entry.hpp>
+
10#include <iterator>
+
11
+
12namespace dr::sp {
+
13template <typename T, typename Iter> class dense_matrix_row_accessor {
+
14public:
+
15 using size_type = std::size_t;
+
16 using difference_type = std::ptrdiff_t;
+
17
+
18 using scalar_value_type = std::iter_value_t<Iter>;
+
19 using scalar_reference = std::iter_reference_t<Iter>;
+
20
+ +
22
+ +
24
+
25 using iterator_category = std::random_access_iterator_tag;
+
26
+ + + +
30
+
31 using key_type = dr::index<>;
+
32
+
33 constexpr dense_matrix_row_accessor() noexcept = default;
+
34 constexpr ~dense_matrix_row_accessor() noexcept = default;
+ +
36 const dense_matrix_row_accessor &) noexcept = default;
+ +
38 operator=(const dense_matrix_row_accessor &) noexcept = default;
+
39
+
40 constexpr dense_matrix_row_accessor(Iter data, std::size_t i,
+
41 std::size_t j) noexcept
+
42 : data_(data), i_(i), j_(j) {}
+
43
+ +
45 operator+=(difference_type offset) noexcept {
+
46 j_ += offset;
+
47 return *this;
+
48 }
+
49
+
50 constexpr bool operator==(const iterator_accessor &other) const noexcept {
+
51 return j_ == other.j_;
+
52 }
+
53
+
54 constexpr difference_type
+
55 operator-(const iterator_accessor &other) const noexcept {
+
56 return difference_type(j_) - difference_type(other.j_);
+
57 }
+
58
+
59 constexpr bool operator<(const iterator_accessor &other) const noexcept {
+
60 return j_ < other.j_;
+
61 }
+
62
+
63 constexpr reference operator*() const noexcept {
+
64 return reference(key_type({i_, j_}), data_[j_]);
+
65 }
+
66
+
67private:
+
68 size_type i_, j_;
+
69
+
70 Iter data_;
+
71};
+
72
+
73template <typename T, typename Iter>
+ + +
76
+
77template <typename T, typename Iter> class dense_matrix_row_view {
+
78public:
+
79 using size_type = std::size_t;
+
80 using difference_type = std::ptrdiff_t;
+
81
+
82 using scalar_reference = std::iter_reference_t<Iter>;
+
83
+
84 using key_type = dr::index<>;
+
85 using map_type = T;
+
86
+ +
88
+
89 dense_matrix_row_view(Iter data, size_type row_idx, size_type size)
+
90 : data_(data), row_idx_(row_idx), size_(size) {}
+
91
+
92 scalar_reference operator[](size_type idx) { return data_[idx]; }
+
93
+
94 iterator begin() const { return iterator(data_, row_idx_, 0); }
+
95
+
96 iterator end() const { return iterator(data_, row_idx_, size_); }
+
97
+
98 size_type size() const noexcept { return size_; }
+
99
+
100 Iter data_;
+
101 size_type row_idx_;
+
102 size_type size_;
+
103};
+
104
+
105template <std::random_access_iterator Iter>
+
106dense_matrix_row_view(Iter, std::size_t, std::size_t)
+ +
108
+
109} // namespace dr::sp
+
Definition: index.hpp:34
+
Definition: iterator_adaptor.hpp:23
+
Definition: dense_row_view.hpp:13
+
Definition: dense_row_view.hpp:77
+
Definition: matrix_entry.hpp:15
+
Definition: matrix_entry.hpp:112
+
+ + + + diff --git a/doxygen/detail_2enumerate_8hpp_source.html b/doxygen/detail_2enumerate_8hpp_source.html new file mode 100644 index 0000000000..22bedec798 --- /dev/null +++ b/doxygen/detail_2enumerate_8hpp_source.html @@ -0,0 +1,149 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/enumerate.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
enumerate.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/detail/ranges_shim.hpp>
+
8
+
9namespace dr {
+
10
+
11namespace __detail {
+
12
+
13namespace {
+
14
+
15template <rng::range R> struct range_size {
+
16 using type = std::size_t;
+
17};
+
18
+
19template <rng::sized_range R> struct range_size<R> {
+
20 using type = rng::range_size_t<R>;
+
21};
+
22
+
23template <rng::range R> using range_size_t = typename range_size<R>::type;
+
24
+
25} // namespace
+
26
+ +
28public:
+
29 template <rng::viewable_range R> auto operator()(R &&r) const {
+
30 using S = range_size_t<R>;
+
31 // NOTE: This line only necessary due to bug in range-v3 where views
+
32 // have non-weakly-incrementable size types. (Standard mandates
+
33 // size type must be weakly incrementable.)
+
34 using W = std::conditional_t<std::weakly_incrementable<S>, S, std::size_t>;
+
35 if constexpr (rng::sized_range<R>) {
+
36 return rng::views::zip(rng::views::iota(W{0}, W{rng::size(r)}),
+
37 std::forward<R>(r));
+
38 } else {
+
39 return rng::views::zip(rng::views::iota(W{0}), std::forward<R>(r));
+
40 }
+
41 }
+
42
+
43 template <rng::viewable_range R>
+
44 friend auto operator|(R &&r, const enumerate_adapter_closure &closure) {
+
45 return closure(std::forward<R>(r));
+
46 }
+
47};
+
48
+ +
50public:
+
51 template <rng::viewable_range R> constexpr auto operator()(R &&r) const {
+
52 return enumerate_adapter_closure{}(std::forward<R>(r));
+
53 }
+
54
+
55 inline auto enumerate() const { return enumerate_adapter_closure{}; }
+
56};
+
57
+
58inline constexpr auto enumerate = enumerate_fn_{};
+
59
+
60} // namespace __detail
+
61
+
62} // namespace dr
+
Definition: enumerate.hpp:27
+
Definition: enumerate.hpp:49
+
+ + + + diff --git a/doxygen/detail_8hpp_source.html b/doxygen/detail_8hpp_source.html new file mode 100644 index 0000000000..c942aa7dfb --- /dev/null +++ b/doxygen/detail_8hpp_source.html @@ -0,0 +1,176 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/detail.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
detail.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/detail/ranges.hpp>
+
8#include <dr/detail/sycl_utils.hpp>
+
9#include <dr/sp/device_ptr.hpp>
+
10#include <dr/sp/init.hpp>
+
11#include <iterator>
+
12#include <sycl/sycl.hpp>
+
13
+
14namespace dr::sp {
+
15
+
16namespace __detail {
+
17
+
18inline constexpr auto local = dr::ranges::__detail::local;
+
19
+
20template <typename Src, typename Dest>
+
21concept is_syclmemcopyable = std::is_same_v<std::remove_const_t<Src>, Dest> &&
+
22 std::is_trivially_copyable_v<Dest>;
+
23
+
24template <std::contiguous_iterator Iter>
+
25sycl::usm::alloc get_pointer_type(Iter iter) {
+
26 return sycl::get_pointer_type(std::to_address(iter), sp::context());
+
27}
+
28
+
29template <typename T> sycl::usm::alloc get_pointer_type(sp::device_ptr<T> ptr) {
+
30 return sycl::get_pointer_type(ptr.get_raw_pointer(), sp::context());
+
31}
+
32
+
33template <std::contiguous_iterator Iter>
+
34sycl::device get_pointer_device(Iter iter) {
+
35 return sycl::get_pointer_device(std::to_address(iter), sp::context());
+
36}
+
37
+
38template <typename T> sycl::device get_pointer_device(sp::device_ptr<T> ptr) {
+
39 return sycl::get_pointer_device(ptr.get_raw_pointer(), sp::context());
+
40}
+
41
+
42template <typename InputIt> sycl::queue &get_queue_for_pointer(InputIt iter) {
+
43 if (get_pointer_type(iter) == sycl::usm::alloc::device) {
+
44 auto device = get_pointer_device(iter);
+
45 return __detail::queue(device);
+
46 } else {
+
47 return default_queue();
+
48 }
+
49}
+
50
+
51template <typename InputIt, typename OutputIt>
+
52sycl::queue &get_queue_for_pointers(InputIt iter, OutputIt iter2) {
+
53 if (get_pointer_type(iter) == sycl::usm::alloc::device) {
+
54 auto device = get_pointer_device(iter);
+
55 return __detail::queue(device);
+
56 } else if (get_pointer_type(iter2) == sycl::usm::alloc::device) {
+
57 auto device = get_pointer_device(iter2);
+
58 return __detail::queue(device);
+
59 } else {
+
60 return default_queue();
+
61 }
+
62}
+
63
+
64inline sycl::event combine_events(sycl::queue &q,
+
65 const std::vector<sycl::event> &events) {
+
66 auto e = q.submit([&](auto &&h) {
+
67 h.depends_on(events);
+
68 h.host_task([] {});
+
69 });
+
70
+
71 return e;
+
72}
+
73
+
74inline sycl::event combine_events(const std::vector<sycl::event> &events) {
+
75 auto &&q = __detail::queue(0);
+
76 return combine_events(q, events);
+
77}
+
78
+
79inline void wait(sycl::event &event) { event.wait(); }
+
80
+
81inline void wait(sycl::event &&event) { event.wait(); }
+
82
+
83inline void wait(const std::vector<sycl::event> &events) {
+
84 sycl::event::wait(events);
+
85}
+
86
+
87} // namespace __detail
+
88
+
89} // namespace dr::sp
+
Definition: device_ptr.hpp:17
+
Definition: detail.hpp:21
+
+ + + + diff --git a/doxygen/device__ptr_8hpp_source.html b/doxygen/device__ptr_8hpp_source.html new file mode 100644 index 0000000000..02c1eb161c --- /dev/null +++ b/doxygen/device__ptr_8hpp_source.html @@ -0,0 +1,231 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/device_ptr.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
device_ptr.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <type_traits>
+
8
+
9#include <sycl/sycl.hpp>
+
10
+
11#include <dr/sp/device_ref.hpp>
+
12
+
13namespace dr::sp {
+
14
+
15template <typename T>
+
16 requires(std::is_trivially_copyable_v<T> || std::is_void_v<T>)
+ +
18public:
+
19 using value_type = T;
+
20 using difference_type = std::ptrdiff_t;
+
21 using pointer = device_ptr<T>;
+ + +
24 using iterator_category = std::random_access_iterator_tag;
+ +
26
+
27 device_ptr(T *pointer) noexcept : pointer_(pointer) {}
+
28 device_ptr() noexcept = default;
+
29 ~device_ptr() noexcept = default;
+
30 device_ptr(const device_ptr &) noexcept = default;
+
31 device_ptr &operator=(const device_ptr &) noexcept = default;
+
32
+
33 device_ptr(std::nullptr_t) noexcept : pointer_(nullptr) {}
+
34
+
35 device_ptr &operator=(std::nullptr_t) noexcept {
+
36 pointer_ = nullptr;
+
37 return *this;
+
38 }
+
39
+
40 operator device_ptr<void>() const noexcept
+
41 requires(!std::is_void_v<T>)
+
42 {
+
43 return device_ptr<void>(reinterpret_cast<void *>(pointer_));
+
44 }
+
45
+
46 operator device_ptr<const void>() const noexcept
+
47 requires(!std::is_void_v<T>)
+
48 {
+
49 return device_ptr<const void>(reinterpret_cast<const void *>(pointer_));
+
50 }
+
51
+
52 operator const_pointer() const noexcept
+
53 requires(!std::is_const_v<T>)
+
54 {
+
55 return const_pointer(pointer_);
+
56 }
+
57
+
58 bool operator==(std::nullptr_t) const noexcept { return pointer_ == nullptr; }
+
59 bool operator!=(std::nullptr_t) const noexcept { return pointer_ != nullptr; }
+
60
+
61 bool operator==(const device_ptr &) const noexcept = default;
+
62 bool operator!=(const device_ptr &) const noexcept = default;
+
63
+
64 pointer operator+(difference_type offset) const noexcept {
+
65 return pointer(pointer_ + offset);
+
66 }
+
67 pointer operator-(difference_type offset) const noexcept {
+
68 return pointer(pointer_ - offset);
+
69 }
+
70
+
71 difference_type operator-(const_pointer other) const noexcept
+
72 requires(!std::is_const_v<T>)
+
73 {
+
74 return pointer_ - other.pointer_;
+
75 }
+
76 difference_type operator-(pointer other) const noexcept {
+
77 return pointer_ - other.pointer_;
+
78 }
+
79
+
80 bool operator<(const_pointer other) const noexcept {
+
81 return pointer_ < other.pointer_;
+
82 }
+
83 bool operator>(const_pointer other) const noexcept {
+
84 return pointer_ > other.pointer_;
+
85 }
+
86 bool operator<=(const_pointer other) const noexcept {
+
87 return pointer_ <= other.pointer_;
+
88 }
+
89 bool operator>=(const_pointer other) const noexcept {
+
90 return pointer_ >= other.pointer_;
+
91 }
+
92
+
93 pointer &operator++() noexcept {
+
94 ++pointer_;
+
95 return *this;
+
96 }
+
97
+
98 pointer operator++(int) noexcept {
+
99 pointer other = *this;
+
100 ++(*this);
+
101 return other;
+
102 }
+
103
+
104 pointer &operator--() noexcept {
+
105 --pointer_;
+
106 return *this;
+
107 }
+
108
+
109 pointer operator--(int) noexcept {
+
110 pointer other = *this;
+
111 --(*this);
+
112 return other;
+
113 }
+
114
+
115 pointer &operator+=(difference_type offset) noexcept {
+
116 pointer_ += offset;
+
117 return *this;
+
118 }
+
119
+
120 pointer &operator-=(difference_type offset) noexcept {
+
121 pointer_ -= offset;
+
122 return *this;
+
123 }
+
124
+
125 reference operator*() const noexcept { return reference(pointer_); }
+
126
+
127 reference operator[](difference_type offset) const noexcept {
+
128 return reference(*(*this + offset));
+
129 }
+
130
+
131 T *get_raw_pointer() const noexcept { return pointer_; }
+
132
+
133 friend pointer operator+(difference_type n, pointer iter) { return iter + n; }
+
134
+
135 T *local() const noexcept { return pointer_; }
+
136
+
137 friend const_pointer;
+
138 friend nonconst_pointer;
+
139
+
140private:
+
141 T *pointer_;
+
142};
+
143
+
144} // namespace dr::sp
+
Definition: device_ptr.hpp:17
+
Definition: device_ref.hpp:15
+
+ + + + diff --git a/doxygen/device__ref_8hpp_source.html b/doxygen/device__ref_8hpp_source.html new file mode 100644 index 0000000000..1980d94d36 --- /dev/null +++ b/doxygen/device__ref_8hpp_source.html @@ -0,0 +1,146 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/device_ref.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
device_ref.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/sp/init.hpp>
+
8#include <sycl/sycl.hpp>
+
9#include <type_traits>
+
10
+
11namespace dr::sp {
+
12
+
13template <typename T>
+
14 requires(std::is_trivially_copyable_v<T> || std::is_void_v<T>)
+ +
16public:
+
17 device_ref() = delete;
+
18 ~device_ref() = default;
+
19 device_ref(const device_ref &) = default;
+
20
+
21 device_ref(T *pointer) : pointer_(pointer) {}
+
22
+
23 operator T() const {
+
24#ifdef __SYCL_DEVICE_ONLY__
+
25 return *pointer_;
+
26#else
+
27 auto &&q = dr::sp::__detail::default_queue();
+
28 char buffer[sizeof(T)] __attribute__((aligned(sizeof(T))));
+
29 q.memcpy(reinterpret_cast<T *>(buffer), pointer_, sizeof(T)).wait();
+
30 return *reinterpret_cast<T *>(buffer);
+
31#endif
+
32 }
+
33
+
34 device_ref operator=(const T &value) const
+
35 requires(!std::is_const_v<T>)
+
36 {
+
37#ifdef __SYCL_DEVICE_ONLY__
+
38 *pointer_ = value;
+
39#else
+
40 auto &&q = dr::sp::__detail::default_queue();
+
41 q.memcpy(pointer_, &value, sizeof(T)).wait();
+
42#endif
+
43 return *this;
+
44 }
+
45
+
46 device_ref operator=(const device_ref &other) const {
+
47#ifdef __SYCL_DEVICE_ONLY__
+
48 *pointer_ = *other.pointer_;
+
49#else
+
50 T value = other;
+
51 *this = value;
+
52#endif
+
53 return *this;
+
54 }
+
55
+
56private:
+
57 T *pointer_;
+
58};
+
59
+
60} // namespace dr::sp
+
Definition: device_ref.hpp:15
+
+ + + + diff --git a/doxygen/device__span_8hpp_source.html b/doxygen/device__span_8hpp_source.html new file mode 100644 index 0000000000..36d86dffc0 --- /dev/null +++ b/doxygen/device__span_8hpp_source.html @@ -0,0 +1,185 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/device_span.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
device_span.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/concepts/concepts.hpp>
+
8#include <dr/sp/span.hpp>
+
9#include <span>
+
10
+
11namespace dr::sp {
+
12
+
13// A `device_span` is simply a normal `std::span` that's
+
14// been decorated with an extra `rank()` function, showing
+
15// which rank its memory is located on.
+
16// (Thus fulfilling the `remote_range` concept.)
+
17/*
+
18template <class T,
+
19 std::size_t Extent = std::dynamic_extent>
+
20class device_span : public std::span<T, Extent> {
+
21public:
+
22 constexpr device_span() noexcept {}
+
23
+
24 template< class It >
+
25 explicit(Extent != std::dynamic_extent)
+
26 constexpr device_span(It first, std::size_t count, std::size_t rank)
+
27 : rank_(rank), std::span<T, Extent>(first, count) {}
+
28
+
29 template< class It, class End >
+
30 explicit(Extent != std::dynamic_extent)
+
31 constexpr device_span(It first, End last, std::size_t rank)
+
32 : rank_(rank), std::span<T, Extent>(first, last) {}
+
33
+
34 constexpr std::size_t rank() const noexcept {
+
35 return rank_;
+
36 }
+
37
+
38private:
+
39 std::size_t rank_;
+
40};
+
41*/
+
42
+
43template <typename T, typename Iter = T *>
+
44class device_span : public dr::sp::span<T, Iter> {
+
45public:
+
46 constexpr device_span() noexcept {}
+
47
+
48 using value_type = T;
+
49 using size_type = std::size_t;
+
50 using difference_type = std::size_t;
+
51 using reference = std::iter_reference_t<Iter>;
+
52
+
53 template <rng::random_access_range R>
+
54 requires(dr::remote_range<R>)
+
55 device_span(R &&r)
+
56 : dr::sp::span<T, Iter>(rng::begin(r), rng::size(r)),
+
57 rank_(dr::ranges::rank(r)) {}
+
58
+
59 template <rng::random_access_range R>
+
60 device_span(R &&r, std::size_t rank)
+
61 : dr::sp::span<T, Iter>(rng::begin(r), rng::size(r)), rank_(rank) {}
+
62
+
63 template <class It>
+
64 constexpr device_span(It first, std::size_t count, std::size_t rank)
+
65 : dr::sp::span<T, Iter>(first, count), rank_(rank) {}
+
66
+
67 template <class It, class End>
+
68 constexpr device_span(It first, End last, std::size_t rank)
+
69 : dr::sp::span<T, Iter>(first, last), rank_(rank) {}
+
70
+
71 constexpr std::size_t rank() const noexcept { return rank_; }
+
72
+
73 device_span first(std::size_t n) const {
+
74 return device_span(this->begin(), this->begin() + n, rank_);
+
75 }
+
76
+
77 device_span last(std::size_t n) const {
+
78 return device_span(this->end() - n, this->end(), rank_);
+
79 }
+
80
+
81 device_span subspan(std::size_t offset, std::size_t count) const {
+
82 return device_span(this->begin() + offset, this->begin() + offset + count,
+
83 rank_);
+
84 }
+
85
+
86private:
+
87 std::size_t rank_;
+
88};
+
89
+
90template <rng::random_access_range R>
+
91device_span(R &&) -> device_span<rng::range_value_t<R>, rng::iterator_t<R>>;
+
92
+
93template <rng::random_access_range R>
+
94device_span(R &&, std::size_t)
+
95 -> device_span<rng::range_value_t<R>, rng::iterator_t<R>>;
+
96
+
97} // namespace dr::sp
+
Definition: device_span.hpp:44
+
Definition: span.hpp:14
+
Definition: concepts.hpp:16
+
+ + + + diff --git a/doxygen/device__vector_8hpp_source.html b/doxygen/device__vector_8hpp_source.html new file mode 100644 index 0000000000..a1d1b8c7f5 --- /dev/null +++ b/doxygen/device__vector_8hpp_source.html @@ -0,0 +1,124 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/device_vector.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
device_vector.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/sp/allocators.hpp>
+
8#include <dr/sp/vector.hpp>
+
9
+
10namespace dr::sp {
+
11
+
12template <typename T, typename Allocator>
+
13class device_vector : public dr::sp::vector<T, Allocator> {
+
14public:
+
15 constexpr device_vector() noexcept {}
+
16
+ +
18
+
19 using value_type = T;
+
20 using size_type = std::size_t;
+
21 using difference_type = std::size_t;
+
22
+
23 constexpr device_vector(size_type count, const Allocator &alloc,
+
24 size_type rank)
+
25 : base(count, alloc), rank_(rank) {}
+
26
+
27 constexpr std::size_t rank() const noexcept { return rank_; }
+
28
+
29private:
+
30 std::size_t rank_ = 0;
+
31};
+
32
+
33template <class Alloc>
+
34device_vector(std::size_t, const Alloc, std::size_t)
+ +
36
+
37} // namespace dr::sp
+
Definition: device_vector.hpp:13
+
Definition: vector.hpp:14
+
+ + + + diff --git a/doxygen/dir_323acea4eb551240b18003d2e88b28b7.html b/doxygen/dir_323acea4eb551240b18003d2e88b28b7.html new file mode 100644 index 0000000000..afffce1b99 --- /dev/null +++ b/doxygen/dir_323acea4eb551240b18003d2e88b28b7.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/views Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
views Directory Reference
+
+
+
+Directory dependency graph for views:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/views
+ + + + +
+ + + + + + + + +

+Files

file  iota.hpp [code]
 
file  transform.hpp [code]
 
file  views.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_323acea4eb551240b18003d2e88b28b7_dep.map b/doxygen/dir_323acea4eb551240b18003d2e88b28b7_dep.map new file mode 100644 index 0000000000..8b476ba17a --- /dev/null +++ b/doxygen/dir_323acea4eb551240b18003d2e88b28b7_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_323acea4eb551240b18003d2e88b28b7_dep.md5 b/doxygen/dir_323acea4eb551240b18003d2e88b28b7_dep.md5 new file mode 100644 index 0000000000..75d551edb1 --- /dev/null +++ b/doxygen/dir_323acea4eb551240b18003d2e88b28b7_dep.md5 @@ -0,0 +1 @@ +50763f347614f3c0d87ff0069e0d3ad5 \ No newline at end of file diff --git a/doxygen/dir_323acea4eb551240b18003d2e88b28b7_dep.png b/doxygen/dir_323acea4eb551240b18003d2e88b28b7_dep.png new file mode 100644 index 0000000000..8c503fde4e Binary files /dev/null and b/doxygen/dir_323acea4eb551240b18003d2e88b28b7_dep.png differ diff --git a/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f.html b/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f.html new file mode 100644 index 0000000000..51ef300946 --- /dev/null +++ b/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f.html @@ -0,0 +1,101 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/vendor Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
vendor Directory Reference
+
+
+
+Directory dependency graph for vendor:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/vendor
+ + + + + +
+ + + + +

+Directories

directory  source_location
 
+
+ + + + diff --git a/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f_dep.map b/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f_dep.map new file mode 100644 index 0000000000..be2c8c6913 --- /dev/null +++ b/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f_dep.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f_dep.md5 b/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f_dep.md5 new file mode 100644 index 0000000000..7684441e9f --- /dev/null +++ b/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f_dep.md5 @@ -0,0 +1 @@ +c3c586f85eda8097b6c88278176d8c36 \ No newline at end of file diff --git a/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f_dep.png b/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f_dep.png new file mode 100644 index 0000000000..796f71a51c Binary files /dev/null and b/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f_dep.png differ diff --git a/doxygen/dir_4c0da47f5488ee935cb4372f760579e2.html b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2.html new file mode 100644 index 0000000000..fb96d94dd6 --- /dev/null +++ b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2.html @@ -0,0 +1,120 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr Directory Reference
+
+
+
+Directory dependency graph for dr:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr
+ + + + + + + + + +
+ + + + + + + + + + + + +

+Directories

directory  concepts
 
directory  detail
 
directory  mp
 
directory  sp
 
directory  views
 
+ + + + + +

+Files

file  mp.hpp [code]
 
file  sp.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.map b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.map new file mode 100644 index 0000000000..5dd769d5be --- /dev/null +++ b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.md5 b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.md5 new file mode 100644 index 0000000000..a3b83fdbf0 --- /dev/null +++ b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.md5 @@ -0,0 +1 @@ +718c391d081d0360f300a7fa27c0653e \ No newline at end of file diff --git a/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.png b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.png new file mode 100644 index 0000000000..d56f78b276 Binary files /dev/null and b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.png differ diff --git a/doxygen/dir_67824480cd2296306bea79e091fd0853.html b/doxygen/dir_67824480cd2296306bea79e091fd0853.html new file mode 100644 index 0000000000..2e0c926c0b --- /dev/null +++ b/doxygen/dir_67824480cd2296306bea79e091fd0853.html @@ -0,0 +1,128 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
algorithms Directory Reference
+
+
+
+Directory dependency graph for algorithms:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms
+ + + + + +
+ + + + +

+Directories

directory  matrix
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  algorithms.hpp [code]
 
file  copy.hpp [code]
 
file  equal.hpp [code]
 
file  exclusive_scan.hpp [code]
 
file  execution_policy.hpp [code]
 
file  fill.hpp [code]
 
file  for_each.hpp [code]
 
file  inclusive_scan.hpp [code]
 
file  iota.hpp [code]
 
file  reduce.hpp [code]
 
file  sort.hpp [code]
 
file  transform.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_67824480cd2296306bea79e091fd0853_dep.map b/doxygen/dir_67824480cd2296306bea79e091fd0853_dep.map new file mode 100644 index 0000000000..a37c70549d --- /dev/null +++ b/doxygen/dir_67824480cd2296306bea79e091fd0853_dep.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/dir_67824480cd2296306bea79e091fd0853_dep.md5 b/doxygen/dir_67824480cd2296306bea79e091fd0853_dep.md5 new file mode 100644 index 0000000000..e85fcf5175 --- /dev/null +++ b/doxygen/dir_67824480cd2296306bea79e091fd0853_dep.md5 @@ -0,0 +1 @@ +4ebe4402274498ed5025a34da2df361a \ No newline at end of file diff --git a/doxygen/dir_67824480cd2296306bea79e091fd0853_dep.png b/doxygen/dir_67824480cd2296306bea79e091fd0853_dep.png new file mode 100644 index 0000000000..d8e966b9cb Binary files /dev/null and b/doxygen/dir_67824480cd2296306bea79e091fd0853_dep.png differ diff --git a/doxygen/dir_73601acfd5a2822dd473820b789b56e4.html b/doxygen/dir_73601acfd5a2822dd473820b789b56e4.html new file mode 100644 index 0000000000..fccd21b124 --- /dev/null +++ b/doxygen/dir_73601acfd5a2822dd473820b789b56e4.html @@ -0,0 +1,142 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
detail Directory Reference
+
+
+
+Directory dependency graph for detail:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  communicator.hpp [code]
 
file  enumerate.hpp [code]
 
file  format_shim.hpp [code]
 
file  index.hpp [code]
 
file  iterator_adaptor.hpp [code]
 
file  logger.hpp [code]
 
file  mdarray_shim.hpp [code]
 
file  mdspan_shim.hpp [code]
 
file  mdspan_utils.hpp [code]
 
file  memory.hpp [code]
 
file  normal_distributed_iterator.hpp [code]
 
file  onedpl_direct_iterator.hpp [code]
 
file  owning_view.hpp [code]
 
file  ranges.hpp [code]
 
file  ranges_shim.hpp [code]
 
file  ranges_utils.hpp [code]
 
file  remote_subrange.hpp [code]
 
file  segments_tools.hpp [code]
 
file  sycl_utils.hpp [code]
 
file  tuple_utils.hpp [code]
 
file  utils.hpp [code]
 
file  view_detectors.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_73601acfd5a2822dd473820b789b56e4_dep.map b/doxygen/dir_73601acfd5a2822dd473820b789b56e4_dep.map new file mode 100644 index 0000000000..4bd1d26b75 --- /dev/null +++ b/doxygen/dir_73601acfd5a2822dd473820b789b56e4_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_73601acfd5a2822dd473820b789b56e4_dep.md5 b/doxygen/dir_73601acfd5a2822dd473820b789b56e4_dep.md5 new file mode 100644 index 0000000000..18da7fe4ec --- /dev/null +++ b/doxygen/dir_73601acfd5a2822dd473820b789b56e4_dep.md5 @@ -0,0 +1 @@ +2ceba209da8dc3e514d57db855e9b6d3 \ No newline at end of file diff --git a/doxygen/dir_73601acfd5a2822dd473820b789b56e4_dep.png b/doxygen/dir_73601acfd5a2822dd473820b789b56e4_dep.png new file mode 100644 index 0000000000..52829297f8 Binary files /dev/null and b/doxygen/dir_73601acfd5a2822dd473820b789b56e4_dep.png differ diff --git a/doxygen/dir_807b56d834975cdfd9fb3d45ae6a652f.html b/doxygen/dir_807b56d834975cdfd9fb3d45ae6a652f.html new file mode 100644 index 0000000000..9f5b67893d --- /dev/null +++ b/doxygen/dir_807b56d834975cdfd9fb3d45ae6a652f.html @@ -0,0 +1,108 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/matrix Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
matrix Directory Reference
+
+
+
+Directory dependency graph for matrix:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/matrix
+ + + + +
+ + + + + + + + + + + + +

+Files

file  gemm.hpp [code]
 
file  gemv.hpp [code]
 
file  local_gemm.hpp [code]
 
file  local_gemv.hpp [code]
 
file  matrix_algorithms.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_807b56d834975cdfd9fb3d45ae6a652f_dep.map b/doxygen/dir_807b56d834975cdfd9fb3d45ae6a652f_dep.map new file mode 100644 index 0000000000..155c5e975a --- /dev/null +++ b/doxygen/dir_807b56d834975cdfd9fb3d45ae6a652f_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_807b56d834975cdfd9fb3d45ae6a652f_dep.md5 b/doxygen/dir_807b56d834975cdfd9fb3d45ae6a652f_dep.md5 new file mode 100644 index 0000000000..c75931b0f9 --- /dev/null +++ b/doxygen/dir_807b56d834975cdfd9fb3d45ae6a652f_dep.md5 @@ -0,0 +1 @@ +39bafce4407bead712fb1663f8ab6029 \ No newline at end of file diff --git a/doxygen/dir_807b56d834975cdfd9fb3d45ae6a652f_dep.png b/doxygen/dir_807b56d834975cdfd9fb3d45ae6a652f_dep.png new file mode 100644 index 0000000000..1b4c04da25 Binary files /dev/null and b/doxygen/dir_807b56d834975cdfd9fb3d45ae6a652f_dep.png differ diff --git a/doxygen/dir_85ef099189e791ae40d4c24671336591.html b/doxygen/dir_85ef099189e791ae40d4c24671336591.html new file mode 100644 index 0000000000..2ed70bc7f9 --- /dev/null +++ b/doxygen/dir_85ef099189e791ae40d4c24671336591.html @@ -0,0 +1,122 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
mp Directory Reference
+
+
+
+Directory dependency graph for mp:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp
+ + + + + + + +
+ + + + + + + + +

+Directories

directory  algorithms
 
directory  containers
 
directory  views
 
+ + + + + + + + + + + + + +

+Files

file  alignment.hpp [code]
 
file  allocator.hpp [code]
 
file  common_support.hpp [code]
 
file  global.hpp [code]
 
file  halo.hpp [code]
 
file  sycl_support.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_85ef099189e791ae40d4c24671336591_dep.map b/doxygen/dir_85ef099189e791ae40d4c24671336591_dep.map new file mode 100644 index 0000000000..da4be2d42e --- /dev/null +++ b/doxygen/dir_85ef099189e791ae40d4c24671336591_dep.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/doxygen/dir_85ef099189e791ae40d4c24671336591_dep.md5 b/doxygen/dir_85ef099189e791ae40d4c24671336591_dep.md5 new file mode 100644 index 0000000000..b673125850 --- /dev/null +++ b/doxygen/dir_85ef099189e791ae40d4c24671336591_dep.md5 @@ -0,0 +1 @@ +012f4c9f89b317749bd776dd14c794a6 \ No newline at end of file diff --git a/doxygen/dir_85ef099189e791ae40d4c24671336591_dep.png b/doxygen/dir_85ef099189e791ae40d4c24671336591_dep.png new file mode 100644 index 0000000000..2f5c737d2a Binary files /dev/null and b/doxygen/dir_85ef099189e791ae40d4c24671336591_dep.png differ diff --git a/doxygen/dir_8fe29de6e48ccf860dd86ed0735e8a6b.html b/doxygen/dir_8fe29de6e48ccf860dd86ed0735e8a6b.html new file mode 100644 index 0000000000..a27c92099a --- /dev/null +++ b/doxygen/dir_8fe29de6e48ccf860dd86ed0735e8a6b.html @@ -0,0 +1,108 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/containers Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
containers Directory Reference
+
+
+
+Directory dependency graph for containers:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/containers
+ + + + +
+ + + + + + + + + + + + +

+Files

file  distributed_mdarray.hpp [code]
 
file  distributed_vector.hpp [code]
 
file  distribution.hpp [code]
 
file  segment.hpp [code]
 
file  subrange.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_8fe29de6e48ccf860dd86ed0735e8a6b_dep.map b/doxygen/dir_8fe29de6e48ccf860dd86ed0735e8a6b_dep.map new file mode 100644 index 0000000000..c021f05fdc --- /dev/null +++ b/doxygen/dir_8fe29de6e48ccf860dd86ed0735e8a6b_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_8fe29de6e48ccf860dd86ed0735e8a6b_dep.md5 b/doxygen/dir_8fe29de6e48ccf860dd86ed0735e8a6b_dep.md5 new file mode 100644 index 0000000000..cdbb3551b3 --- /dev/null +++ b/doxygen/dir_8fe29de6e48ccf860dd86ed0735e8a6b_dep.md5 @@ -0,0 +1 @@ +79a6d814016b2a8fd318b8ba5c9c0923 \ No newline at end of file diff --git a/doxygen/dir_8fe29de6e48ccf860dd86ed0735e8a6b_dep.png b/doxygen/dir_8fe29de6e48ccf860dd86ed0735e8a6b_dep.png new file mode 100644 index 0000000000..a125cded13 Binary files /dev/null and b/doxygen/dir_8fe29de6e48ccf860dd86ed0735e8a6b_dep.png differ diff --git a/doxygen/dir_93ccc0855ae179af1c425ecfb8e8a806.html b/doxygen/dir_93ccc0855ae179af1c425ecfb8e8a806.html new file mode 100644 index 0000000000..40bfa21767 --- /dev/null +++ b/doxygen/dir_93ccc0855ae179af1c425ecfb8e8a806.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/util Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
util Directory Reference
+
+
+
+Directory dependency graph for util:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/util
+ + + + +
+ + + + + + + + +

+Files

file  coo_matrix.hpp [code]
 
file  generate_random.hpp [code]
 
file  matrix_io.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_93ccc0855ae179af1c425ecfb8e8a806_dep.map b/doxygen/dir_93ccc0855ae179af1c425ecfb8e8a806_dep.map new file mode 100644 index 0000000000..0e87f5f980 --- /dev/null +++ b/doxygen/dir_93ccc0855ae179af1c425ecfb8e8a806_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_93ccc0855ae179af1c425ecfb8e8a806_dep.md5 b/doxygen/dir_93ccc0855ae179af1c425ecfb8e8a806_dep.md5 new file mode 100644 index 0000000000..13ca63892e --- /dev/null +++ b/doxygen/dir_93ccc0855ae179af1c425ecfb8e8a806_dep.md5 @@ -0,0 +1 @@ +81fab989c8c54d73170939f34da7aa38 \ No newline at end of file diff --git a/doxygen/dir_93ccc0855ae179af1c425ecfb8e8a806_dep.png b/doxygen/dir_93ccc0855ae179af1c425ecfb8e8a806_dep.png new file mode 100644 index 0000000000..606a4b7887 Binary files /dev/null and b/doxygen/dir_93ccc0855ae179af1c425ecfb8e8a806_dep.png differ diff --git a/doxygen/dir_99158c7dd822eb1a3c9b7f71ffee20be.html b/doxygen/dir_99158c7dd822eb1a3c9b7f71ffee20be.html new file mode 100644 index 0000000000..6cf74eff56 --- /dev/null +++ b/doxygen/dir_99158c7dd822eb1a3c9b7f71ffee20be.html @@ -0,0 +1,112 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
views Directory Reference
+
+
+
+Directory dependency graph for views:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views
+ + + + +
+ + + + + + + + + + + + + + + + +

+Files

file  enumerate.hpp [code]
 
file  mdspan_view.hpp [code]
 
file  segmented.hpp [code]
 
file  sliding.hpp [code]
 
file  submdspan_view.hpp [code]
 
file  views.hpp [code]
 
file  zip.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_99158c7dd822eb1a3c9b7f71ffee20be_dep.map b/doxygen/dir_99158c7dd822eb1a3c9b7f71ffee20be_dep.map new file mode 100644 index 0000000000..d439af1b00 --- /dev/null +++ b/doxygen/dir_99158c7dd822eb1a3c9b7f71ffee20be_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_99158c7dd822eb1a3c9b7f71ffee20be_dep.md5 b/doxygen/dir_99158c7dd822eb1a3c9b7f71ffee20be_dep.md5 new file mode 100644 index 0000000000..0c2fea8be6 --- /dev/null +++ b/doxygen/dir_99158c7dd822eb1a3c9b7f71ffee20be_dep.md5 @@ -0,0 +1 @@ +898144a2124b4a914b1c69c711a83d97 \ No newline at end of file diff --git a/doxygen/dir_99158c7dd822eb1a3c9b7f71ffee20be_dep.png b/doxygen/dir_99158c7dd822eb1a3c9b7f71ffee20be_dep.png new file mode 100644 index 0000000000..4b6ed5260b Binary files /dev/null and b/doxygen/dir_99158c7dd822eb1a3c9b7f71ffee20be_dep.png differ diff --git a/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108.html b/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108.html new file mode 100644 index 0000000000..9f4d554420 --- /dev/null +++ b/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108.html @@ -0,0 +1,100 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/vendor/source_location Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
source_location Directory Reference
+
+
+
+Directory dependency graph for source_location:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/vendor/source_location
+ + + + +
+ + + + +

+Files

file  source_location.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108_dep.map b/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108_dep.map new file mode 100644 index 0000000000..771f343e44 --- /dev/null +++ b/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108_dep.md5 b/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108_dep.md5 new file mode 100644 index 0000000000..a9cedfe195 --- /dev/null +++ b/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108_dep.md5 @@ -0,0 +1 @@ +40c4bd592a0462b6364399762012246b \ No newline at end of file diff --git a/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108_dep.png b/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108_dep.png new file mode 100644 index 0000000000..1335793499 Binary files /dev/null and b/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108_dep.png differ diff --git a/doxygen/dir_b5fcc441902e4a79b0db31964533269a.html b/doxygen/dir_b5fcc441902e4a79b0db31964533269a.html new file mode 100644 index 0000000000..bd4384f6f0 --- /dev/null +++ b/doxygen/dir_b5fcc441902e4a79b0db31964533269a.html @@ -0,0 +1,126 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
algorithms Directory Reference
+
+
+
+Directory dependency graph for algorithms:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  copy.hpp [code]
 
file  count.hpp [code]
 
file  equal.hpp [code]
 
file  exclusive_scan.hpp [code]
 
file  fill.hpp [code]
 
file  for_each.hpp [code]
 
file  inclusive_exclusive_scan_impl.hpp [code]
 
file  inclusive_scan.hpp [code]
 
file  iota.hpp [code]
 
file  md_for_each.hpp [code]
 
file  reduce.hpp [code]
 
file  sort.hpp [code]
 
file  transform.hpp [code]
 
file  transpose.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_b5fcc441902e4a79b0db31964533269a_dep.map b/doxygen/dir_b5fcc441902e4a79b0db31964533269a_dep.map new file mode 100644 index 0000000000..138c006c71 --- /dev/null +++ b/doxygen/dir_b5fcc441902e4a79b0db31964533269a_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_b5fcc441902e4a79b0db31964533269a_dep.md5 b/doxygen/dir_b5fcc441902e4a79b0db31964533269a_dep.md5 new file mode 100644 index 0000000000..f434ab1315 --- /dev/null +++ b/doxygen/dir_b5fcc441902e4a79b0db31964533269a_dep.md5 @@ -0,0 +1 @@ +2f49817f9043bab8eda0f3457b0286a7 \ No newline at end of file diff --git a/doxygen/dir_b5fcc441902e4a79b0db31964533269a_dep.png b/doxygen/dir_b5fcc441902e4a79b0db31964533269a_dep.png new file mode 100644 index 0000000000..53c7f48ed9 Binary files /dev/null and b/doxygen/dir_b5fcc441902e4a79b0db31964533269a_dep.png differ diff --git a/doxygen/dir_cdec69c82820bd8c004958f42c86ecba.html b/doxygen/dir_cdec69c82820bd8c004958f42c86ecba.html new file mode 100644 index 0000000000..0cac3e55d1 --- /dev/null +++ b/doxygen/dir_cdec69c82820bd8c004958f42c86ecba.html @@ -0,0 +1,114 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/views Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
views Directory Reference
+
+
+
+Directory dependency graph for views:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/views
+ + + + +
+ + + + + + + + + + + + + + + + + + +

+Files

file  csr_matrix_view.hpp [code]
 
file  dense_column_view.hpp [code]
 
file  dense_matrix_iterator.hpp [code]
 
file  dense_matrix_view.hpp [code]
 
file  dense_row_view.hpp [code]
 
file  enumerate.hpp [code]
 
file  standard_views.hpp [code]
 
file  views.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_cdec69c82820bd8c004958f42c86ecba_dep.map b/doxygen/dir_cdec69c82820bd8c004958f42c86ecba_dep.map new file mode 100644 index 0000000000..24ac837bde --- /dev/null +++ b/doxygen/dir_cdec69c82820bd8c004958f42c86ecba_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_cdec69c82820bd8c004958f42c86ecba_dep.md5 b/doxygen/dir_cdec69c82820bd8c004958f42c86ecba_dep.md5 new file mode 100644 index 0000000000..c25e641c79 --- /dev/null +++ b/doxygen/dir_cdec69c82820bd8c004958f42c86ecba_dep.md5 @@ -0,0 +1 @@ +50de447871315c6b97543925bbba9324 \ No newline at end of file diff --git a/doxygen/dir_cdec69c82820bd8c004958f42c86ecba_dep.png b/doxygen/dir_cdec69c82820bd8c004958f42c86ecba_dep.png new file mode 100644 index 0000000000..235fddd867 Binary files /dev/null and b/doxygen/dir_cdec69c82820bd8c004958f42c86ecba_dep.png differ diff --git a/doxygen/dir_d05a7e68d09c14ebc0e6d03c0cf9ec09.html b/doxygen/dir_d05a7e68d09c14ebc0e6d03c0cf9ec09.html new file mode 100644 index 0000000000..d99565b9d0 --- /dev/null +++ b/doxygen/dir_d05a7e68d09c14ebc0e6d03c0cf9ec09.html @@ -0,0 +1,100 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/sequential Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
sequential Directory Reference
+
+
+
+Directory dependency graph for sequential:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/sequential
+ + + + +
+ + + + +

+Files

file  dense_matrix.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_d05a7e68d09c14ebc0e6d03c0cf9ec09_dep.map b/doxygen/dir_d05a7e68d09c14ebc0e6d03c0cf9ec09_dep.map new file mode 100644 index 0000000000..bc65b15e75 --- /dev/null +++ b/doxygen/dir_d05a7e68d09c14ebc0e6d03c0cf9ec09_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_d05a7e68d09c14ebc0e6d03c0cf9ec09_dep.md5 b/doxygen/dir_d05a7e68d09c14ebc0e6d03c0cf9ec09_dep.md5 new file mode 100644 index 0000000000..3fcf5ed205 --- /dev/null +++ b/doxygen/dir_d05a7e68d09c14ebc0e6d03c0cf9ec09_dep.md5 @@ -0,0 +1 @@ +d128cf281f07f1d1b0c0d071f9e69dd0 \ No newline at end of file diff --git a/doxygen/dir_d05a7e68d09c14ebc0e6d03c0cf9ec09_dep.png b/doxygen/dir_d05a7e68d09c14ebc0e6d03c0cf9ec09_dep.png new file mode 100644 index 0000000000..ed275aa79d Binary files /dev/null and b/doxygen/dir_d05a7e68d09c14ebc0e6d03c0cf9ec09_dep.png differ diff --git a/doxygen/dir_d44c64559bbebec7f509842c48db8b23.html b/doxygen/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 0000000000..656c0efefc --- /dev/null +++ b/doxygen/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
include Directory Reference
+
+
+ + + + +

+Directories

directory  dr
 
+
+ + + + diff --git a/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e.html b/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e.html new file mode 100644 index 0000000000..7050fe83ca --- /dev/null +++ b/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e.html @@ -0,0 +1,100 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/concepts Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
concepts Directory Reference
+
+
+
+Directory dependency graph for concepts:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/concepts
+ + + + +
+ + + + +

+Files

file  concepts.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e_dep.map b/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e_dep.map new file mode 100644 index 0000000000..b18eb879cc --- /dev/null +++ b/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e_dep.md5 b/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e_dep.md5 new file mode 100644 index 0000000000..a111bc261c --- /dev/null +++ b/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e_dep.md5 @@ -0,0 +1 @@ +686b09cdacdba75d2971014aeb1bef38 \ No newline at end of file diff --git a/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e_dep.png b/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e_dep.png new file mode 100644 index 0000000000..5709858814 Binary files /dev/null and b/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e_dep.png differ diff --git a/doxygen/dir_d7eb10406d49beed6cff678e21fddf87.html b/doxygen/dir_d7eb10406d49beed6cff678e21fddf87.html new file mode 100644 index 0000000000..fba042a703 --- /dev/null +++ b/doxygen/dir_d7eb10406d49beed6cff678e21fddf87.html @@ -0,0 +1,145 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
sp Directory Reference
+
+
+
+Directory dependency graph for sp:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp
+ + + + + + + + +
+ + + + + + + + + + +

+Directories

directory  algorithms
 
directory  containers
 
directory  util
 
directory  views
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  allocators.hpp [code]
 
file  detail.hpp [code]
 
file  device_ptr.hpp [code]
 
file  device_ref.hpp [code]
 
file  device_span.hpp [code]
 
file  device_vector.hpp [code]
 
file  distributed_span.hpp [code]
 
file  distributed_vector.hpp [code]
 
file  future.hpp [code]
 
file  init.hpp [code]
 
file  range.hpp [code]
 
file  range_adaptors.hpp [code]
 
file  span.hpp [code]
 
file  util.hpp [code]
 
file  vector.hpp [code]
 
file  zip_view.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_d7eb10406d49beed6cff678e21fddf87_dep.map b/doxygen/dir_d7eb10406d49beed6cff678e21fddf87_dep.map new file mode 100644 index 0000000000..ab8db9f4f4 --- /dev/null +++ b/doxygen/dir_d7eb10406d49beed6cff678e21fddf87_dep.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doxygen/dir_d7eb10406d49beed6cff678e21fddf87_dep.md5 b/doxygen/dir_d7eb10406d49beed6cff678e21fddf87_dep.md5 new file mode 100644 index 0000000000..1ba8d07b25 --- /dev/null +++ b/doxygen/dir_d7eb10406d49beed6cff678e21fddf87_dep.md5 @@ -0,0 +1 @@ +5ed311d2582ff8fdd3b7b5a223e89bfd \ No newline at end of file diff --git a/doxygen/dir_d7eb10406d49beed6cff678e21fddf87_dep.png b/doxygen/dir_d7eb10406d49beed6cff678e21fddf87_dep.png new file mode 100644 index 0000000000..973e221fdd Binary files /dev/null and b/doxygen/dir_d7eb10406d49beed6cff678e21fddf87_dep.png differ diff --git a/doxygen/dir_fe6a317965919c4163a6bbac6fc7f579.html b/doxygen/dir_fe6a317965919c4163a6bbac6fc7f579.html new file mode 100644 index 0000000000..ae17f1ef44 --- /dev/null +++ b/doxygen/dir_fe6a317965919c4163a6bbac6fc7f579.html @@ -0,0 +1,116 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
containers Directory Reference
+
+
+
+Directory dependency graph for containers:
+
+
/opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers
+ + + + + +
+ + + + +

+Directories

directory  sequential
 
+ + + + + + + + + + + + + +

+Files

file  detail.hpp [code]
 
file  distributed_dense_matrix.hpp [code]
 
file  duplicated_vector.hpp [code]
 
file  matrix_entry.hpp [code]
 
file  matrix_partition.hpp [code]
 
file  sparse_matrix.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_fe6a317965919c4163a6bbac6fc7f579_dep.map b/doxygen/dir_fe6a317965919c4163a6bbac6fc7f579_dep.map new file mode 100644 index 0000000000..91b3a8ce0c --- /dev/null +++ b/doxygen/dir_fe6a317965919c4163a6bbac6fc7f579_dep.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/dir_fe6a317965919c4163a6bbac6fc7f579_dep.md5 b/doxygen/dir_fe6a317965919c4163a6bbac6fc7f579_dep.md5 new file mode 100644 index 0000000000..d8d10e63b8 --- /dev/null +++ b/doxygen/dir_fe6a317965919c4163a6bbac6fc7f579_dep.md5 @@ -0,0 +1 @@ +fc0e6b9eb7a91526a26d40bb4c0c89f8 \ No newline at end of file diff --git a/doxygen/dir_fe6a317965919c4163a6bbac6fc7f579_dep.png b/doxygen/dir_fe6a317965919c4163a6bbac6fc7f579_dep.png new file mode 100644 index 0000000000..defd83b058 Binary files /dev/null and b/doxygen/dir_fe6a317965919c4163a6bbac6fc7f579_dep.png differ diff --git a/doxygen/distributed__dense__matrix_8hpp_source.html b/doxygen/distributed__dense__matrix_8hpp_source.html new file mode 100644 index 0000000000..0c6688fc8e --- /dev/null +++ b/doxygen/distributed__dense__matrix_8hpp_source.html @@ -0,0 +1,433 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/distributed_dense_matrix.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
distributed_dense_matrix.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <memory>
+
8
+
9#include <dr/detail/index.hpp>
+
10#include <dr/detail/owning_view.hpp>
+
11#include <dr/sp/containers/matrix_entry.hpp>
+
12#include <dr/sp/containers/matrix_partition.hpp>
+
13#include <dr/sp/containers/sequential/dense_matrix.hpp>
+
14#include <dr/sp/device_vector.hpp>
+
15#include <dr/sp/future.hpp>
+
16#include <dr/sp/views/dense_matrix_view.hpp>
+
17
+
18namespace dr::sp {
+
19
+
20template <typename T, typename L> class distributed_dense_matrix_accessor {
+
21public:
+
22 using size_type = std::size_t;
+
23 using difference_type = std::ptrdiff_t;
+
24
+
25 using scalar_value_type = rng::range_value_t<L>;
+
26 using scalar_reference = rng::range_reference_t<L>;
+
27
+ +
29
+ +
31
+
32 using iterator_category = std::random_access_iterator_tag;
+
33
+ + + +
37
+
38 using tile_type = L;
+
39
+
40 using key_type = dr::index<>;
+
41
+
42 constexpr distributed_dense_matrix_accessor() noexcept = default;
+
43 constexpr ~distributed_dense_matrix_accessor() noexcept = default;
+ +
45 const distributed_dense_matrix_accessor &) noexcept = default;
+ +
47 operator=(const distributed_dense_matrix_accessor &) noexcept = default;
+
48
+ +
50 std::span<tile_type> tiles, key_type grid_idx, key_type tile_idx,
+
51 key_type grid_shape, key_type tile_shape, key_type matrix_shape) noexcept
+
52 : grid_idx_(grid_idx), tile_idx_(tile_idx), grid_shape_(grid_shape),
+
53 tile_shape_(tile_shape), matrix_shape_(matrix_shape), tiles_(tiles) {}
+
54
+ +
56 operator+=(difference_type offset) noexcept {
+
57 std::size_t new_global_idx_ = get_global_idx_() + offset;
+
58 key_type new_global_idx = {new_global_idx_ / matrix_shape_[1],
+
59 new_global_idx_ % matrix_shape_[1]};
+
60 key_type new_grid_idx = {new_global_idx[0] / tile_shape_[0],
+
61 new_global_idx[1] / tile_shape_[1]};
+
62
+
63 key_type new_tile_idx = {new_global_idx[0] % tile_shape_[0],
+
64 new_global_idx[1] % tile_shape_[1]};
+
65
+
66 grid_idx_ = new_grid_idx;
+
67 tile_idx_ = new_tile_idx;
+
68 return *this;
+
69 }
+
70
+
71 constexpr bool operator==(const iterator_accessor &other) const noexcept {
+
72 return grid_idx_ == other.grid_idx_ && tile_idx_ == other.tile_idx_;
+
73 }
+
74
+
75 constexpr difference_type
+
76 operator-(const iterator_accessor &other) const noexcept {
+
77 return difference_type(get_global_idx_()) - other.get_global_idx_();
+
78 }
+
79
+
80 constexpr bool operator<(const iterator_accessor &other) const noexcept {
+
81 if (get_grid_idx() < other.get_grid_idx()) {
+
82 return true;
+
83 } else if (get_grid_idx() == other.get_grid_idx()) {
+
84 return get_local_idx() < other.get_local_idx();
+
85 } else {
+
86 return false;
+
87 }
+
88 }
+
89
+
90 constexpr reference operator*() const noexcept {
+
91 auto &&tile = tiles_[get_grid_idx()];
+
92 auto &&value = tile[get_local_idx()];
+
93 key_type idx = {tile_idx_[0] + grid_idx_[0] * tile_shape_[0],
+
94 tile_idx_[1] + grid_idx_[1] * tile_shape_[1]};
+
95 return reference(idx, value);
+
96 }
+
97
+
98private:
+
99 size_type get_global_idx_() const noexcept {
+
100 auto gidx = get_global_idx();
+
101 return gidx[0] * matrix_shape_[1] + gidx[1];
+
102 }
+
103
+
104 key_type get_global_idx() const noexcept {
+
105 return {grid_idx_[0] * tile_shape_[0] + tile_idx_[0],
+
106 grid_idx_[1] * tile_shape_[1] + tile_idx_[1]};
+
107 }
+
108
+
109 size_type get_grid_idx() const noexcept {
+
110 return grid_idx_[0] * grid_shape_[1] + grid_idx_[1];
+
111 }
+
112
+
113 size_type get_local_idx() const noexcept {
+
114 return tile_idx_[0] * tile_shape_[1] + tile_idx_[1];
+
115 }
+
116
+
117 size_type get_tile_size() const noexcept {
+
118 return tile_shape_[0] * tile_shape_[1];
+
119 }
+
120
+
121private:
+
122 key_type grid_idx_;
+
123 key_type tile_idx_;
+
124
+
125 key_type grid_shape_;
+
126 key_type tile_shape_;
+
127 key_type matrix_shape_;
+
128
+
129 std::span<tile_type> tiles_;
+
130};
+
131
+
132template <typename T, typename L>
+ + +
135
+
136template <typename T> class distributed_dense_matrix {
+
137public:
+
138 using size_type = std::size_t;
+
139 using difference_type = std::ptrdiff_t;
+
140
+ +
142
+
143 using scalar_reference = rng::range_reference_t<
+ +
145 using const_scalar_reference = rng::range_reference_t<
+ +
147
+ + +
150
+
151 using key_type = dr::index<>;
+
152
+ + +
155
+ +
157 : shape_(shape), partition_(new dr::sp::block_cyclic()) {
+
158 init_();
+
159 }
+
160
+
161 distributed_dense_matrix(key_type shape, const matrix_partition &partition)
+
162 : shape_(shape), partition_(partition.clone()) {
+
163 init_();
+
164 }
+
165
+
166 size_type size() const noexcept { return shape()[0] * shape()[1]; }
+
167
+
168 key_type shape() const noexcept { return shape_; }
+
169
+
170 scalar_reference operator[](key_type index) {
+
171 std::size_t tile_i = index[0] / tile_shape_[0];
+
172 std::size_t tile_j = index[1] / tile_shape_[1];
+
173
+
174 std::size_t local_i = index[0] % tile_shape_[0];
+
175 std::size_t local_j = index[1] % tile_shape_[1];
+
176
+
177 auto &&tile = tiles_[tile_i * grid_shape_[1] + tile_j];
+
178
+
179 return tile[local_i * tile_shape_[1] + local_j];
+
180 }
+
181
+
182 const_scalar_reference operator[](key_type index) const {
+
183 std::size_t tile_i = index[0] / tile_shape_[0];
+
184 std::size_t tile_j = index[1] / tile_shape_[1];
+
185
+
186 std::size_t local_i = index[0] % tile_shape_[0];
+
187 std::size_t local_j = index[1] % tile_shape_[1];
+
188
+
189 auto &&tile = tiles_[tile_i * grid_shape_[1] + tile_j];
+
190
+
191 return tile[local_i * tile_shape_[1] + local_j];
+
192 }
+
193
+
194 iterator begin() {
+
195 return iterator(tiles_, key_type({0, 0}), key_type({0, 0}), grid_shape_,
+
196 tile_shape_, shape_);
+
197 }
+
198
+
199 iterator end() { return begin() + shape()[0] * shape()[1]; }
+
200
+
201 key_type tile_shape() const noexcept { return tile_shape_; }
+
202
+
203 key_type grid_shape() const noexcept { return grid_shape_; }
+
204
+
205 auto tile(key_type tile_index) {
+
206 auto &&[i, j] = tile_index;
+
207 auto iter = tiles_[i * grid_shape()[1] + j].begin();
+
208
+
209 std::size_t tm =
+
210 std::min(tile_shape()[0], shape()[0] - i * tile_shape()[0]);
+
211 std::size_t tn =
+
212 std::min(tile_shape()[1], shape()[1] - j * tile_shape()[1]);
+
213
+
214 return dense_matrix_view<
+
215 T,
+
216 rng::iterator_t<dr::sp::device_vector<T, dr::sp::device_allocator<T>>>>(
+
217 iter, key_type{tm, tn}, tile_shape()[1],
+
218 tiles_[i * grid_shape()[1] + j].rank());
+
219 }
+
220
+
221 std::vector<dense_matrix_view<T, rng::iterator_t<dr::sp::device_vector<
+ +
223 tiles() {
+
224 std::vector<dense_matrix_view<T, rng::iterator_t<dr::sp::device_vector<
+ +
226 views_;
+
227
+
228 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
+
229 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
+
230 auto iter = tiles_[i * grid_shape_[1] + j].begin();
+
231
+
232 std::size_t tm =
+
233 std::min(tile_shape_[0], shape()[0] - i * tile_shape_[0]);
+
234 std::size_t tn =
+
235 std::min(tile_shape_[1], shape()[1] - j * tile_shape_[1]);
+
236
+
237 views_.emplace_back(iter, key_type{tm, tn}, tile_shape_[1],
+
238 tiles_[i * grid_shape_[1] + j].rank());
+
239 }
+
240 }
+
241 return views_;
+
242 }
+
243
+
244 template <typename Allocator = std::allocator<T>>
+
245 auto get_tile(key_type tile_index, const Allocator &alloc = Allocator{}) {
+
246 std::size_t nrows = get_tile_shape_(tile_index)[0];
+
247 std::size_t ld = tile_shape_[1];
+
248 std::size_t tile_size = nrows * ld;
+
249 dense_matrix<T, Allocator> local_tile(get_tile_shape_(tile_index), ld,
+
250 alloc);
+
251 auto remote_tile = tile(tile_index);
+
252 sp::copy(remote_tile.data(), remote_tile.data() + tile_size,
+
253 local_tile.data());
+
254 return local_tile;
+
255 }
+
256
+
257 template <typename Allocator = std::allocator<T>>
+
258 auto get_tile_async(key_type tile_index,
+
259 const Allocator &alloc = Allocator{}) {
+
260 std::size_t nrows = get_tile_shape_(tile_index)[0];
+
261 std::size_t ld = tile_shape_[1];
+
262 std::size_t tile_size = nrows * ld;
+
263 dense_matrix<T, Allocator> local_tile(get_tile_shape_(tile_index), ld,
+
264 alloc);
+
265 auto remote_tile = tile(tile_index);
+
266 auto event = sp::copy_async(
+
267 remote_tile.data(), remote_tile.data() + tile_size, local_tile.data());
+
268 // TODO: use/enhance the existing future in parallel_backend_sycl_utils.h
+
269 return future(std::move(local_tile), {event});
+
270 }
+
271
+
272 auto segments() {
+
273 std::vector<dense_matrix_view<T, rng::iterator_t<dr::sp::device_vector<
+ +
275 views_;
+
276
+
277 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
+
278 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
+
279 auto iter = tiles_[i * grid_shape_[1] + j].begin();
+
280
+
281 std::size_t tm =
+
282 std::min(tile_shape_[0], shape()[0] - i * tile_shape_[0]);
+
283 std::size_t tn =
+
284 std::min(tile_shape_[1], shape()[1] - j * tile_shape_[1]);
+
285
+
286 std::size_t m_offset = i * tile_shape_[0];
+
287 std::size_t n_offset = j * tile_shape_[1];
+
288
+
289 views_.emplace_back(iter, key_type{tm, tn},
+
290 key_type{m_offset, n_offset}, tile_shape_[1],
+
291 tiles_[i * grid_shape_[1] + j].rank());
+
292 }
+
293 }
+
294 return dr::__detail::owning_view(std::move(views_));
+
295 }
+
296
+
297private:
+
298 void init_() {
+
299 grid_shape_ = partition_->grid_shape(shape());
+
300 tile_shape_ = partition_->tile_shape(shape());
+
301
+
302 tiles_.reserve(grid_shape_[0] * grid_shape_[1]);
+
303
+
304 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
+
305 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
+
306 std::size_t rank = partition_->tile_rank(shape(), {i, j});
+
307
+
308 auto device = dr::sp::devices()[rank];
+
309 dr::sp::device_allocator<T> alloc(dr::sp::context(), device);
+
310
+
311 std::size_t tile_size = tile_shape_[0] * tile_shape_[1];
+
312
+
313 tiles_.emplace_back(tile_size, alloc, rank);
+
314 }
+
315 }
+
316 }
+
317
+
318 key_type get_tile_shape_(key_type tile_index) {
+
319 auto &&[i, j] = tile_index;
+
320 std::size_t tm = std::min(tile_shape_[0], shape()[0] - i * tile_shape_[0]);
+
321 std::size_t tn = std::min(tile_shape_[1], shape()[1] - j * tile_shape_[1]);
+
322 return key_type{tm, tn};
+
323 }
+
324
+
325private:
+
326 key_type shape_;
+
327 key_type grid_shape_;
+
328 key_type tile_shape_;
+
329 std::unique_ptr<dr::sp::matrix_partition> partition_;
+
330
+
331 std::vector<dr::sp::device_vector<T, dr::sp::device_allocator<T>>> tiles_;
+
332};
+
333
+
334} // namespace dr::sp
+
Definition: owning_view.hpp:18
+
Definition: index.hpp:34
+
Definition: iterator_adaptor.hpp:23
+
Definition: matrix_partition.hpp:34
+
Definition: dense_matrix_view.hpp:21
+
Definition: dense_matrix.hpp:19
+
Definition: allocators.hpp:20
+
Definition: device_vector.hpp:13
+
Definition: distributed_dense_matrix.hpp:20
+
Definition: distributed_dense_matrix.hpp:136
+
Definition: future.hpp:14
+
Definition: matrix_entry.hpp:15
+
Definition: matrix_partition.hpp:23
+
Definition: matrix_entry.hpp:112
+
+ + + + diff --git a/doxygen/distributed__mdarray_8hpp_source.html b/doxygen/distributed__mdarray_8hpp_source.html new file mode 100644 index 0000000000..723c8f5fb0 --- /dev/null +++ b/doxygen/distributed__mdarray_8hpp_source.html @@ -0,0 +1,185 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/containers/distributed_mdarray.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
distributed_mdarray.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/detail/ranges_shim.hpp>
+
8#include <dr/mp/views/mdspan_view.hpp>
+
9
+
10namespace dr::mp {
+
11
+
12template <typename T, std::size_t Rank> class distributed_mdarray {
+
13public:
+
14 using shape_type = dr::__detail::dr_extents<Rank>;
+
15 static constexpr auto rank() { return Rank; }
+
16
+
17 distributed_mdarray(dr::__detail::dr_extents<Rank> shape,
+ +
19 : tile_shape_(tile_shape(shape)), dv_(dv_size(), dv_dist(dist, shape)),
+
20 md_view_(make_md_view(dv_, shape, tile_shape_)) {}
+
21
+
22 auto begin() const { return rng::begin(md_view_); }
+
23 auto end() const { return rng::end(md_view_); }
+
24 auto size() const { return rng::size(md_view_); }
+
25 auto operator[](auto n) { return md_view_[n]; }
+
26
+
27 auto segments() { return dr::ranges::segments(md_view_); }
+
28 auto &halo() const { return dr::mp::halo(dv_); }
+
29
+
30 auto mdspan() const { return md_view_.mdspan(); }
+
31 auto extent(std::size_t r) const { return mdspan().extent(r); }
+
32 auto grid() { return md_view_.grid(); }
+
33 auto view() const { return md_view_; }
+
34
+
35 auto operator==(const distributed_mdarray &other) const {
+
36 return std::equal(begin(), end(), other.begin());
+
37 }
+
38
+
39private:
+ +
41
+
42 static auto tile_shape(auto shape) {
+
43 std::size_t n = default_comm().size(); // dr-style ignore
+
44 shape[0] = dr::__detail::partition_up(shape[0], n);
+
45 return shape;
+
46 }
+
47
+
48 static auto md_size(auto shape) {
+
49 std::size_t size = 1;
+
50 for (auto extent : shape) {
+
51 size *= extent;
+
52 }
+
53 return size;
+
54 }
+
55
+
56 auto dv_size() {
+
57 return default_comm().size() * md_size(tile_shape_); // dr-style ignore
+
58 }
+
59
+
60 static auto dv_dist(distribution incoming_dist, auto shape) {
+
61 // Decomp is 1 "row" in decomp dimension
+
62 // TODO: only supports dist on leading dimension
+
63 shape[0] = 1;
+
64 std::size_t row_size = md_size(shape);
+
65 auto incoming_halo = incoming_dist.halo();
+
66 return distribution().halo(incoming_halo.prev * row_size,
+
67 incoming_halo.next * row_size);
+
68 }
+
69
+
70 // This wrapper seems to avoid an issue with template argument
+
71 // deduction for mdspan_view
+
72 static auto make_md_view(const DV &dv, shape_type shape,
+
73 shape_type tile_shape) {
+
74 return views::mdspan(dv, shape, tile_shape);
+
75 }
+
76
+
77 shape_type tile_shape_;
+
78 DV dv_;
+
79 using mdspan_type =
+
80 decltype(make_md_view(std::declval<DV>(), std::declval<shape_type>(),
+
81 std::declval<shape_type>()));
+
82 mdspan_type md_view_;
+
83};
+
84
+
85template <typename T, std::size_t Rank>
+
86auto &halo(const distributed_mdarray<T, Rank> &mdarray) {
+
87 return mdarray.halo();
+
88}
+
89
+
90template <typename T, std::size_t Rank>
+
91std::ostream &operator<<(std::ostream &os,
+
92 const distributed_mdarray<T, Rank> &mdarray) {
+
93 os << fmt::format("\n{}", mdarray.mdspan());
+
94 return os;
+
95}
+
96
+
97} // namespace dr::mp
+
Definition: distributed_mdarray.hpp:12
+
distributed vector
Definition: distributed_vector.hpp:138
+
Definition: distribution.hpp:11
+
+ + + + diff --git a/doxygen/distributed__span_8hpp_source.html b/doxygen/distributed__span_8hpp_source.html new file mode 100644 index 0000000000..e041bdecb2 --- /dev/null +++ b/doxygen/distributed__span_8hpp_source.html @@ -0,0 +1,347 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/distributed_span.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
distributed_span.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <vector>
+
8
+
9#include <dr/concepts/concepts.hpp>
+
10#include <dr/detail/iterator_adaptor.hpp>
+
11#include <dr/detail/ranges.hpp>
+
12#include <dr/detail/segments_tools.hpp>
+
13#include <dr/sp/device_span.hpp>
+
14
+
15namespace dr::sp {
+
16
+
17template <typename T, typename L> class distributed_span_accessor {
+
18public:
+
19 using element_type = T;
+
20 using value_type = std::remove_cv_t<T>;
+
21
+
22 using segment_type = L;
+
23
+
24 using size_type = rng::range_size_t<segment_type>;
+
25 using difference_type = rng::range_difference_t<segment_type>;
+
26
+
27 // using pointer = typename segment_type::pointer;
+
28 using reference = rng::range_reference_t<segment_type>;
+
29
+
30 using iterator_category = std::random_access_iterator_tag;
+
31
+ + + +
35
+
36 constexpr distributed_span_accessor() noexcept = default;
+
37 constexpr ~distributed_span_accessor() noexcept = default;
+ +
39 const distributed_span_accessor &) noexcept = default;
+ +
41 operator=(const distributed_span_accessor &) noexcept = default;
+
42
+
43 constexpr distributed_span_accessor(std::span<segment_type> segments,
+
44 size_type segment_id,
+
45 size_type idx) noexcept
+
46 : segments_(segments), segment_id_(segment_id), idx_(idx) {}
+
47
+ +
49 operator+=(difference_type offset) noexcept {
+
50
+
51 while (offset > 0) {
+
52 difference_type current_offset =
+
53 std::min(offset, difference_type(segments_[segment_id_].size()) -
+
54 difference_type(idx_));
+
55 idx_ += current_offset;
+
56 offset -= current_offset;
+
57
+
58 if (idx_ >= segments_[segment_id_].size()) {
+
59 segment_id_++;
+
60 idx_ = 0;
+
61 }
+
62 }
+
63
+
64 while (offset < 0) {
+
65 difference_type current_offset =
+
66 std::min(-offset, difference_type(idx_) + 1);
+
67
+
68 difference_type new_idx = difference_type(idx_) - current_offset;
+
69
+
70 if (new_idx < 0) {
+
71 segment_id_--;
+
72 new_idx = segments_[segment_id_].size() - 1;
+
73 }
+
74
+
75 idx_ = new_idx;
+
76 }
+
77
+
78 return *this;
+
79 }
+
80
+
81 constexpr bool operator==(const iterator_accessor &other) const noexcept {
+
82 return segment_id_ == other.segment_id_ && idx_ == other.idx_;
+
83 }
+
84
+
85 constexpr difference_type
+
86 operator-(const iterator_accessor &other) const noexcept {
+
87 return difference_type(get_global_idx()) - other.get_global_idx();
+
88 }
+
89
+
90 constexpr bool operator<(const iterator_accessor &other) const noexcept {
+
91 if (segment_id_ < other.segment_id_) {
+
92 return true;
+
93 } else if (segment_id_ == other.segment_id_) {
+
94 return idx_ < other.idx_;
+
95 } else {
+
96 return false;
+
97 }
+
98 }
+
99
+
100 constexpr reference operator*() const noexcept {
+
101 return segments_[segment_id_][idx_];
+
102 }
+
103
+
104 auto segments() const noexcept {
+
105 return dr::__detail::drop_segments(segments_, segment_id_, idx_);
+
106 }
+
107
+
108private:
+
109 size_type get_global_idx() const noexcept {
+
110 size_type cumulative_size = 0;
+
111 for (std::size_t i = 0; i < segment_id_; i++) {
+
112 cumulative_size += segments_[i].size();
+
113 }
+
114 return cumulative_size + idx_;
+
115 }
+
116
+
117 std::span<segment_type> segments_;
+
118 size_type segment_id_ = 0;
+
119 size_type idx_ = 0;
+
120};
+
121
+
122template <typename T, typename L>
+ + +
125
+
126template <typename T, typename L>
+
127class distributed_span : public rng::view_interface<distributed_span<T, L>> {
+
128public:
+
129 using element_type = T;
+
130 using value_type = std::remove_cv_t<T>;
+
131
+ +
133
+
134 using size_type = rng::range_size_t<segment_type>;
+
135 using difference_type = rng::range_difference_t<segment_type>;
+
136
+
137 // using pointer = typename segment_type::pointer;
+
138 using reference = rng::range_reference_t<segment_type>;
+
139
+
140 // Note: creating the "global view" will be trivial once #44178 is resolved.
+
141 // (https://github.com/llvm/llvm-project/issues/44178)
+
142 // The "global view" is simply all of the segmented views joined together.
+
143 // However, this code does not currently compile due to a bug in Clang,
+
144 // so I am currently implementing my own global iterator manually.
+
145 // using joined_view_type =
+
146 // rng::join_view<rng::ref_view<std::vector<segment_type>>>;
+
147 // using iterator = rng::iterator_t<joined_view_type>;
+
148
+ +
150
+
151 constexpr distributed_span() noexcept = default;
+
152 constexpr distributed_span(const distributed_span &) noexcept = default;
+
153 constexpr distributed_span &
+
154 operator=(const distributed_span &) noexcept = default;
+
155
+
156 template <rng::input_range R>
+ +
158 constexpr distributed_span(R &&segments) {
+
159 for (auto &&segment : segments) {
+
160 std::size_t size = rng::size(segment);
+
161 segments_.push_back(
+
162 segment_type(rng::begin(segment), size, dr::ranges::rank(segment)));
+
163 size_ += size;
+
164 }
+
165 }
+
166
+
167 template <dr::distributed_range R> constexpr distributed_span(R &&r) {
+
168 for (auto &&segment : dr::ranges::segments(std::forward<R>(r))) {
+
169 std::size_t size = rng::size(segment);
+
170 segments_.push_back(
+
171 segment_type(rng::begin(segment), size, dr::ranges::rank(segment)));
+
172 size_ += size;
+
173 }
+
174 }
+
175
+
176 constexpr size_type size() const noexcept { return size_; }
+
177
+
178 constexpr size_type size_bytes() const noexcept {
+
179 return size() * sizeof(element_type);
+
180 }
+
181
+
182 constexpr reference operator[](size_type idx) const {
+
183 // TODO: optimize this
+
184 std::size_t span_id = 0;
+
185 for (std::size_t span_id = 0; idx >= segments()[span_id].size();
+
186 span_id++) {
+
187 idx -= segments()[span_id].size();
+
188 }
+
189 return segments()[span_id][idx];
+
190 }
+
191
+
192 [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; }
+
193
+
194 constexpr distributed_span
+
195 subspan(size_type Offset, size_type Count = std::dynamic_extent) const {
+
196 Count = std::min(Count, size() - Offset);
+
197
+
198 std::vector<segment_type> new_segments;
+
199
+
200 // Forward to segment_id that contains global index `Offset`.
+
201 std::size_t segment_id = 0;
+
202 for (segment_id = 0; Offset >= segments()[segment_id].size();
+
203 segment_id++) {
+
204 Offset -= segments()[segment_id].size();
+
205 }
+
206
+
207 // Our Offset begins at `segment_id, Offset`
+
208
+
209 while (Count > 0) {
+
210 std::size_t local_count =
+
211 std::min(Count, segments()[segment_id].size() - Offset);
+
212 auto new_segment = segments()[segment_id].subspan(Offset, local_count);
+
213 new_segments.push_back(new_segment);
+
214 Count -= local_count;
+
215 Offset = 0;
+
216 segment_id++;
+
217 }
+
218
+
219 return distributed_span(new_segments);
+
220 }
+
221
+
222 constexpr distributed_span first(size_type Count) const {
+
223 return subspan(0, Count);
+
224 }
+
225
+
226 constexpr distributed_span last(size_type Count) const {
+
227 return subspan(size() - Count, Count);
+
228 }
+
229
+
230 iterator begin() { return iterator(segments(), 0, 0); }
+
231
+
232 iterator end() { return iterator(segments(), segments().size(), 0); }
+
233
+
234 constexpr reference front() { return segments().front().front(); }
+
235
+
236 constexpr reference back() { return segments().back().back(); }
+
237
+
238 std::span<segment_type> segments() { return segments_; }
+
239
+
240 std::span<const segment_type> segments() const { return segments_; }
+
241
+
242private:
+
243 std::size_t size_ = 0;
+
244 std::vector<segment_type> segments_;
+
245};
+
246
+
247template <rng::input_range R>
+
248distributed_span(R &&segments)
+ +
250 rng::iterator_t<rng::range_value_t<R>>>;
+
251
+
252template <dr::distributed_contiguous_range R>
+ +
254 rng::range_value_t<R>,
+
255 rng::iterator_t<rng::range_value_t<decltype(dr::ranges::segments(r))>>>;
+
256
+
257} // namespace dr::sp
+
Definition: iterator_adaptor.hpp:23
+
Definition: device_span.hpp:44
+
Definition: distributed_span.hpp:17
+
Definition: distributed_span.hpp:127
+
Definition: concepts.hpp:16
+
+ + + + diff --git a/doxygen/distribution_8hpp_source.html b/doxygen/distribution_8hpp_source.html new file mode 100644 index 0000000000..c508154667 --- /dev/null +++ b/doxygen/distribution_8hpp_source.html @@ -0,0 +1,133 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/containers/distribution.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
distribution.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/mp/halo.hpp>
+
8
+
9namespace dr::mp {
+
10
+ +
12public:
+
13 distribution &halo(std::size_t radius) {
+
14 halo_bounds_.prev = radius;
+
15 halo_bounds_.next = radius;
+
16 return *this;
+
17 }
+
18
+
19 distribution &halo(std::size_t prev, std::size_t next) {
+
20 halo_bounds_.prev = prev;
+
21 halo_bounds_.next = next;
+
22 return *this;
+
23 }
+
24
+
25 auto halo() const { return halo_bounds_; }
+
26
+
27 distribution &periodic(bool periodic) {
+
28 halo_bounds_.periodic = periodic;
+
29 return *this;
+
30 }
+
31
+
32 auto periodic() const { return halo_bounds_.periodic; }
+
33
+
34 distribution &granularity(std::size_t size) {
+
35 granularity_ = size;
+
36 return *this;
+
37 }
+
38
+
39 auto granularity() const { return granularity_; }
+
40
+
41private:
+
42 halo_bounds halo_bounds_;
+
43 std::size_t granularity_ = 1;
+
44};
+
45
+
46} // namespace dr::mp
+
Definition: distribution.hpp:11
+
Definition: halo.hpp:362
+
+ + + + diff --git a/doxygen/doc.png b/doxygen/doc.png new file mode 100644 index 0000000000..17edabff95 Binary files /dev/null and b/doxygen/doc.png differ diff --git a/doxygen/docd.png b/doxygen/docd.png new file mode 100644 index 0000000000..d7c94fda9b Binary files /dev/null and b/doxygen/docd.png differ diff --git a/doxygen/doxygen.css b/doxygen/doxygen.css new file mode 100644 index 0000000000..08cc53ab58 --- /dev/null +++ b/doxygen/doxygen.css @@ -0,0 +1,2007 @@ +/* The standard CSS for doxygen 1.9.6*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.png'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.png'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doxygen/doxygen.svg b/doxygen/doxygen.svg new file mode 100644 index 0000000000..d42dad52d5 --- /dev/null +++ b/doxygen/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doxygen/duplicated__vector_8hpp_source.html b/doxygen/duplicated__vector_8hpp_source.html new file mode 100644 index 0000000000..c4ca315c3f --- /dev/null +++ b/doxygen/duplicated__vector_8hpp_source.html @@ -0,0 +1,135 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/duplicated_vector.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
duplicated_vector.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/sp/allocators.hpp>
+
8#include <dr/sp/device_vector.hpp>
+
9
+
10namespace dr::sp {
+
11
+
12template <typename T, typename Allocator = dr::sp::device_allocator<T>>
+ +
14public:
+ +
16
+
17 using value_type = T;
+
18 using size_type = std::size_t;
+
19 using difference_type = std::ptrdiff_t;
+
20
+
21 using allocator_type = Allocator;
+
22
+
23 duplicated_vector(std::size_t count = 0) {
+
24 size_ = count;
+
25 capacity_ = count;
+
26
+
27 std::size_t rank = 0;
+
28 for (auto &&device : dr::sp::devices()) {
+
29 segments_.emplace_back(
+
30 segment_type(size(), Allocator(dr::sp::context(), device), rank++));
+
31 }
+
32 }
+
33
+
34 size_type size() const noexcept { return size_; }
+
35
+
36 segment_type &local_vector(std::size_t rank) { return segments_[rank]; }
+
37
+
38 const segment_type &local_vector(std::size_t rank) const {
+
39 return segments_[rank];
+
40 }
+
41
+
42private:
+
43 std::vector<segment_type> segments_;
+
44 std::size_t capacity_ = 0;
+
45 std::size_t size_ = 0;
+
46};
+
47
+
48} // namespace dr::sp
+
Definition: device_vector.hpp:13
+
Definition: duplicated_vector.hpp:13
+
+ + + + diff --git a/doxygen/dynsections.js b/doxygen/dynsections.js new file mode 100644 index 0000000000..f579fbf3e2 --- /dev/null +++ b/doxygen/dynsections.js @@ -0,0 +1,123 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/execution_policy.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
execution_policy.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <span>
+
8#include <sycl/sycl.hpp>
+
9#include <vector>
+
10
+
11namespace dr::sp {
+
12
+ +
14 device_policy(sycl::device device) : devices_({device}) {}
+
15 device_policy(sycl::queue queue) : devices_({queue.get_device()}) {}
+
16
+
17 device_policy() : devices_({sycl::queue{}.get_device()}) {}
+
18
+
19 template <rng::range R>
+
20 requires(std::is_same_v<rng::range_value_t<R>, sycl::device>)
+
21 device_policy(R &&devices)
+
22 : devices_(rng::begin(devices), rng::end(devices)) {}
+
23
+
24 std::span<sycl::device> get_devices() noexcept { return devices_; }
+
25
+
26 std::span<const sycl::device> get_devices() const noexcept {
+
27 return devices_;
+
28 }
+
29
+
30private:
+
31 std::vector<sycl::device> devices_;
+
32};
+
33
+
34} // namespace dr::sp
+
Definition: execution_policy.hpp:13
+
+ + + + diff --git a/doxygen/files.html b/doxygen/files.html new file mode 100644 index 0000000000..1f663d86d2 --- /dev/null +++ b/doxygen/files.html @@ -0,0 +1,215 @@ + + + + + + + +Distributed Ranges: File List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 123456]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  include
  dr
  concepts
 concepts.hpp
  detail
 communicator.hpp
 enumerate.hpp
 format_shim.hpp
 index.hpp
 iterator_adaptor.hpp
 logger.hpp
 mdarray_shim.hpp
 mdspan_shim.hpp
 mdspan_utils.hpp
 memory.hpp
 normal_distributed_iterator.hpp
 onedpl_direct_iterator.hpp
 owning_view.hpp
 ranges.hpp
 ranges_shim.hpp
 ranges_utils.hpp
 remote_subrange.hpp
 segments_tools.hpp
 sycl_utils.hpp
 tuple_utils.hpp
 utils.hpp
 view_detectors.hpp
  mp
  algorithms
  containers
  views
 alignment.hpp
 allocator.hpp
 common_support.hpp
 global.hpp
 halo.hpp
 sycl_support.hpp
  sp
  algorithms
  containers
  util
  views
 allocators.hpp
 detail.hpp
 device_ptr.hpp
 device_ref.hpp
 device_span.hpp
 device_vector.hpp
 distributed_span.hpp
 distributed_vector.hpp
 future.hpp
 init.hpp
 range.hpp
 range_adaptors.hpp
 span.hpp
 util.hpp
 vector.hpp
 zip_view.hpp
  views
 iota.hpp
 transform.hpp
 views.hpp
 mp.hpp
 sp.hpp
  vendor
  source_location
 source_location.hpp
+
+
+ + + + diff --git a/doxygen/folderclosed.png b/doxygen/folderclosed.png new file mode 100644 index 0000000000..bb8ab35edc Binary files /dev/null and b/doxygen/folderclosed.png differ diff --git a/doxygen/folderopen.png b/doxygen/folderopen.png new file mode 100644 index 0000000000..d6c7f676a3 Binary files /dev/null and b/doxygen/folderopen.png differ diff --git a/doxygen/format__shim_8hpp_source.html b/doxygen/format__shim_8hpp_source.html new file mode 100644 index 0000000000..552633f4b1 --- /dev/null +++ b/doxygen/format__shim_8hpp_source.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/format_shim.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
format_shim.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#ifdef DR_FORMAT
+
8#include <fmt/core.h>
+
9#include <fmt/ranges.h>
+
10#endif
+
11
+
12// Workaround for doxygen warning about internal inconsistency
+
13namespace fmt {}
+
+ + + + diff --git a/doxygen/functions.html b/doxygen/functions.html new file mode 100644 index 0000000000..cf5b199cb4 --- /dev/null +++ b/doxygen/functions.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: Class Members + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+
+ + + + diff --git a/doxygen/functions_func.html b/doxygen/functions_func.html new file mode 100644 index 0000000000..ea34bdb4d2 --- /dev/null +++ b/doxygen/functions_func.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ + + + diff --git a/doxygen/future_8hpp_source.html b/doxygen/future_8hpp_source.html new file mode 100644 index 0000000000..3cd2326250 --- /dev/null +++ b/doxygen/future_8hpp_source.html @@ -0,0 +1,134 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/future.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
future.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <memory>
+
8#include <sycl/sycl.hpp>
+
9
+
10#include <dr/sp/detail.hpp>
+
11
+
12namespace dr::sp {
+
13
+
14template <typename T, typename Event = sycl::event> class future {
+
15public:
+
16 using event_type = Event;
+
17
+
18 future(std::unique_ptr<T> &&value, const std::vector<Event> &events)
+
19 : value_(std::move(value)), events_(events) {}
+
20
+
21 future(T &&value, const std::vector<Event> &events)
+
22 : value_(new T(std::move(value))), events_(events) {}
+
23
+
24 void update(const Event &event) { events_.push_back(event); }
+
25
+
26 future(future &&) = default;
+
27 future &operator=(future &&) = default;
+
28
+
29 future(const future &) = delete;
+
30 future &operator=(const future &) = delete;
+
31
+
32 T get() {
+
33 wait();
+
34 return std::move(*value_);
+
35 }
+
36
+
37 std::vector<Event> events() const { return events_; }
+
38
+
39 T &value() const { return *value_; }
+
40
+
41 void wait() { __detail::wait(events_); }
+
42
+
43private:
+
44 std::unique_ptr<T> value_;
+
45 std::vector<Event> events_;
+
46};
+
47
+
48} // namespace dr::sp
+
Definition: future.hpp:14
+
+ + + + diff --git a/doxygen/gemm_8hpp_source.html b/doxygen/gemm_8hpp_source.html new file mode 100644 index 0000000000..b92214222a --- /dev/null +++ b/doxygen/gemm_8hpp_source.html @@ -0,0 +1,333 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/matrix/gemm.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
gemm.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/sp/algorithms/matrix/local_gemm.hpp>
+
8#include <dr/sp/containers/distributed_dense_matrix.hpp>
+
9
+
10namespace dr::sp {
+
11
+
12template <typename T>
+
13void gemm(distributed_dense_matrix<T> &a, distributed_dense_matrix<T> &b,
+
14 distributed_dense_matrix<T> &c) {
+
15 gemm_buffered(a, b, c);
+
16}
+
17
+
18template <typename T>
+
19void gemm_inplace(distributed_dense_matrix<T> &a,
+
20 distributed_dense_matrix<T> &b,
+
21 distributed_dense_matrix<T> &c) {
+
22 // Matrix dimensions must match (algorithm requirement)
+
23 assert(c.shape()[0] == a.shape()[0]);
+
24 assert(c.shape()[1] == b.shape()[1]);
+
25 assert(a.shape()[1] == b.shape()[0]);
+
26
+
27 // Tile grid dimensions must match (implementation limitation)
+
28
+
29 assert(c.grid_shape()[0] == a.grid_shape()[0]);
+
30 assert(c.grid_shape()[1] == b.grid_shape()[1]);
+
31 assert(a.grid_shape()[1] == b.grid_shape()[0]);
+
32
+
33 std::vector<sycl::event> events;
+
34 events.reserve(c.grid_shape()[0] * c.grid_shape()[1] * a.grid_shape()[1]);
+
35
+
36 for (std::size_t i = 0; i < c.grid_shape()[0]; i++) {
+
37 for (std::size_t j = 0; j < c.grid_shape()[1]; j++) {
+
38 // For each tile of the output C matrix
+
39 auto &&c_tile = c.tile({i, j});
+
40
+
41 std::vector<sycl::event> local_events;
+
42 local_events.reserve(a.grid_shape()[1]);
+
43
+
44 std::size_t k_offset = i + j;
+
45 for (std::size_t k_ = 0; k_ < a.grid_shape()[1]; k_++) {
+
46 std::size_t k = (k_ + k_offset) % a.grid_shape()[1];
+
47
+
48 auto &&a_tile = a.tile({i, k});
+
49 auto &&b_tile = b.tile({k, j});
+
50
+
51 auto &&q = __detail::queue(dr::ranges::rank(c_tile));
+
52
+
53 auto e = __detail::local_gemm(q, __detail::local(a_tile),
+
54 __detail::local(b_tile),
+
55 __detail::local(c_tile), local_events);
+
56
+
57 local_events.push_back(e);
+
58 }
+
59
+
60 for (auto &&e : local_events) {
+
61 events.push_back(e);
+
62 }
+
63 }
+
64 }
+
65
+
66 __detail::wait(events);
+
67}
+
68
+
69template <typename T>
+
70void gemm_buffered(distributed_dense_matrix<T> &a,
+
71 distributed_dense_matrix<T> &b,
+
72 distributed_dense_matrix<T> &c) {
+
73 // Matrix dimensions must match (algorithm requirement)
+
74 assert(c.shape()[0] == a.shape()[0]);
+
75 assert(c.shape()[1] == b.shape()[1]);
+
76 assert(a.shape()[1] == b.shape()[0]);
+
77
+
78 // Tile grid dimensions must match (implementation limitation)
+
79
+
80 assert(c.grid_shape()[0] == a.grid_shape()[0]);
+
81 assert(c.grid_shape()[1] == b.grid_shape()[1]);
+
82 assert(a.grid_shape()[1] == b.grid_shape()[0]);
+
83
+
84 std::vector<std::thread> threads;
+
85
+
86 std::atomic<double> communication = 0;
+
87 std::atomic<double> compute = 0;
+
88
+
89 for (std::size_t i = 0; i < c.grid_shape()[0]; i++) {
+
90 for (std::size_t j = 0; j < c.grid_shape()[1]; j++) {
+
91 auto c_local = c.tile({i, j});
+
92
+
93 threads.emplace_back([c_local, i, j, &a, &b, &communication, &compute] {
+
94 auto &&q = __detail::queue(dr::ranges::rank(c_local));
+
95
+
96 std::size_t a_elem = a.tile_shape()[0] * a.tile_shape()[1];
+
97 std::size_t b_elem = b.tile_shape()[0] * b.tile_shape()[1];
+
98 std::size_t buffer_size = std::max(a_elem, b_elem);
+
99
+
100 dr::sp::device_allocator<T> gpu_allocator(q);
+
101 dr::sp::buffered_allocator buffered_allocator(gpu_allocator,
+
102 buffer_size, 2);
+
103 auto &&allocator = buffered_allocator;
+
104
+
105 std::size_t k_offset = i + j;
+
106
+
107 for (std::size_t k_ = 0; k_ < a.grid_shape()[1]; k_++) {
+
108 std::size_t k = (k_ + k_offset) % a.grid_shape()[1];
+
109
+
110 auto begin = std::chrono::high_resolution_clock::now();
+
111 auto a_tile = a.get_tile({i, k}, allocator);
+
112 auto b_tile = b.get_tile({k, j}, allocator);
+
113 auto end = std::chrono::high_resolution_clock::now();
+
114 double duration = std::chrono::duration<double>(end - begin).count();
+
115 communication += duration;
+
116
+
117 dr::sp::dense_matrix_view a_local(a_tile);
+
118 dr::sp::dense_matrix_view b_local(b_tile);
+
119
+
120 begin = std::chrono::high_resolution_clock::now();
+
121 __detail::local_gemm(q, __detail::local(a_local),
+
122 __detail::local(b_local),
+
123 __detail::local(c_local))
+
124 .wait();
+
125 end = std::chrono::high_resolution_clock::now();
+
126 duration = std::chrono::duration<double>(end - begin).count();
+
127 compute += duration;
+
128 }
+
129 });
+
130 }
+
131 }
+
132
+
133 for (auto &&t : threads) {
+
134 t.join();
+
135 }
+
136
+
137 bool debug_print = false;
+
138
+
139 if (debug_print) {
+
140 std::cout << "communication total: " << (double)communication << std::endl;
+
141 std::cout << "compute total: " << (double)compute << std::endl;
+
142 }
+
143}
+
144
+
145template <typename T>
+
146void gemm_buffered_async(distributed_dense_matrix<T> &a,
+
147 distributed_dense_matrix<T> &b,
+
148 distributed_dense_matrix<T> &c) {
+
149 // Matrix dimensions must match (algorithm requirement)
+
150 assert(c.shape()[0] == a.shape()[0]);
+
151 assert(c.shape()[1] == b.shape()[1]);
+
152 assert(a.shape()[1] == b.shape()[0]);
+
153
+
154 // Tile grid dimensions must match (implementation limitation)
+
155
+
156 assert(c.grid_shape()[0] == a.grid_shape()[0]);
+
157 assert(c.grid_shape()[1] == b.grid_shape()[1]);
+
158 assert(a.grid_shape()[1] == b.grid_shape()[0]);
+
159
+
160 std::vector<std::thread> threads;
+
161
+
162 std::atomic<double> issue = 0;
+
163 std::atomic<double> sync = 0;
+
164 std::atomic<double> compute = 0;
+
165
+
166 for (std::size_t i = 0; i < c.grid_shape()[0]; i++) {
+
167 for (std::size_t j = 0; j < c.grid_shape()[1]; j++) {
+
168 auto c_local = c.tile({i, j});
+
169
+
170 threads.emplace_back([c_local, i, j, &a, &b, &issue, &sync, &compute] {
+
171 auto &&q = __detail::queue(dr::ranges::rank(c_local));
+
172
+
173 std::size_t a_elem = a.tile_shape()[0] * a.tile_shape()[1];
+
174 std::size_t b_elem = b.tile_shape()[0] * b.tile_shape()[1];
+
175 std::size_t buffer_size = std::max(a_elem, b_elem);
+
176
+
177 dr::sp::device_allocator<T> gpu_allocator(q);
+
178 dr::sp::buffered_allocator buffered_allocator(gpu_allocator,
+
179 buffer_size, 4);
+
180 auto &&allocator = buffered_allocator;
+
181
+
182 std::size_t k_offset = i + j;
+
183
+
184 auto begin = std::chrono::high_resolution_clock::now();
+
185 auto a_f =
+
186 a.get_tile_async({i, k_offset % a.grid_shape()[1]}, allocator);
+
187 // a_f.wait();
+
188 auto b_f =
+
189 b.get_tile_async({k_offset % a.grid_shape()[1], j}, allocator);
+
190 // b_f.wait();
+
191 auto end = std::chrono::high_resolution_clock::now();
+
192 double duration = std::chrono::duration<double>(end - begin).count();
+
193 issue += duration;
+
194
+
195 for (std::size_t k_ = 0; k_ < a.grid_shape()[1]; k_++) {
+
196 std::size_t k = (k_ + k_offset) % a.grid_shape()[1];
+
197
+
198 auto begin = std::chrono::high_resolution_clock::now();
+
199 auto a_tile = a_f.get();
+
200 auto b_tile = b_f.get();
+
201 auto end = std::chrono::high_resolution_clock::now();
+
202 double duration = std::chrono::duration<double>(end - begin).count();
+
203 sync += duration;
+
204
+
205 dr::sp::dense_matrix_view a_local(a_tile);
+
206 dr::sp::dense_matrix_view b_local(b_tile);
+
207
+
208 if (k_ + 1 < a.grid_shape()[1]) {
+
209 begin = std::chrono::high_resolution_clock::now();
+
210 a_f = a.get_tile_async({i, (k + 1) % a.grid_shape()[1]}, allocator);
+
211 // a_f.wait();
+
212 b_f = b.get_tile_async({(k + 1) % a.grid_shape()[1], j}, allocator);
+
213 // b_f.wait();
+
214 end = std::chrono::high_resolution_clock::now();
+
215 duration = std::chrono::duration<double>(end - begin).count();
+
216 issue += duration;
+
217 }
+
218
+
219 begin = std::chrono::high_resolution_clock::now();
+
220 __detail::local_gemm(q, __detail::local(a_local),
+
221 __detail::local(b_local),
+
222 __detail::local(c_local))
+
223 .wait();
+
224 end = std::chrono::high_resolution_clock::now();
+
225 duration = std::chrono::duration<double>(end - begin).count();
+
226 compute += duration;
+
227 }
+
228 });
+
229 }
+
230 }
+
231
+
232 for (auto &&t : threads) {
+
233 t.join();
+
234 }
+
235
+
236 bool debug_print = false;
+
237
+
238 if (debug_print) {
+
239 std::cout << "sync total: " << (double)sync << std::endl;
+
240 std::cout << "issue total: " << (double)issue << std::endl;
+
241 std::cout << "compute total: " << (double)compute << std::endl;
+
242 }
+
243}
+
244
+
245} // namespace dr::sp
+
Definition: allocators.hpp:74
+
Definition: dense_matrix_view.hpp:21
+
Definition: allocators.hpp:20
+
+ + + + diff --git a/doxygen/gemv_8hpp_source.html b/doxygen/gemv_8hpp_source.html new file mode 100644 index 0000000000..86a182f3d9 --- /dev/null +++ b/doxygen/gemv_8hpp_source.html @@ -0,0 +1,300 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/matrix/gemv.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
gemv.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/detail/index.hpp>
+
8#include <dr/detail/ranges_shim.hpp>
+
9
+
10#include <dr/sp/algorithms/matrix/local_gemv.hpp>
+
11#include <dr/sp/containers/duplicated_vector.hpp>
+
12#include <dr/sp/containers/sparse_matrix.hpp>
+
13#include <dr/sp/device_vector.hpp>
+
14#include <dr/sp/distributed_span.hpp>
+
15#include <dr/sp/util.hpp>
+
16
+
17namespace dr::sp {
+
18
+
19template <dr::distributed_range C, typename T, typename I,
+ +
21void flat_gemv(C &&c, dr::sp::sparse_matrix<T, I> &a, B &&b) {
+
22 assert(a.shape()[0] == c.size());
+
23 assert(a.shape()[1] == b.size());
+
24 assert(a.grid_shape()[0] == c.segments().size());
+
25 assert(a.grid_shape()[1] == 1);
+
26
+
27 auto &&devices = dr::sp::devices();
+
28
+
29 using b_scalar_type = rng::range_value_t<B>;
+
30
+
31 using local_vector_type =
+
32 dr::sp::device_vector<b_scalar_type,
+ +
34
+
35 std::vector<local_vector_type> local_b;
+
36 std::vector<sycl::event> copy_events;
+
37 std::vector<sycl::event> comp_events;
+
38
+
39 for (std::size_t i = 0; i < devices.size(); i++) {
+
40 dr::sp::device_allocator<T> allocator(dr::sp::context(), devices[i]);
+
41 local_b.push_back(local_vector_type(b.size(), allocator, i));
+
42 }
+
43
+
44 for (auto &&l_b : local_b) {
+
45 auto event =
+
46 dr::sp::copy_async(b.begin(), b.end(), dr::ranges::local(l_b.begin()));
+
47 copy_events.push_back(event);
+
48 }
+
49
+
50 for (std::size_t i = 0; i < a.grid_shape()[0]; i++) {
+
51 auto a_tile = a.tile(dr::index<I>(i, 0));
+
52
+
53 auto a_iter = a_tile.begin();
+
54 auto b_iter = dr::ranges::local(local_b[i].begin());
+
55 auto c_iter = dr::ranges::local(c.segments()[i].begin());
+
56
+
57 auto &&q = __detail::queue(a_tile.rank());
+
58
+
59 auto event = q.submit([&](auto &&h) {
+
60 h.depends_on(copy_events[a_tile.rank()]);
+
61 h.parallel_for(a_tile.size(), [=](auto idx) {
+
62 auto &&[index, a_v] = *(a_iter + idx);
+
63 auto &&[i, k] = index;
+
64 auto &&b_v = *(b_iter + k);
+
65 auto &&c_v = *(c_iter + i);
+
66 sycl::atomic_ref<T, sycl::memory_order::relaxed,
+
67 sycl::memory_scope::device>
+
68 c_ref(c_v);
+
69 c_ref += a_v * b_v;
+
70 });
+
71 });
+
72 comp_events.push_back(event);
+
73 }
+
74
+
75 __detail::wait(comp_events);
+
76}
+
77
+
78template <dr::distributed_range C, typename T, typename I,
+ +
80void gemv(C &&c, dr::sp::sparse_matrix<T, I> &a, B &&b,
+
81 sp::duplicated_vector<rng::range_value_t<B>> &scratch) {
+
82 assert(a.shape()[0] == c.size());
+
83 assert(a.shape()[1] == b.size());
+
84 assert(a.grid_shape()[0] == c.segments().size());
+
85 assert(a.grid_shape()[1] == 1);
+
86
+
87 auto &&b_duplicated = scratch;
+
88
+
89 std::vector<sycl::event> copy_events;
+
90 std::vector<sycl::event> comp_events;
+
91 copy_events.reserve(sp::nprocs());
+
92 comp_events.reserve(a.grid_shape()[0]);
+
93
+
94 for (std::size_t i = 0; i < sp::nprocs(); i++) {
+
95 auto &&l_b = b_duplicated.local_vector(i);
+
96 auto event = dr::sp::copy_async(b.begin(), b.end(), l_b.begin());
+
97 copy_events.push_back(event);
+
98 }
+
99
+
100 for (std::size_t i = 0; i < a.grid_shape()[0]; i++) {
+
101 auto a_tile = a.tile(dr::index<I>(i, 0));
+
102
+
103 auto b_iter =
+
104 dr::ranges::local(b_duplicated.local_vector(a_tile.rank()).begin());
+
105 auto c_iter = dr::ranges::local(c.segments()[i].begin());
+
106
+
107 assert(c.segments()[i].size() == a_tile.shape()[0]);
+
108 auto &&q = __detail::queue(a_tile.rank());
+
109
+
110 auto event = __detail::local_gemv(q, a_tile, b_iter, c_iter,
+
111 {copy_events[a_tile.rank()]});
+
112 comp_events.push_back(event);
+
113 }
+
114
+
115 __detail::wait(comp_events);
+
116}
+
117
+
118template <dr::distributed_range C, typename T, typename I,
+ +
120void gemv(C &&c, dr::sp::sparse_matrix<T, I> &a, B &&b) {
+ +
122
+
123 gemv(c, a, b, b_duplicated);
+
124}
+
125
+
126template <dr::distributed_range C, typename T, typename I,
+ +
128void gemv_square(C &&c, dr::sp::sparse_matrix<T, I> &a, B &&b) {
+
129 assert(a.shape()[0] == c.size());
+
130 assert(a.shape()[1] == b.size());
+
131 assert(a.grid_shape()[0] == c.segments().size());
+
132 assert(a.grid_shape()[1] == b.segments().size());
+
133
+
134 std::vector<sycl::event> events;
+
135
+
136 for (std::size_t i = 0; i < a.grid_shape()[0]; i++) {
+
137 std::size_t k_offset = i;
+
138 for (std::size_t k_ = 0; k_ < a.grid_shape()[1]; k_++) {
+
139 std::size_t k = (k_ + k_offset) % a.grid_shape()[1];
+
140 auto a_tile = a.tile(dr::index<I>(i, k));
+
141 auto b_segment = b.segments()[k];
+
142 auto c_segment = c.segments()[i];
+
143
+
144 auto b_iter = dr::ranges::local(b_segment.begin());
+
145 auto c_iter = dr::ranges::local(c_segment.begin());
+
146
+
147 auto &&q = __detail::queue(a_tile.rank());
+
148
+
149 auto event = __detail::custom_gemv(q, a_tile, b_iter, c_iter);
+
150 events.push_back(event);
+
151 }
+
152 }
+
153
+
154 __detail::wait(events);
+
155}
+
156
+
157template <dr::distributed_range C, typename T, typename I,
+ +
159void gemv_square_copy(C &&c, dr::sp::sparse_matrix<T, I> &a, B &&b) {
+
160 assert(a.shape()[0] == c.size());
+
161 assert(a.shape()[1] == b.size());
+
162 assert(a.grid_shape()[0] == c.segments().size());
+
163 assert(a.grid_shape()[1] == b.segments().size());
+
164
+
165 auto &&devices = dr::sp::devices();
+
166
+
167 using b_scalar_type = rng::range_value_t<B>;
+
168
+
169 using local_vector_type =
+
170 dr::sp::device_vector<b_scalar_type,
+ +
172
+
173 std::vector<local_vector_type> local_b;
+
174 std::vector<sycl::event> events;
+
175
+
176 local_b.reserve(a.grid_shape()[0]);
+
177
+
178 for (std::size_t i = 0; i < a.grid_shape()[0]; i++) {
+ +
180 dr::sp::context(), devices[a.tile(dr::index<I>(i, 0)).rank()]);
+
181 local_b.emplace_back(b.size(), allocator,
+
182 a.tile(dr::index<I>(i, 0)).rank());
+
183 }
+
184
+
185 for (std::size_t i = 0; i < a.grid_shape()[0]; i++) {
+
186 std::size_t k_offset = i;
+
187 for (std::size_t k_ = 0; k_ < a.grid_shape()[1]; k_++) {
+
188 std::size_t k = (k_ + k_offset) % a.grid_shape()[1];
+
189 auto a_tile = a.tile({i, k});
+
190 auto b_iter = local_b[i].begin() + (k * a.tile_shape()[1]);
+
191 auto c_iter = c.segments()[i].begin();
+
192
+
193 auto &&b_segment = b.segments()[k];
+
194 auto &&q = __detail::queue(a_tile.rank());
+
195
+
196 auto ce =
+
197 dr::sp::copy_async(q, b_segment.begin(), b_segment.end(), b_iter);
+
198
+
199 auto event = __detail::custom_gemv(q, a_tile, b_iter.local(),
+
200 c_iter.local(), {ce});
+
201
+
202 events.push_back(event);
+
203 }
+
204 }
+
205
+
206 __detail::wait(events);
+
207}
+
208
+
209} // namespace dr::sp
+
Definition: index.hpp:34
+
Definition: allocators.hpp:20
+
Definition: device_vector.hpp:13
+
Definition: duplicated_vector.hpp:13
+
Definition: sparse_matrix.hpp:135
+
Definition: concepts.hpp:20
+
+ + + + diff --git a/doxygen/generate__random_8hpp_source.html b/doxygen/generate__random_8hpp_source.html new file mode 100644 index 0000000000..5c23582aa0 --- /dev/null +++ b/doxygen/generate__random_8hpp_source.html @@ -0,0 +1,178 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/util/generate_random.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
generate_random.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <concepts>
+
8#include <dr/sp/views/csr_matrix_view.hpp>
+
9#include <map>
+
10#include <random>
+
11
+
12namespace dr::sp {
+
13
+
14namespace {
+
15
+
16template <typename T> struct uniform_distribution {
+
17 using type = std::uniform_int_distribution<T>;
+
18};
+
19
+
20template <std::floating_point T> struct uniform_distribution<T> {
+
21 using type = std::uniform_real_distribution<T>;
+
22};
+
23
+
24template <typename T>
+
25using uniform_distribution_t = typename uniform_distribution<T>::type;
+
26
+
27} // namespace
+
28
+
29template <typename T = float, std::integral I = std::size_t>
+
30auto generate_random_csr(dr::index<I> shape, double density = 0.01,
+
31 unsigned int seed = 0) {
+
32
+
33 assert(density >= 0.0 && density < 1.0);
+
34
+
35 std::map<std::pair<I, I>, T> tuples;
+
36
+
37 std::size_t nnz = density * shape[0] * shape[1];
+
38
+
39 std::mt19937 gen(seed);
+
40 std::uniform_int_distribution<I> row(0, shape[0] - 1);
+
41 std::uniform_int_distribution<I> column(0, shape[1] - 1);
+
42
+
43 uniform_distribution_t<T> value_gen(0, 1);
+
44
+
45 while (tuples.size() < nnz) {
+
46 auto i = row(gen);
+
47 auto j = column(gen);
+
48 if (tuples.find({i, j}) == tuples.end()) {
+
49 T value = value_gen(gen);
+
50 tuples.insert({{i, j}, value});
+
51 }
+
52 }
+
53
+
54 T *values = new T[nnz];
+
55 I *rowptr = new I[shape[0] + 1];
+
56 I *colind = new I[nnz];
+
57
+
58 rowptr[0] = 0;
+
59
+
60 std::size_t r = 0;
+
61 std::size_t c = 0;
+
62 for (auto iter = tuples.begin(); iter != tuples.end(); ++iter) {
+
63 auto &&[index, value] = *iter;
+
64 auto &&[i, j] = index;
+
65
+
66 values[c] = value;
+
67 colind[c] = j;
+
68
+
69 while (r < i) {
+
70 if (r + 1 > shape[0]) {
+
71 // TODO: exception?
+
72 // throw std::runtime_error("csr_matrix_impl_: given invalid matrix");
+
73 }
+
74 rowptr[r + 1] = c;
+
75 r++;
+
76 }
+
77 c++;
+
78
+
79 if (c > nnz) {
+
80 // TODO: exception?
+
81 // throw std::runtime_error("csr_matrix_impl_: given invalid matrix");
+
82 }
+
83 }
+
84
+
85 for (; r < shape[0]; r++) {
+
86 rowptr[r + 1] = nnz;
+
87 }
+
88
+
89 return csr_matrix_view(values, rowptr, colind, shape, nnz, 0);
+
90}
+
91
+
92} // namespace dr::sp
+
Definition: index.hpp:34
+
+ + + + diff --git a/doxygen/global_8hpp_source.html b/doxygen/global_8hpp_source.html new file mode 100644 index 0000000000..edcbeb5d32 --- /dev/null +++ b/doxygen/global_8hpp_source.html @@ -0,0 +1,306 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/global.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
global.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7// File with initialization/cleanup functions, global objects created during
+
8// initialization and helper functions using these objects. For general helper
+
9// functions see sycl_support.hpp and common_support.hpp
+
10
+
11#include <unistd.h>
+
12
+
13#include <dr/detail/sycl_utils.hpp>
+
14#include <dr/mp/sycl_support.hpp>
+
15
+
16namespace dr::mp {
+
17
+
18namespace __detail {
+
19
+ +
21 void init() {
+
22 void *data = nullptr;
+
23 std::size_t size = 0;
+
24 if (comm_.rank() == 0) {
+
25 root_scratchpad_.resize(scratchpad_size_);
+
26 data = root_scratchpad_.data();
+
27 size = rng::size(root_scratchpad_) * sizeof(root_scratchpad_[0]);
+
28 }
+
29 root_win_.create(comm_, data, size);
+
30 root_win_.fence();
+
31 }
+
32
+ +
34 root_win_.fence();
+
35 root_win_.free();
+
36 }
+
37
+
38 global_context() { init(); }
+
39#ifdef SYCL_LANGUAGE_VERSION
+
40 global_context(sycl::queue q, sycl::usm::alloc kind)
+
41 : sycl_queue_(q), sycl_mem_kind_(kind), dpl_policy_(q), use_sycl_(true) {
+
42 init();
+
43 }
+
44
+
45 sycl::queue sycl_queue_;
+
46 sycl::usm::alloc sycl_mem_kind_;
+
47 decltype(oneapi::dpl::execution::make_device_policy(
+
48 std::declval<sycl::queue>())) dpl_policy_;
+
49#endif
+
50
+
51 static constexpr std::size_t scratchpad_size_ = 1000000;
+
52 bool use_sycl_ = false;
+
53 dr::communicator comm_;
+
54 // container owns the window, we just track MPI handle
+
55 std::set<MPI_Win> wins_;
+
56 dr::rma_window root_win_;
+
57 std::vector<char> root_scratchpad_;
+
58};
+
59
+
60inline global_context *global_context_ = nullptr;
+
61
+
62inline bool finalized_ = false;
+
63inline bool we_initialized_mpi_ = false;
+
64
+
65inline auto gcontext() {
+
66 assert(global_context_ && "Call mp::init() after MPI_Init()");
+
67 return global_context_;
+
68}
+
69
+
70// Initialize MPI if not already initialized.
+
71inline void initialize_mpi() {
+
72 int initialized;
+
73 MPI_Initialized(&initialized);
+
74 if (!initialized) {
+
75 DRLOG("initializing MPI");
+
76 MPI_Init(nullptr, nullptr);
+
77 we_initialized_mpi_ = true;
+
78 } else {
+
79 DRLOG("initializing MPI skipped - already initialized");
+
80 }
+
81
+
82#ifdef DRISHMEM
+
83 DRLOG("calling ishmem_init()");
+
84 ishmem_init();
+
85#endif
+
86}
+
87
+
88// Finalize MPI *if* we initialized it and it has not been finalized.
+
89inline void finalize_mpi() {
+
90 int finalized;
+
91 MPI_Finalized(&finalized);
+
92
+
93 if (we_initialized_mpi_ && !finalized) {
+
94 MPI_Finalize();
+
95 }
+
96
+
97#ifdef DRISHMEM
+
98 DRLOG("calling ishmem_finalize()");
+
99 ishmem_finalize();
+
100#endif
+
101}
+
102
+
103} // namespace __detail
+
104
+
105inline auto root_win() { return __detail::gcontext()->root_win_; }
+
106inline dr::communicator &default_comm() { return __detail::gcontext()->comm_; }
+
107
+
108inline bool finalized() { return __detail::finalized_; }
+
109inline std::size_t rank() { return default_comm().rank(); }
+
110inline std::size_t nprocs() { return default_comm().size(); } // dr-style ignore
+
111
+
112inline std::set<MPI_Win> &active_wins() { return __detail::gcontext()->wins_; }
+
113
+
114inline void barrier() { __detail::gcontext()->comm_.barrier(); }
+
115inline auto use_sycl() { return __detail::gcontext()->use_sycl_; }
+
116
+
117inline void fence() {
+
118#ifdef DRISHMEM
+
119 DRLOG("global fence in ISHMEM");
+
120 ishmem_fence();
+
121 DRLOG("global fence in ISHMEM finished");
+
122#endif
+
123 for (auto win : __detail::gcontext()->wins_) {
+
124 DRLOG("global fence, for window:{}", win);
+
125 MPI_Win_fence(0, win);
+
126 }
+
127 DRLOG("global fence finished");
+
128}
+
129
+
130inline void init() {
+
131 __detail::initialize_mpi();
+
132 assert(__detail::global_context_ == nullptr &&
+
133 "Do not call mp::init() more than once");
+
134 __detail::global_context_ = new __detail::global_context;
+
135}
+
136
+
137inline void finalize() {
+
138 assert(__detail::global_context_ != nullptr);
+
139 delete __detail::global_context_;
+
140 __detail::global_context_ = nullptr;
+
141 __detail::finalize_mpi();
+
142 __detail::finalized_ = true;
+
143}
+
144
+
145inline std::string hostname() {
+
146 constexpr std::size_t MH = 2048;
+
147 char buf[MH + 1];
+
148 gethostname(buf, MH);
+
149 return std::string(buf);
+
150}
+
151
+
152#ifdef SYCL_LANGUAGE_VERSION
+
153inline sycl::queue &sycl_queue() { return __detail::gcontext()->sycl_queue_; }
+
154inline auto sycl_mem_kind() { return __detail::gcontext()->sycl_mem_kind_; }
+
155inline auto dpl_policy() { return __detail::gcontext()->dpl_policy_; }
+
156
+
157inline sycl::queue select_queue(bool check_different_devices = false) {
+
158 std::vector<sycl::device> devices;
+
159
+
160 auto root_devices = sycl::platform().get_devices();
+
161
+
162 for (auto &&root_device : root_devices) {
+
163 dr::drlog.debug("Root device: {}\n",
+
164 root_device.get_info<sycl::info::device::name>());
+
165 if (dr::__detail::partitionable(root_device)) {
+
166 auto subdevices = root_device.create_sub_devices<
+
167 sycl::info::partition_property::partition_by_affinity_domain>(
+
168 sycl::info::partition_affinity_domain::numa);
+
169 assert(rng::size(subdevices) > 0);
+
170
+
171 for (auto &&subdevice : subdevices) {
+
172 dr::drlog.debug(" add subdevice: {}\n",
+
173 subdevice.get_info<sycl::info::device::name>());
+
174 devices.push_back(subdevice);
+
175 }
+
176 } else {
+
177 dr::drlog.debug(" add root device: {}\n",
+
178 root_device.get_info<sycl::info::device::name>());
+
179 devices.push_back(root_device);
+
180 }
+
181 }
+
182
+
183 assert(rng::size(devices) > 0);
+
184 const auto my_rank = dr::communicator(MPI_COMM_WORLD).rank();
+
185 assert(!check_different_devices || my_rank < rng::size(devices));
+
186
+
187 // Round robin assignment of devices to ranks
+
188 return sycl::queue(devices[my_rank % rng::size(devices)]);
+
189}
+
190
+
191inline void init(sycl::queue q,
+
192 sycl::usm::alloc kind = sycl::usm::alloc::shared) {
+
193 __detail::initialize_mpi();
+
194 assert(__detail::global_context_ == nullptr &&
+
195 "Do not call mp::init() more than once");
+
196 __detail::global_context_ = new __detail::global_context(q, kind);
+
197}
+
198
+
199template <typename Selector = decltype(sycl::default_selector_v)>
+
200inline void init(Selector &&selector = sycl::default_selector_v) {
+
201 __detail::initialize_mpi();
+
202 sycl::queue q = mp::select_queue();
+
203 init(q);
+
204}
+
205
+
206#else // SYCL_LANGUAGE_VERSION
+
207inline auto sycl_queue() {
+
208 assert(false);
+
209 return 0;
+
210}
+
211inline const auto &dpl_policy() {
+
212 assert(false);
+
213 return std::execution::seq;
+
214}
+
215
+
216#endif // SYCL_LANGUAGE_VERSION
+
217
+
218} // namespace dr::mp
+
Definition: communicator.hpp:13
+
Definition: communicator.hpp:230
+
Definition: global.hpp:20
+
+ + + + diff --git a/doxygen/graph_legend.html b/doxygen/graph_legend.html new file mode 100644 index 0000000000..e0d50dc038 --- /dev/null +++ b/doxygen/graph_legend.html @@ -0,0 +1,141 @@ + + + + + + + +Distributed Ranges: Graph Legend + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+

The boxes in the above graph have the following meaning:

+ +

The arrows have the following meaning:

+ +
+ + + + diff --git a/doxygen/graph_legend.md5 b/doxygen/graph_legend.md5 new file mode 100644 index 0000000000..76a6899d6e --- /dev/null +++ b/doxygen/graph_legend.md5 @@ -0,0 +1 @@ +68a0ee42d4e53d2fb70be66ebb5b1abe \ No newline at end of file diff --git a/doxygen/graph_legend.png b/doxygen/graph_legend.png new file mode 100644 index 0000000000..a235eb6ca7 Binary files /dev/null and b/doxygen/graph_legend.png differ diff --git a/doxygen/halo_8hpp_source.html b/doxygen/halo_8hpp_source.html new file mode 100644 index 0000000000..23ceac04fd --- /dev/null +++ b/doxygen/halo_8hpp_source.html @@ -0,0 +1,528 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/halo.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
halo.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/mp/global.hpp>
+
8#include <dr/mp/sycl_support.hpp>
+
9
+
10namespace dr::mp {
+
11
+
12enum class halo_tag {
+
13 invalid,
+
14 forward,
+
15 reverse,
+
16 index,
+
17};
+
18
+
19template <typename Group> class halo_impl {
+
20 using T = typename Group::element_type;
+
21 using Memory = typename Group::memory_type;
+
22
+
23public:
+
24 using group_type = Group;
+
25
+
26 // Destructor frees buffer_, so cannot copy
+
27 halo_impl(const halo_impl &) = delete;
+
28 halo_impl operator=(const halo_impl &) = delete;
+
29
+
31 halo_impl(communicator comm, const std::vector<Group> &owned_groups,
+
32 const std::vector<Group> &halo_groups,
+
33 const Memory &memory = Memory())
+
34 : comm_(comm), halo_groups_(halo_groups), owned_groups_(owned_groups),
+
35 memory_(memory) {
+
36 DRLOG("Halo constructed with {}/{} owned/halo", rng::size(owned_groups),
+
37 rng::size(halo_groups));
+
38 buffer_size_ = 0;
+
39 std::size_t i = 0;
+
40 std::vector<std::size_t> buffer_index;
+
41 for (auto &g : owned_groups_) {
+
42 buffer_index.push_back(buffer_size_);
+
43 g.request_index = i++;
+
44 buffer_size_ += g.buffer_size();
+
45 map_.push_back(&g);
+
46 }
+
47 for (auto &g : halo_groups_) {
+
48 buffer_index.push_back(buffer_size_);
+
49 g.request_index = i++;
+
50 buffer_size_ += g.buffer_size();
+
51 map_.push_back(&g);
+
52 }
+
53 buffer_ = memory_.allocate(buffer_size_);
+
54 assert(buffer_ != nullptr);
+
55 i = 0;
+
56 for (auto &g : owned_groups_) {
+
57 g.buffer = &buffer_[buffer_index[i++]];
+
58 }
+
59 for (auto &g : halo_groups_) {
+
60 g.buffer = &buffer_[buffer_index[i++]];
+
61 }
+
62 requests_.resize(i);
+
63 }
+
64
+ +
67 DRLOG("Halo exchange receiving");
+
68 receive(halo_groups_);
+
69 DRLOG("Halo exchange sending");
+
70 send(owned_groups_);
+
71 DRLOG("Halo exchange begin finished");
+
72 }
+
73
+ +
76 DRLOG("Halo exchange finalize started");
+ +
78 DRLOG("Halo exchange finalize finished");
+
79 }
+
80
+
81 void exchange() {
+ + +
84 }
+
85
+
87 void reduce_begin() {
+
88 receive(owned_groups_);
+
89 send(halo_groups_);
+
90 }
+
91
+
93 void reduce_finalize(const auto &op) {
+
94 for (int pending = rng::size(requests_); pending > 0; pending--) {
+
95 int completed;
+
96 MPI_Waitany(rng::size(requests_), requests_.data(), &completed,
+
97 MPI_STATUS_IGNORE);
+
98 DRLOG("reduce_finalize(op) waitany completed: {}", completed);
+
99 auto &g = *map_[completed];
+
100 if (g.receive && g.buffered) {
+
101 g.unpack(op);
+
102 }
+
103 }
+
104 }
+
105
+ +
108 for (int pending = rng::size(requests_); pending > 0; pending--) {
+
109 int completed;
+
110 MPI_Waitany(rng::size(requests_), requests_.data(), &completed,
+
111 MPI_STATUS_IGNORE);
+
112 DRLOG("reduce_finalize() waitany completed: {}", completed);
+
113 auto &g = *map_[completed];
+
114 if (g.receive && g.buffered) {
+
115 g.unpack();
+
116 }
+
117 }
+
118 }
+
119
+
120 struct second_op {
+
121 T operator()(T &a, T &b) const { return b; }
+
122 } second;
+
123
+
124 struct plus_op {
+
125 T operator()(T &a, T &b) const { return a + b; }
+
126 } plus;
+
127
+
128 struct max_op {
+
129 T operator()(T &a, T &b) const { return std::max(a, b); }
+
130 } max;
+
131
+
132 struct min_op {
+
133 T operator()(T &a, T &b) const { return std::min(a, b); }
+
134 } min;
+
135
+ +
137 T operator()(T &a, T &b) const { return a * b; }
+
138 } multiplies;
+
139
+
140 ~halo_impl() {
+
141 if (buffer_) {
+
142 memory_.deallocate(buffer_, buffer_size_);
+
143 buffer_ = nullptr;
+
144 }
+
145 }
+
146
+
147private:
+
148 void send(std::vector<Group> &sends) {
+
149 for (auto &g : sends) {
+
150 g.pack();
+
151 g.receive = false;
+
152 DRLOG("sending: {}", g.request_index);
+
153 comm_.isend(g.data_pointer(), g.data_size(), g.rank(), g.tag(),
+
154 &requests_[g.request_index]);
+
155 }
+
156 }
+
157
+
158 void receive(std::vector<Group> &receives) {
+
159 for (auto &g : receives) {
+
160 g.receive = true;
+
161 DRLOG("receiving: {}", g.request_index);
+
162 comm_.irecv(g.data_pointer(), g.data_size(), g.rank(), g.tag(),
+
163 &requests_[g.request_index]);
+
164 }
+
165 }
+
166
+
167 communicator comm_;
+
168 std::vector<Group> halo_groups_, owned_groups_;
+
169 T *buffer_ = nullptr;
+
170 std::size_t buffer_size_;
+
171 std::vector<MPI_Request> requests_;
+
172 std::vector<Group *> map_;
+
173 Memory memory_;
+
174};
+
175
+
176template <typename T, typename Memory = default_memory<T>> class index_group {
+
177public:
+
178 using element_type = T;
+
179 using memory_type = Memory;
+
180 T *buffer = nullptr;
+
181 std::size_t request_index;
+
182 bool receive;
+
183 bool buffered;
+
184
+
186 index_group(T *data, std::size_t rank,
+
187 const std::vector<std::size_t> &indices, const Memory &memory)
+
188 : memory_(memory), data_(data), rank_(rank) {
+
189 buffered = false;
+
190 for (std::size_t i = 0; i < rng::size(indices) - 1; i++) {
+
191 buffered = buffered || (indices[i + 1] - indices[i] != 1);
+
192 }
+
193 indices_size_ = rng::size(indices);
+
194 indices_ = memory_.template allocate<std::size_t>(indices_size_);
+
195 assert(indices_ != nullptr);
+
196 memory_.memcpy(indices_, indices.data(),
+
197 indices_size_ * sizeof(std::size_t));
+
198 }
+
199
+
200 index_group(const index_group &o)
+
201 : buffer(o.buffer), request_index(o.request_index), receive(o.receive),
+
202 buffered(o.buffered), memory_(o.memory_), data_(o.data_),
+
203 rank_(o.rank_), indices_size_(o.indices_size_), tag_(o.tag_) {
+
204 indices_ = memory_.template allocate<std::size_t>(indices_size_);
+
205 assert(indices_ != nullptr);
+
206 memory_.memcpy(indices_, o.indices_, indices_size_ * sizeof(std::size_t));
+
207 }
+
208
+
209 void unpack(const auto &op) {
+
210 T *dpt = data_;
+
211 auto n = indices_size_;
+
212 auto *ipt = indices_;
+
213 auto *b = buffer;
+
214 memory_.offload([=]() {
+
215 for (std::size_t i = 0; i < n; i++) {
+
216 dpt[ipt[i]] = op(dpt[ipt[i]], b[i]);
+
217 }
+
218 });
+
219 }
+
220
+
221 void pack() {
+
222 T *dpt = data_;
+
223 auto n = indices_size_;
+
224 auto *ipt = indices_;
+
225 auto *b = buffer;
+
226 memory_.offload([=]() {
+
227 for (std::size_t i = 0; i < n; i++) {
+
228 b[i] = dpt[ipt[i]];
+
229 }
+
230 });
+
231 }
+
232
+
233 std::size_t buffer_size() {
+
234 if (buffered) {
+
235 return indices_size_;
+
236 }
+
237 return 0;
+
238 }
+
239
+
240 T *data_pointer() {
+
241 if (buffered) {
+
242 return buffer;
+
243 } else {
+
244 return &data_[indices_[0]];
+
245 }
+
246 }
+
247
+
248 std::size_t data_size() { return indices_size_; }
+
249
+
250 std::size_t rank() { return rank_; }
+
251 auto tag() { return tag_; }
+
252
+
253 ~index_group() {
+
254 if (indices_) {
+
255 memory_.template deallocate<std::size_t>(indices_, indices_size_);
+
256 indices_ = nullptr;
+
257 }
+
258 }
+
259
+
260private:
+
261 Memory memory_;
+
262 T *data_ = nullptr;
+
263 std::size_t rank_;
+
264 std::size_t indices_size_;
+
265 std::size_t *indices_;
+
266 halo_tag tag_ = halo_tag::index;
+
267};
+
268
+
269template <typename T, typename Memory>
+
270using unstructured_halo_impl = halo_impl<index_group<T, Memory>>;
+
271
+
272template <typename T, typename Memory = default_memory<T>>
+
273class unstructured_halo : public unstructured_halo_impl<T, Memory> {
+
274public:
+ +
276 using index_map = std::pair<std::size_t, std::vector<std::size_t>>;
+
277
+ +
282 const std::vector<index_map> &owned,
+
283 const std::vector<index_map> &halo,
+
284 const Memory &memory = Memory())
+
285 : unstructured_halo_impl<T, Memory>(
+
286 comm, make_groups(comm, data, owned, memory),
+
287 make_groups(comm, data, halo, memory), memory) {}
+
288
+
289private:
+
290 static std::vector<group_type> make_groups(communicator comm, T *data,
+
291 const std::vector<index_map> &map,
+
292 const Memory &memory) {
+
293 std::vector<group_type> groups;
+
294 for (auto const &[rank, indices] : map) {
+
295 groups.emplace_back(data, rank, indices, memory);
+
296 }
+
297 return groups;
+
298 }
+
299};
+
300
+
301template <typename T, typename Memory = default_memory<T>> class span_group {
+
302public:
+
303 using element_type = T;
+
304 using memory_type = Memory;
+
305 T *buffer = nullptr;
+
306 std::size_t request_index = 0;
+
307 bool receive = false;
+
308 bool buffered = false;
+
309
+
310 span_group(std::span<T> data, std::size_t rank, halo_tag tag)
+
311 : data_(data), rank_(rank), tag_(tag) {
+
312#ifdef SYCL_LANGUAGE_VERSION
+
313 if (use_sycl() && sycl_mem_kind() == sycl::usm::alloc::shared) {
+
314 buffered = true;
+
315 }
+
316#endif
+
317 }
+
318
+
319 void unpack() {
+
320 if (buffered) {
+
321 if (mp::use_sycl()) {
+
322 __detail::sycl_copy(buffer, buffer + rng::size(data_), data_.data());
+
323 } else {
+
324 std::copy(buffer, buffer + rng::size(data_), data_.data());
+
325 }
+
326 }
+
327 }
+
328
+
329 void pack() {
+
330 if (buffered) {
+
331 if (mp::use_sycl()) {
+
332 __detail::sycl_copy(data_.data(), data_.data() + rng::size(data_),
+
333 buffer);
+
334 } else {
+
335 std::copy(data_.begin(), data_.end(), buffer);
+
336 }
+
337 }
+
338 }
+
339 std::size_t buffer_size() { return rng::size(data_); }
+
340
+
341 std::size_t data_size() { return rng::size(data_); }
+
342
+
343 T *data_pointer() {
+
344 if (buffered) {
+
345 return buffer;
+
346 } else {
+
347 return data_.data();
+
348 }
+
349 }
+
350
+
351 std::size_t rank() { return rank_; }
+
352
+
353 auto tag() { return tag_; }
+
354
+
355private:
+
356 Memory memory_;
+
357 std::span<T> data_;
+
358 std::size_t rank_;
+
359 halo_tag tag_ = halo_tag::invalid;
+
360};
+
361
+ +
363 std::size_t prev = 0, next = 0;
+
364 bool periodic = false;
+
365};
+
366
+
367template <typename T, typename Memory>
+ +
369
+
370template <typename T, typename Memory = default_memory<T>>
+
371class span_halo : public span_halo_impl<T, Memory> {
+
372public:
+ +
374
+ +
376
+
377 span_halo(communicator comm, T *data, std::size_t size, halo_bounds hb)
+
378 : span_halo_impl<T, Memory>(comm, owned_groups(comm, {data, size}, hb),
+
379 halo_groups(comm, {data, size}, hb)) {
+
380 check(size, hb);
+
381 }
+
382
+
383 span_halo(communicator comm, std::span<T> span, halo_bounds hb)
+
384 : span_halo_impl<T, Memory>(comm, owned_groups(comm, span, hb),
+
385 halo_groups(comm, span, hb)) {}
+
386
+
387private:
+
388 void check(auto size, auto hb) {
+
389 assert(size >= hb.prev + hb.next + std::max(hb.prev, hb.next));
+
390 }
+
391
+
392 static std::vector<group_type>
+
393 owned_groups(communicator comm, std::span<T> span, halo_bounds hb) {
+
394 std::vector<group_type> owned;
+
395 DRLOG("owned groups {}/{} first/last", comm.first(), comm.last());
+
396 if (hb.next > 0 && (hb.periodic || !comm.first())) {
+
397 owned.emplace_back(span.subspan(hb.prev, hb.next), comm.prev(),
+
398 halo_tag::reverse);
+
399 }
+
400 if (hb.prev > 0 && (hb.periodic || !comm.last())) {
+
401 owned.emplace_back(
+
402 span.subspan(rng::size(span) - (hb.prev + hb.next), hb.prev),
+
403 comm.next(), halo_tag::forward);
+
404 }
+
405 return owned;
+
406 }
+
407
+
408 static std::vector<group_type>
+
409 halo_groups(communicator comm, std::span<T> span, halo_bounds hb) {
+
410 std::vector<group_type> halo;
+
411 if (hb.prev > 0 && (hb.periodic || !comm.first())) {
+
412 halo.emplace_back(span.first(hb.prev), comm.prev(), halo_tag::forward);
+
413 }
+
414 if (hb.next > 0 && (hb.periodic || !comm.last())) {
+
415 halo.emplace_back(span.last(hb.next), comm.next(), halo_tag::reverse);
+
416 }
+
417 return halo;
+
418 }
+
419};
+
420
+
421} // namespace dr::mp
+
422
+
423#ifdef DR_FORMAT
+
424
+
425template <>
+
426struct fmt::formatter<dr::mp::halo_bounds> : formatter<string_view> {
+
427 template <typename FmtContext>
+
428 auto format(dr::mp::halo_bounds hb, FmtContext &ctx) {
+
429 return fmt::format_to(ctx.out(), "prev: {} next: {}", hb.prev, hb.next);
+
430 }
+
431};
+
432
+
433#endif
+
Definition: communicator.hpp:13
+
Definition: halo.hpp:19
+
void reduce_finalize(const auto &op)
Complete a halo reduction.
Definition: halo.hpp:93
+
void reduce_begin()
Begin a halo reduction.
Definition: halo.hpp:87
+
void reduce_finalize()
Complete a halo reduction.
Definition: halo.hpp:107
+
void exchange_begin()
Begin a halo exchange.
Definition: halo.hpp:66
+
halo_impl(communicator comm, const std::vector< Group > &owned_groups, const std::vector< Group > &halo_groups, const Memory &memory=Memory())
halo constructor
Definition: halo.hpp:31
+
void exchange_finalize()
Complete a halo exchange.
Definition: halo.hpp:75
+
Definition: halo.hpp:176
+
index_group(T *data, std::size_t rank, const std::vector< std::size_t > &indices, const Memory &memory)
Constructor.
Definition: halo.hpp:186
+
Definition: halo.hpp:301
+
Definition: halo.hpp:371
+
Definition: halo.hpp:273
+
unstructured_halo(communicator comm, T *data, const std::vector< index_map > &owned, const std::vector< index_map > &halo, const Memory &memory=Memory())
Definition: halo.hpp:281
+
Definition: halo.hpp:362
+
Definition: halo.hpp:128
+
Definition: halo.hpp:132
+
Definition: halo.hpp:136
+
Definition: halo.hpp:124
+
Definition: halo.hpp:120
+
+ + + + diff --git a/doxygen/hierarchy.html b/doxygen/hierarchy.html new file mode 100644 index 0000000000..3e14b193d4 --- /dev/null +++ b/doxygen/hierarchy.html @@ -0,0 +1,236 @@ + + + + + + + +Distributed Ranges: Class Hierarchy + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
+

Go to the graphical class hierarchy

+This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Cdr::mp::__detail::allocator< T >
 Cdr::mp::__detail::any
 CBaseSegment
 Cdr::mp::__detail::buffer< T >
 Cdr::sp::buffered_allocator< Allocator >
 Cdr::communicator
 Cdr::sp::__detail::coo_matrix< T, I, Allocator >
 Cdr::mp::count_fn_
 Cdr::mp::count_if_fn_
 Cdr::sp::csr_matrix_view_accessor< T, I, TIter, IIter >
 Cdr::default_memory< T >
 Cdr::sp::dense_matrix< T, Allocator >
 Cdr::sp::dense_matrix_accessor< T, Iter >
 Cdr::sp::dense_matrix_column_accessor< T, Iter >
 Cdr::sp::dense_matrix_column_view< T, Iter >
 Cdr::sp::dense_matrix_row_accessor< T, Iter >
 Cdr::sp::dense_matrix_row_view< T, Iter >
 Cdr::sp::device_allocator< T, Alignment >
 Cdr::mp::device_policy
 Cdr::sp::device_policy
 Cdr::sp::device_ptr< T >
 Cdr::sp::device_ref< T >
 Cdr::__detail::direct_iterator< Iter >
 Cdr::sp::distributed_dense_matrix< T >
 Cdr::sp::distributed_dense_matrix_accessor< T, L >
 Cdr::mp::distributed_mdarray< T, Rank >
 Cdr::sp::distributed_range_accessor< Segments >
 Cdr::sp::distributed_span_accessor< T, L >
 Cdr::mp::distributed_vector< T, BackendT >Distributed vector
 Cdr::sp::distributed_vector< T, Allocator >Distributed vector
 Cdr::sp::distributed_vector_accessor< T, L >
 Cdr::mp::distribution
 Cdr::sp::duplicated_vector< T, Allocator >
 Cdr::mp::dv_segment< DV >
 Cdr::mp::dv_segment_iterator< DV >
 Cdr::mp::dv_segment_reference< DV >
 Cdr::__detail::enumerate_adapter_closure
 Cdr::mp::views::enumerate_adapter_closure
 Cdr::sp::views::enumerate_adapter_closure
 Cdr::__detail::enumerate_fn_
 Cdr::mp::views::enumerate_fn_
 Cdr::sp::views::enumerate_fn_
 Cdr::__detail::event
 Cstd::false_type
 Cformatter
 Cdr::sp::future< T, Event >
 Cdr::mp::__detail::global_context
 Cdr::mp::halo_bounds
 Cdr::mp::halo_impl< Group >
 Cdr::sp::id< dimensions >
 Cdr::index< T >
 Cdr::index< I >
 Cdr::index< std::int64_t >
 Cdr::index< std::size_t >
 Cdr::mp::index_group< T, Memory >
 Cintegral_constant
 Cdr::views::iota_fn_
 Cdr::mp::distributed_vector< T, BackendT >::iterator
 Cdr::iterator_adaptor< Accessor >
 Cdr::ranges::__detail::local_fn_
 Cdr::logger
 Cdr::sp::matrix_entry< T, I >
 Cdr::sp::matrix_partition
 Cdr::sp::matrix_ref< T, I, TRef >
 Cdr::mp::halo_impl< Group >::max_op
 CMdspan
 Cdr::mp::views::mdspan_adapter_closure< Rank >
 Cdr::mp::views::mdspan_fn_
 Cdr::__detail::mdspan_iter_accessor< Iter >
 Cdr::mp::halo_impl< Group >::min_op
 Cdr::mp::MpiBackend
 Cdr::mp::halo_impl< Group >::multiplies_op
 Cdr::normal_distributed_iterator_accessor< V >
 Cdr::mp::halo_impl< Group >::plus_op
 Cdr::mp::views::__detail::range_size< R >
 Cdr::mp::views::__detail::range_size< R >
 Cdr::sp::device_allocator< T, Alignment >::rebind< U >
 Cdr::rma_window
 Cdr::mp::halo_impl< Group >::second_op
 Cdr::sp::segment_range< dimensions >
 Cdr::sp::segment_range_accessor
 Cdr::mp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >
 Cdr::sp::views::slice_adaptor_closure
 Cdr::mp::views::__detail::sliding_fn
 Cnostd::source_location
 Cdr::mp::span_group< T, Memory >
 Cdr::sp::sparse_matrix< T, I >
 Cdr::mp::views::submdspan_adapter_closure< Extents >
 Cdr::mp::views::submdspan_fn_
 Cranges::subrange
 Cdr::mp::subrange_iterator< DM >
 Cdr::timer
 Cdr::mp::__detail::tmp_buffer< T >
 Cdr::views::transform_adapter_closure< F >
 Cdr::views::transform_fn_
 Cdr::transform_iterator< Iter, F >
 Cstd::true_type
 Ctuple_element
 Cdr::sp::__detail::tuple_or_pair< Args >
 Cdr::sp::__detail::tuple_or_pair< T, U >
 Cdr::sp::vector< T, Allocator >
 Cdr::sp::vector< T, Allocator >
 Cranges::view_interface
 Cdr::sp::zip_accessor< Iters >
 Cdr::mp::zip_iterator< RngIter, BaseIters >
+
+
+ + + + diff --git a/doxygen/inclusive__exclusive__scan__impl_8hpp_source.html b/doxygen/inclusive__exclusive__scan__impl_8hpp_source.html new file mode 100644 index 0000000000..6591f3639d --- /dev/null +++ b/doxygen/inclusive__exclusive__scan__impl_8hpp_source.html @@ -0,0 +1,314 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/inclusive_exclusive_scan_impl.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
inclusive_exclusive_scan_impl.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#ifdef SYCL_LANGUAGE_VERSION
+
8#include <oneapi/dpl/async>
+
9#endif
+
10
+
11#include <dr/detail/sycl_utils.hpp>
+
12
+
13namespace dr::mp::__detail {
+
14
+
15namespace detail = dr::__detail;
+
16
+
17}
+
18
+
19namespace dr::mp::__detail {
+
20
+
21void local_inclusive_scan(auto policy, auto in, auto out, auto binary_op,
+
22 auto init, std::size_t seg_index) {
+
23 auto in_begin_direct = detail::direct_iterator(in.begin());
+
24 auto in_end_direct = detail::direct_iterator(in.end());
+
25 auto out_begin_direct = detail::direct_iterator(out.begin());
+
26 if (init && seg_index == 0) {
+
27 std::inclusive_scan(policy, in_begin_direct, in_end_direct,
+
28 out_begin_direct, binary_op, init.value());
+
29 } else {
+
30 std::inclusive_scan(policy, in_begin_direct, in_end_direct,
+
31 out_begin_direct, binary_op);
+
32 }
+
33}
+
34
+
35void local_exclusive_scan(auto policy, auto in, auto out, auto binary_op,
+
36 auto init, std::size_t seg_index) {
+
37 auto in_begin_direct = detail::direct_iterator(in.begin());
+
38 auto in_end_direct = detail::direct_iterator(in.end());
+
39 auto out_begin_direct = detail::direct_iterator(out.begin());
+
40
+
41 if (seg_index != 0) {
+
42 assert(rng::size(in) > 1);
+
43 assert(rng::size(out) > 1);
+
44 --in_end_direct;
+
45 ++out_begin_direct;
+
46 std::inclusive_scan(policy, in_begin_direct, in_end_direct,
+
47 out_begin_direct, binary_op);
+
48 } else {
+
49 assert(init.has_value());
+
50 std::exclusive_scan(policy, in_begin_direct, in_end_direct,
+
51 out_begin_direct, init.value(), binary_op);
+
52 }
+
53}
+
54
+
55template <bool is_exclusive, dr::distributed_contiguous_range R,
+
56 dr::distributed_iterator O, typename BinaryOp,
+
57 typename U = rng::range_value_t<R>>
+
58auto inclusive_exclusive_scan_impl_(R &&r, O &&d_first, BinaryOp &&binary_op,
+
59 std::optional<U> init = {}) {
+
60 using value_type = U;
+
61 assert(aligned(r, d_first));
+
62
+
63 bool use_sycl = mp::use_sycl();
+
64 auto comm = default_comm();
+
65
+
66 // for input vector, which may have segment of size 1, do sequential scan
+
67 if (rng::size(r) <= comm.size() * (comm.size() - 1) + 1) {
+
68 std::vector<value_type> vec_in(rng::size(r));
+
69 std::vector<value_type> vec_out(rng::size(r));
+
70 mp::copy(0, r, vec_in.begin());
+
71
+
72 if (comm.rank() == 0) {
+
73 if constexpr (is_exclusive) {
+
74 assert(init.has_value());
+
75 std::exclusive_scan(detail::direct_iterator(vec_in.begin()),
+
76 detail::direct_iterator(vec_in.end()),
+
77 detail::direct_iterator(vec_out.begin()),
+
78 init.value(), binary_op);
+
79 } else {
+
80 if (init.has_value()) {
+
81 std::inclusive_scan(detail::direct_iterator(vec_in.begin()),
+
82 detail::direct_iterator(vec_in.end()),
+
83 detail::direct_iterator(vec_out.begin()),
+
84 binary_op, init.value());
+
85 } else {
+
86 std::inclusive_scan(detail::direct_iterator(vec_in.begin()),
+
87 detail::direct_iterator(vec_in.end()),
+
88 detail::direct_iterator(vec_out.begin()),
+
89 binary_op);
+
90 }
+
91 }
+
92 }
+
93 mp::copy(0, vec_out, d_first);
+
94 return d_first + rng::size(r);
+
95 }
+
96
+
97 auto rank = comm.rank();
+
98 auto local_segs = rng::views::zip(local_segments(r), local_segments(d_first));
+
99 auto global_segs =
+
100 rng::views::zip(dr::ranges::segments(r), dr::ranges::segments(d_first));
+
101 std::size_t num_segs = std::size_t(rng::size(dr::ranges::segments(r)));
+
102
+
103 // Pass 1 local inclusive scan
+
104 std::size_t seg_index = 0;
+
105 for (auto global_seg : global_segs) {
+
106 auto [global_in, global_out] = global_seg;
+
107
+
108 if (dr::ranges::rank(global_in) == rank) {
+
109 auto local_in = dr::ranges::__detail::local(global_in);
+
110 auto local_out = dr::ranges::__detail::local(global_out);
+
111 if (use_sycl) {
+
112#ifdef SYCL_LANGUAGE_VERSION
+
113 if constexpr (is_exclusive) {
+
114 local_exclusive_scan(dpl_policy(), local_in, local_out, binary_op,
+
115 init, seg_index);
+
116 } else {
+
117 local_inclusive_scan(dpl_policy(), local_in, local_out, binary_op,
+
118 init, seg_index);
+
119 }
+
120#else
+
121 assert(false);
+
122#endif
+
123 } else {
+
124 if constexpr (is_exclusive) {
+
125 local_exclusive_scan(std::execution::par_unseq, local_in, local_out,
+
126 binary_op, init, seg_index);
+
127 } else {
+
128 local_inclusive_scan(std::execution::par_unseq, local_in, local_out,
+
129 binary_op, init, seg_index);
+
130 }
+
131 }
+
132 }
+
133
+
134 seg_index++;
+
135 }
+
136 // Pass 2 put partial sums on root
+
137 seg_index = 0;
+
138 auto win = root_win();
+
139 for (auto global_seg : global_segs) {
+
140 // Do not need last segment
+
141 if (seg_index == num_segs - 1) {
+
142 break;
+
143 }
+
144
+
145 auto [global_in, global_out] = global_seg;
+
146 if (dr::ranges::rank(global_in) == rank) {
+
147 auto local_out = dr::ranges::__detail::local(global_out);
+
148 auto local_in = dr::ranges::__detail::local(global_in);
+
149 rng::range_value_t<R> back;
+
150 if constexpr (is_exclusive) {
+
151 if (use_sycl) {
+
152 auto ret = sycl_get(local_out.back(), local_in.back());
+
153 back = binary_op(ret.first, ret.second);
+
154 } else {
+
155 back = binary_op(local_out.back(), local_in.back());
+
156 }
+
157 } else {
+
158 back = use_sycl ? sycl_get(local_out.back()) : local_out.back();
+
159 }
+
160
+
161 win.put(back, 0, seg_index);
+
162 }
+
163
+
164 seg_index++;
+
165 }
+
166 win.fence();
+
167
+
168 // Pass 3: scan of partial sums on root
+
169 if (rank == 0) {
+
170 value_type *partials = win.local_data<value_type>();
+
171 std::inclusive_scan(partials, partials + num_segs, partials, binary_op);
+
172 }
+
173 barrier();
+
174
+
175 // Pass 4: rebase
+
176 seg_index = 0;
+
177 for (auto global_seg : global_segs) {
+
178 if (seg_index > 0) {
+
179 auto [global_in, global_out] = global_seg;
+
180
+
181 auto offset = win.get<value_type>(0, seg_index - 1);
+
182 auto rebase = [offset, binary_op](auto &v) { v = binary_op(v, offset); };
+
183 if (dr::ranges::rank(global_in) == rank) {
+
184 auto local_in = dr::ranges::__detail::local(global_in);
+
185 auto local_out = rng::views::take(
+
186 dr::ranges::__detail::local(global_out), rng::size(local_in));
+
187 auto local_out_adj = [use_sycl](auto local_out, auto offset) {
+
188 bool _use_sycl = use_sycl;
+
189 if constexpr (is_exclusive) {
+
190 auto local_out_begin_direct =
+
191 detail::direct_iterator(local_out.begin());
+
192 if (_use_sycl) {
+
193 sycl_copy(&offset, &(*local_out_begin_direct));
+
194 } else {
+
195 *local_out_begin_direct = offset;
+
196 }
+
197 return local_out | rng::views::drop(1);
+
198 } else {
+
199 return local_out;
+
200 }
+
201 }(local_out, offset);
+
202 if (use_sycl) {
+
203#ifdef SYCL_LANGUAGE_VERSION
+
204 auto wrap_rebase = [rebase, base = rng::begin(local_out_adj)](
+
205 auto idx) { rebase(base[idx]); };
+
206 detail::parallel_for(dr::mp::sycl_queue(),
+
207 sycl::range<>(rng::distance(local_out_adj)),
+
208 wrap_rebase)
+
209 .wait();
+
210#else
+
211 assert(false);
+
212#endif
+
213 } else {
+
214 std::for_each(std::execution::par_unseq, local_out_adj.begin(),
+
215 local_out_adj.end(), rebase);
+
216 }
+
217 // dr::drlog.debug("rebase after: {}\n", local_out_adj);
+
218 }
+
219 }
+
220 seg_index++;
+
221 }
+
222
+
223 barrier();
+
224 return d_first + rng::size(r);
+
225}
+
226} // namespace dr::mp::__detail
+
Definition: onedpl_direct_iterator.hpp:15
+
Definition: concepts.hpp:42
+
Definition: concepts.hpp:31
+
+ + + + diff --git a/doxygen/index.html b/doxygen/index.html new file mode 100644 index 0000000000..31021a1728 --- /dev/null +++ b/doxygen/index.html @@ -0,0 +1,81 @@ + + + + + + + +Distributed Ranges: Main Page + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Distributed Ranges Documentation
+
+
+
+ + + + diff --git a/doxygen/index_8hpp_source.html b/doxygen/index_8hpp_source.html new file mode 100644 index 0000000000..70c3fd2117 --- /dev/null +++ b/doxygen/index_8hpp_source.html @@ -0,0 +1,221 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/index.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
index.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <any>
+
8#include <concepts>
+
9#include <limits>
+
10#include <tuple>
+
11
+
12namespace dr {
+
13
+
14namespace {
+
15template <typename T, std::size_t I, typename U = std::any>
+
16concept TupleElementGettable = requires(T tuple) {
+
17 { std::get<I>(tuple) } -> std::convertible_to<U>;
+
18};
+
19} // namespace
+
20
+
21template <typename T, typename... Args>
+
22concept TupleLike =
+
23 requires {
+
24 typename std::tuple_size<std::remove_cvref_t<T>>::type;
+
25 requires std::same_as<
+
26 std::remove_cvref_t<
+
27 decltype(std::tuple_size_v<std::remove_cvref_t<T>>)>,
+
28 std::size_t>;
+
29 } && sizeof...(Args) == std::tuple_size_v<std::remove_cvref_t<T>> &&
+
30 []<std::size_t... I>(std::index_sequence<I...>) {
+
31 return (TupleElementGettable<T, I, Args> && ...);
+
32 }(std::make_index_sequence<std::tuple_size_v<std::remove_cvref_t<T>>>());
+
33
+
34template <std::integral T = std::size_t> class index {
+
35public:
+
36 using index_type = T;
+
37
+
38 using first_type = T;
+
39 using second_type = T;
+
40
+
41 constexpr index_type operator[](index_type dim) const noexcept {
+
42 if (dim == 0) {
+
43 return first;
+
44 } else {
+
45 return second;
+
46 }
+
47 }
+
48
+
49 template <std::integral U>
+
50 requires(std::numeric_limits<U>::max() >= std::numeric_limits<T>::max())
+
51 constexpr operator index<U>() const noexcept {
+
52 return index<U>(first, second);
+
53 }
+
54
+
55 template <std::integral U>
+
56 requires(std::numeric_limits<U>::max() < std::numeric_limits<T>::max())
+
57 constexpr explicit operator index<U>() const noexcept {
+
58 return index<U>(first, second);
+
59 }
+
60
+
61 constexpr index(index_type first, index_type second)
+
62 : first(first), second(second) {}
+
63
+
64 template <TupleLike<T, T> Tuple>
+
65 constexpr index(Tuple tuple)
+
66 : first(std::get<0>(tuple)), second(std::get<1>(tuple)) {}
+
67
+
68 template <std::integral U> constexpr index(std::initializer_list<U> tuple) {
+
69 assert(tuple.size() == 2);
+
70 first = *tuple.begin();
+
71 second = *(tuple.begin() + 1);
+
72 }
+
73
+
74 constexpr bool operator==(const index &) const noexcept = default;
+
75 constexpr bool operator<(const index &other) const noexcept
+
76 requires(std::totally_ordered<T>)
+
77 {
+
78 if (first < other.first) {
+
79 return true;
+
80 }
+
81 if (first == other.first && second < other.second) {
+
82 return true;
+
83 }
+
84 return false;
+
85 }
+
86
+
87 template <std::size_t Index>
+
88 constexpr T get() const noexcept
+
89 requires(Index <= 1)
+
90 {
+
91 if constexpr (Index == 0) {
+
92 return first;
+
93 }
+
94 if constexpr (Index == 1) {
+
95 return second;
+
96 }
+
97 }
+
98
+
99 index() = default;
+
100 ~index() = default;
+
101 index(const index &) = default;
+
102 index &operator=(const index &) = default;
+
103 index(index &&) = default;
+
104 index &operator=(index &&) = default;
+
105
+
106 index_type first;
+
107 index_type second;
+
108};
+
109
+
110} // namespace dr
+
111
+
112namespace std {
+
113
+
114template <std::size_t Index, std::integral I>
+
115struct tuple_element<Index, dr::index<I>>
+
116 : tuple_element<Index, std::tuple<I, I>> {};
+
117
+
118template <std::integral I>
+
119struct tuple_size<dr::index<I>> : integral_constant<std::size_t, 2> {};
+
120
+
121template <std::size_t Index, std::integral I>
+
122inline constexpr I get(dr::index<I> index)
+
123 requires(Index <= 1)
+
124{
+
125 if constexpr (Index == 0) {
+
126 return index.first;
+
127 }
+
128 if constexpr (Index == 1) {
+
129 return index.second;
+
130 }
+
131}
+
132
+
133} // namespace std
+
Definition: index.hpp:34
+
Definition: index.hpp:22
+
Definition: index.hpp:16
+
+ + + + diff --git a/doxygen/inherit_graph_0.map b/doxygen/inherit_graph_0.map new file mode 100644 index 0000000000..5861583b51 --- /dev/null +++ b/doxygen/inherit_graph_0.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/inherit_graph_0.md5 b/doxygen/inherit_graph_0.md5 new file mode 100644 index 0000000000..7ef7bb2fef --- /dev/null +++ b/doxygen/inherit_graph_0.md5 @@ -0,0 +1 @@ +d42c5f8fff58582b792bb372d859605b \ No newline at end of file diff --git a/doxygen/inherit_graph_0.png b/doxygen/inherit_graph_0.png new file mode 100644 index 0000000000..406734ee0f Binary files /dev/null and b/doxygen/inherit_graph_0.png differ diff --git a/doxygen/inherit_graph_1.map b/doxygen/inherit_graph_1.map new file mode 100644 index 0000000000..5bae3d8c97 --- /dev/null +++ b/doxygen/inherit_graph_1.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_1.md5 b/doxygen/inherit_graph_1.md5 new file mode 100644 index 0000000000..4d75664209 --- /dev/null +++ b/doxygen/inherit_graph_1.md5 @@ -0,0 +1 @@ +1df1fe8a6ef63b686cc776d2264b0f7e \ No newline at end of file diff --git a/doxygen/inherit_graph_1.png b/doxygen/inherit_graph_1.png new file mode 100644 index 0000000000..adbe828f15 Binary files /dev/null and b/doxygen/inherit_graph_1.png differ diff --git a/doxygen/inherit_graph_10.map b/doxygen/inherit_graph_10.map new file mode 100644 index 0000000000..bda4e0642f --- /dev/null +++ b/doxygen/inherit_graph_10.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_10.md5 b/doxygen/inherit_graph_10.md5 new file mode 100644 index 0000000000..49fa64ec4c --- /dev/null +++ b/doxygen/inherit_graph_10.md5 @@ -0,0 +1 @@ +0a66abc111349754d2a41894abfbd82f \ No newline at end of file diff --git a/doxygen/inherit_graph_10.png b/doxygen/inherit_graph_10.png new file mode 100644 index 0000000000..92d1cc6d00 Binary files /dev/null and b/doxygen/inherit_graph_10.png differ diff --git a/doxygen/inherit_graph_100.map b/doxygen/inherit_graph_100.map new file mode 100644 index 0000000000..1f19bf00ce --- /dev/null +++ b/doxygen/inherit_graph_100.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/inherit_graph_100.md5 b/doxygen/inherit_graph_100.md5 new file mode 100644 index 0000000000..409e4966fd --- /dev/null +++ b/doxygen/inherit_graph_100.md5 @@ -0,0 +1 @@ +956d176d21d07f335e35030bbc90364f \ No newline at end of file diff --git a/doxygen/inherit_graph_100.png b/doxygen/inherit_graph_100.png new file mode 100644 index 0000000000..414a96360d Binary files /dev/null and b/doxygen/inherit_graph_100.png differ diff --git a/doxygen/inherit_graph_101.map b/doxygen/inherit_graph_101.map new file mode 100644 index 0000000000..4fd3540afe --- /dev/null +++ b/doxygen/inherit_graph_101.map @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/doxygen/inherit_graph_101.md5 b/doxygen/inherit_graph_101.md5 new file mode 100644 index 0000000000..d8dcea4723 --- /dev/null +++ b/doxygen/inherit_graph_101.md5 @@ -0,0 +1 @@ +dbee14c46b06cae5c82598a08b6174a4 \ No newline at end of file diff --git a/doxygen/inherit_graph_101.png b/doxygen/inherit_graph_101.png new file mode 100644 index 0000000000..35384e8093 Binary files /dev/null and b/doxygen/inherit_graph_101.png differ diff --git a/doxygen/inherit_graph_102.map b/doxygen/inherit_graph_102.map new file mode 100644 index 0000000000..58725177b1 --- /dev/null +++ b/doxygen/inherit_graph_102.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/doxygen/inherit_graph_102.md5 b/doxygen/inherit_graph_102.md5 new file mode 100644 index 0000000000..5821a86cf6 --- /dev/null +++ b/doxygen/inherit_graph_102.md5 @@ -0,0 +1 @@ +fbd92c813463d156b599b4d3b90c94d1 \ No newline at end of file diff --git a/doxygen/inherit_graph_102.png b/doxygen/inherit_graph_102.png new file mode 100644 index 0000000000..792e8f3a56 Binary files /dev/null and b/doxygen/inherit_graph_102.png differ diff --git a/doxygen/inherit_graph_103.map b/doxygen/inherit_graph_103.map new file mode 100644 index 0000000000..155289a779 --- /dev/null +++ b/doxygen/inherit_graph_103.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/doxygen/inherit_graph_103.md5 b/doxygen/inherit_graph_103.md5 new file mode 100644 index 0000000000..c98c444558 --- /dev/null +++ b/doxygen/inherit_graph_103.md5 @@ -0,0 +1 @@ +570484ee268fed1ef427dab3ae9ceed5 \ No newline at end of file diff --git a/doxygen/inherit_graph_103.png b/doxygen/inherit_graph_103.png new file mode 100644 index 0000000000..3dd013d137 Binary files /dev/null and b/doxygen/inherit_graph_103.png differ diff --git a/doxygen/inherit_graph_104.map b/doxygen/inherit_graph_104.map new file mode 100644 index 0000000000..6178d7f8db --- /dev/null +++ b/doxygen/inherit_graph_104.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/doxygen/inherit_graph_104.md5 b/doxygen/inherit_graph_104.md5 new file mode 100644 index 0000000000..8b815fb4ff --- /dev/null +++ b/doxygen/inherit_graph_104.md5 @@ -0,0 +1 @@ +827a3801aa848ac55a7eb3f7e8fec910 \ No newline at end of file diff --git a/doxygen/inherit_graph_104.png b/doxygen/inherit_graph_104.png new file mode 100644 index 0000000000..39c332042d Binary files /dev/null and b/doxygen/inherit_graph_104.png differ diff --git a/doxygen/inherit_graph_11.map b/doxygen/inherit_graph_11.map new file mode 100644 index 0000000000..ff25c6d07a --- /dev/null +++ b/doxygen/inherit_graph_11.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_11.md5 b/doxygen/inherit_graph_11.md5 new file mode 100644 index 0000000000..74a5210c95 --- /dev/null +++ b/doxygen/inherit_graph_11.md5 @@ -0,0 +1 @@ +27559c7f6d62fbe4061030ba991c97fa \ No newline at end of file diff --git a/doxygen/inherit_graph_11.png b/doxygen/inherit_graph_11.png new file mode 100644 index 0000000000..fe3af1c3ae Binary files /dev/null and b/doxygen/inherit_graph_11.png differ diff --git a/doxygen/inherit_graph_12.map b/doxygen/inherit_graph_12.map new file mode 100644 index 0000000000..8030d7e11f --- /dev/null +++ b/doxygen/inherit_graph_12.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_12.md5 b/doxygen/inherit_graph_12.md5 new file mode 100644 index 0000000000..8f35efcff4 --- /dev/null +++ b/doxygen/inherit_graph_12.md5 @@ -0,0 +1 @@ +d580d680ffa76c492b545ca4c5e06323 \ No newline at end of file diff --git a/doxygen/inherit_graph_12.png b/doxygen/inherit_graph_12.png new file mode 100644 index 0000000000..cf572141f6 Binary files /dev/null and b/doxygen/inherit_graph_12.png differ diff --git a/doxygen/inherit_graph_13.map b/doxygen/inherit_graph_13.map new file mode 100644 index 0000000000..2faefe6215 --- /dev/null +++ b/doxygen/inherit_graph_13.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_13.md5 b/doxygen/inherit_graph_13.md5 new file mode 100644 index 0000000000..ed2d2ee5cf --- /dev/null +++ b/doxygen/inherit_graph_13.md5 @@ -0,0 +1 @@ +a8476a03c3fbf9fb6cae7ddd3fc18c5a \ No newline at end of file diff --git a/doxygen/inherit_graph_13.png b/doxygen/inherit_graph_13.png new file mode 100644 index 0000000000..bac86b4162 Binary files /dev/null and b/doxygen/inherit_graph_13.png differ diff --git a/doxygen/inherit_graph_14.map b/doxygen/inherit_graph_14.map new file mode 100644 index 0000000000..bb5965626e --- /dev/null +++ b/doxygen/inherit_graph_14.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_14.md5 b/doxygen/inherit_graph_14.md5 new file mode 100644 index 0000000000..482794b2cb --- /dev/null +++ b/doxygen/inherit_graph_14.md5 @@ -0,0 +1 @@ +a5dbbe54524537099812f0dc62e4a125 \ No newline at end of file diff --git a/doxygen/inherit_graph_14.png b/doxygen/inherit_graph_14.png new file mode 100644 index 0000000000..63b8dd48ba Binary files /dev/null and b/doxygen/inherit_graph_14.png differ diff --git a/doxygen/inherit_graph_15.map b/doxygen/inherit_graph_15.map new file mode 100644 index 0000000000..fed6b248e1 --- /dev/null +++ b/doxygen/inherit_graph_15.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_15.md5 b/doxygen/inherit_graph_15.md5 new file mode 100644 index 0000000000..fc9f9bfccc --- /dev/null +++ b/doxygen/inherit_graph_15.md5 @@ -0,0 +1 @@ +ccd10865df3e9da39f9242271913143f \ No newline at end of file diff --git a/doxygen/inherit_graph_15.png b/doxygen/inherit_graph_15.png new file mode 100644 index 0000000000..425b7cb5f9 Binary files /dev/null and b/doxygen/inherit_graph_15.png differ diff --git a/doxygen/inherit_graph_16.map b/doxygen/inherit_graph_16.map new file mode 100644 index 0000000000..8172a0d26f --- /dev/null +++ b/doxygen/inherit_graph_16.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_16.md5 b/doxygen/inherit_graph_16.md5 new file mode 100644 index 0000000000..7157c546f0 --- /dev/null +++ b/doxygen/inherit_graph_16.md5 @@ -0,0 +1 @@ +ddb5109d72a10a2c7f9a575daed2cf76 \ No newline at end of file diff --git a/doxygen/inherit_graph_16.png b/doxygen/inherit_graph_16.png new file mode 100644 index 0000000000..d9cd05ebdd Binary files /dev/null and b/doxygen/inherit_graph_16.png differ diff --git a/doxygen/inherit_graph_17.map b/doxygen/inherit_graph_17.map new file mode 100644 index 0000000000..2e784d051b --- /dev/null +++ b/doxygen/inherit_graph_17.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_17.md5 b/doxygen/inherit_graph_17.md5 new file mode 100644 index 0000000000..80b89c020e --- /dev/null +++ b/doxygen/inherit_graph_17.md5 @@ -0,0 +1 @@ +780d48b23764f65650f907dc3068a3f0 \ No newline at end of file diff --git a/doxygen/inherit_graph_17.png b/doxygen/inherit_graph_17.png new file mode 100644 index 0000000000..64e7d4d8e9 Binary files /dev/null and b/doxygen/inherit_graph_17.png differ diff --git a/doxygen/inherit_graph_18.map b/doxygen/inherit_graph_18.map new file mode 100644 index 0000000000..94ab7cb5b2 --- /dev/null +++ b/doxygen/inherit_graph_18.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_18.md5 b/doxygen/inherit_graph_18.md5 new file mode 100644 index 0000000000..d94f4ab42c --- /dev/null +++ b/doxygen/inherit_graph_18.md5 @@ -0,0 +1 @@ +4a8bb5b2a3c8702fc7ab20d6c6f9ecb1 \ No newline at end of file diff --git a/doxygen/inherit_graph_18.png b/doxygen/inherit_graph_18.png new file mode 100644 index 0000000000..ea16c3be26 Binary files /dev/null and b/doxygen/inherit_graph_18.png differ diff --git a/doxygen/inherit_graph_19.map b/doxygen/inherit_graph_19.map new file mode 100644 index 0000000000..712578f743 --- /dev/null +++ b/doxygen/inherit_graph_19.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_19.md5 b/doxygen/inherit_graph_19.md5 new file mode 100644 index 0000000000..dd3166c5fc --- /dev/null +++ b/doxygen/inherit_graph_19.md5 @@ -0,0 +1 @@ +fc4bb74c3281c7898888ececc11fd417 \ No newline at end of file diff --git a/doxygen/inherit_graph_19.png b/doxygen/inherit_graph_19.png new file mode 100644 index 0000000000..bf8d87ab33 Binary files /dev/null and b/doxygen/inherit_graph_19.png differ diff --git a/doxygen/inherit_graph_2.map b/doxygen/inherit_graph_2.map new file mode 100644 index 0000000000..35492d6f7f --- /dev/null +++ b/doxygen/inherit_graph_2.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_2.md5 b/doxygen/inherit_graph_2.md5 new file mode 100644 index 0000000000..6d138cbfaa --- /dev/null +++ b/doxygen/inherit_graph_2.md5 @@ -0,0 +1 @@ +b27ebe6cc0fc18459866e0967e18077b \ No newline at end of file diff --git a/doxygen/inherit_graph_2.png b/doxygen/inherit_graph_2.png new file mode 100644 index 0000000000..360ad0ede6 Binary files /dev/null and b/doxygen/inherit_graph_2.png differ diff --git a/doxygen/inherit_graph_20.map b/doxygen/inherit_graph_20.map new file mode 100644 index 0000000000..370521a48f --- /dev/null +++ b/doxygen/inherit_graph_20.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_20.md5 b/doxygen/inherit_graph_20.md5 new file mode 100644 index 0000000000..731b237493 --- /dev/null +++ b/doxygen/inherit_graph_20.md5 @@ -0,0 +1 @@ +621dd578b4c0828446089cf69b0397bf \ No newline at end of file diff --git a/doxygen/inherit_graph_20.png b/doxygen/inherit_graph_20.png new file mode 100644 index 0000000000..7d3712c3af Binary files /dev/null and b/doxygen/inherit_graph_20.png differ diff --git a/doxygen/inherit_graph_21.map b/doxygen/inherit_graph_21.map new file mode 100644 index 0000000000..11299fb56a --- /dev/null +++ b/doxygen/inherit_graph_21.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_21.md5 b/doxygen/inherit_graph_21.md5 new file mode 100644 index 0000000000..b08155bbb9 --- /dev/null +++ b/doxygen/inherit_graph_21.md5 @@ -0,0 +1 @@ +9927e55ebac4ae9c102406d564c837b0 \ No newline at end of file diff --git a/doxygen/inherit_graph_21.png b/doxygen/inherit_graph_21.png new file mode 100644 index 0000000000..56b26f2241 Binary files /dev/null and b/doxygen/inherit_graph_21.png differ diff --git a/doxygen/inherit_graph_22.map b/doxygen/inherit_graph_22.map new file mode 100644 index 0000000000..e7590937b3 --- /dev/null +++ b/doxygen/inherit_graph_22.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_22.md5 b/doxygen/inherit_graph_22.md5 new file mode 100644 index 0000000000..18884d74ce --- /dev/null +++ b/doxygen/inherit_graph_22.md5 @@ -0,0 +1 @@ +eacf0ff2d0325a3722ac0adbd9b4f2eb \ No newline at end of file diff --git a/doxygen/inherit_graph_22.png b/doxygen/inherit_graph_22.png new file mode 100644 index 0000000000..a70e55384a Binary files /dev/null and b/doxygen/inherit_graph_22.png differ diff --git a/doxygen/inherit_graph_23.map b/doxygen/inherit_graph_23.map new file mode 100644 index 0000000000..4e1dfba6c4 --- /dev/null +++ b/doxygen/inherit_graph_23.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_23.md5 b/doxygen/inherit_graph_23.md5 new file mode 100644 index 0000000000..f6b827866d --- /dev/null +++ b/doxygen/inherit_graph_23.md5 @@ -0,0 +1 @@ +2af723132aad24aed97bac00115e7e69 \ No newline at end of file diff --git a/doxygen/inherit_graph_23.png b/doxygen/inherit_graph_23.png new file mode 100644 index 0000000000..b8c6d66a52 Binary files /dev/null and b/doxygen/inherit_graph_23.png differ diff --git a/doxygen/inherit_graph_24.map b/doxygen/inherit_graph_24.map new file mode 100644 index 0000000000..5ea8fd24d6 --- /dev/null +++ b/doxygen/inherit_graph_24.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_24.md5 b/doxygen/inherit_graph_24.md5 new file mode 100644 index 0000000000..3ef5318724 --- /dev/null +++ b/doxygen/inherit_graph_24.md5 @@ -0,0 +1 @@ +15ed9023d9cd896fe718be0d8c6bd669 \ No newline at end of file diff --git a/doxygen/inherit_graph_24.png b/doxygen/inherit_graph_24.png new file mode 100644 index 0000000000..67fcc187cc Binary files /dev/null and b/doxygen/inherit_graph_24.png differ diff --git a/doxygen/inherit_graph_25.map b/doxygen/inherit_graph_25.map new file mode 100644 index 0000000000..1ac117af22 --- /dev/null +++ b/doxygen/inherit_graph_25.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_25.md5 b/doxygen/inherit_graph_25.md5 new file mode 100644 index 0000000000..4a93033dd0 --- /dev/null +++ b/doxygen/inherit_graph_25.md5 @@ -0,0 +1 @@ +fa61c4fbf2ba702c22fece3defbfb27d \ No newline at end of file diff --git a/doxygen/inherit_graph_25.png b/doxygen/inherit_graph_25.png new file mode 100644 index 0000000000..5cddaf0fde Binary files /dev/null and b/doxygen/inherit_graph_25.png differ diff --git a/doxygen/inherit_graph_26.map b/doxygen/inherit_graph_26.map new file mode 100644 index 0000000000..432435a27f --- /dev/null +++ b/doxygen/inherit_graph_26.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_26.md5 b/doxygen/inherit_graph_26.md5 new file mode 100644 index 0000000000..08ab7a637e --- /dev/null +++ b/doxygen/inherit_graph_26.md5 @@ -0,0 +1 @@ +f365a5829700c77c0f60506f77ae7c43 \ No newline at end of file diff --git a/doxygen/inherit_graph_26.png b/doxygen/inherit_graph_26.png new file mode 100644 index 0000000000..40dccfa279 Binary files /dev/null and b/doxygen/inherit_graph_26.png differ diff --git a/doxygen/inherit_graph_27.map b/doxygen/inherit_graph_27.map new file mode 100644 index 0000000000..a293b9eca3 --- /dev/null +++ b/doxygen/inherit_graph_27.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_27.md5 b/doxygen/inherit_graph_27.md5 new file mode 100644 index 0000000000..8586bfa98f --- /dev/null +++ b/doxygen/inherit_graph_27.md5 @@ -0,0 +1 @@ +79b50f1309bbb434f97b2eb087c2d9a9 \ No newline at end of file diff --git a/doxygen/inherit_graph_27.png b/doxygen/inherit_graph_27.png new file mode 100644 index 0000000000..ac64b75939 Binary files /dev/null and b/doxygen/inherit_graph_27.png differ diff --git a/doxygen/inherit_graph_28.map b/doxygen/inherit_graph_28.map new file mode 100644 index 0000000000..f970141725 --- /dev/null +++ b/doxygen/inherit_graph_28.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_28.md5 b/doxygen/inherit_graph_28.md5 new file mode 100644 index 0000000000..9561b92e2c --- /dev/null +++ b/doxygen/inherit_graph_28.md5 @@ -0,0 +1 @@ +9157672289a12c573691fb7f28818c25 \ No newline at end of file diff --git a/doxygen/inherit_graph_28.png b/doxygen/inherit_graph_28.png new file mode 100644 index 0000000000..1484430351 Binary files /dev/null and b/doxygen/inherit_graph_28.png differ diff --git a/doxygen/inherit_graph_29.map b/doxygen/inherit_graph_29.map new file mode 100644 index 0000000000..bd9ca3a3ff --- /dev/null +++ b/doxygen/inherit_graph_29.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_29.md5 b/doxygen/inherit_graph_29.md5 new file mode 100644 index 0000000000..434e219704 --- /dev/null +++ b/doxygen/inherit_graph_29.md5 @@ -0,0 +1 @@ +453114b03cefd852e21b7376a913e7e3 \ No newline at end of file diff --git a/doxygen/inherit_graph_29.png b/doxygen/inherit_graph_29.png new file mode 100644 index 0000000000..c4e1fd8b1f Binary files /dev/null and b/doxygen/inherit_graph_29.png differ diff --git a/doxygen/inherit_graph_3.map b/doxygen/inherit_graph_3.map new file mode 100644 index 0000000000..dee030d5fc --- /dev/null +++ b/doxygen/inherit_graph_3.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_3.md5 b/doxygen/inherit_graph_3.md5 new file mode 100644 index 0000000000..226160964e --- /dev/null +++ b/doxygen/inherit_graph_3.md5 @@ -0,0 +1 @@ +6e2e767c5c479bbb9177af957ef24ea3 \ No newline at end of file diff --git a/doxygen/inherit_graph_3.png b/doxygen/inherit_graph_3.png new file mode 100644 index 0000000000..cff637dae1 Binary files /dev/null and b/doxygen/inherit_graph_3.png differ diff --git a/doxygen/inherit_graph_30.map b/doxygen/inherit_graph_30.map new file mode 100644 index 0000000000..722f4449f8 --- /dev/null +++ b/doxygen/inherit_graph_30.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/inherit_graph_30.md5 b/doxygen/inherit_graph_30.md5 new file mode 100644 index 0000000000..55ea10edee --- /dev/null +++ b/doxygen/inherit_graph_30.md5 @@ -0,0 +1 @@ +6cf2aa4d3fd5d3c5f3ec3617e9b8ec6e \ No newline at end of file diff --git a/doxygen/inherit_graph_30.png b/doxygen/inherit_graph_30.png new file mode 100644 index 0000000000..0228b1dc7b Binary files /dev/null and b/doxygen/inherit_graph_30.png differ diff --git a/doxygen/inherit_graph_31.map b/doxygen/inherit_graph_31.map new file mode 100644 index 0000000000..b715b03a36 --- /dev/null +++ b/doxygen/inherit_graph_31.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_31.md5 b/doxygen/inherit_graph_31.md5 new file mode 100644 index 0000000000..39a64ce253 --- /dev/null +++ b/doxygen/inherit_graph_31.md5 @@ -0,0 +1 @@ +bd707c3cbb45c7d1521975293d994afd \ No newline at end of file diff --git a/doxygen/inherit_graph_31.png b/doxygen/inherit_graph_31.png new file mode 100644 index 0000000000..32a2bab7f9 Binary files /dev/null and b/doxygen/inherit_graph_31.png differ diff --git a/doxygen/inherit_graph_32.map b/doxygen/inherit_graph_32.map new file mode 100644 index 0000000000..54cd619444 --- /dev/null +++ b/doxygen/inherit_graph_32.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_32.md5 b/doxygen/inherit_graph_32.md5 new file mode 100644 index 0000000000..afdb99f4bd --- /dev/null +++ b/doxygen/inherit_graph_32.md5 @@ -0,0 +1 @@ +60e1f7de7c7392440a8a8c5061799573 \ No newline at end of file diff --git a/doxygen/inherit_graph_32.png b/doxygen/inherit_graph_32.png new file mode 100644 index 0000000000..2979663064 Binary files /dev/null and b/doxygen/inherit_graph_32.png differ diff --git a/doxygen/inherit_graph_33.map b/doxygen/inherit_graph_33.map new file mode 100644 index 0000000000..b234f1b225 --- /dev/null +++ b/doxygen/inherit_graph_33.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_33.md5 b/doxygen/inherit_graph_33.md5 new file mode 100644 index 0000000000..d910ce50da --- /dev/null +++ b/doxygen/inherit_graph_33.md5 @@ -0,0 +1 @@ +a6fa23978d157a36c492840d5718a151 \ No newline at end of file diff --git a/doxygen/inherit_graph_33.png b/doxygen/inherit_graph_33.png new file mode 100644 index 0000000000..ac0759fcb3 Binary files /dev/null and b/doxygen/inherit_graph_33.png differ diff --git a/doxygen/inherit_graph_34.map b/doxygen/inherit_graph_34.map new file mode 100644 index 0000000000..4c0273053c --- /dev/null +++ b/doxygen/inherit_graph_34.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_34.md5 b/doxygen/inherit_graph_34.md5 new file mode 100644 index 0000000000..a30b48b7b9 --- /dev/null +++ b/doxygen/inherit_graph_34.md5 @@ -0,0 +1 @@ +0d6336d78781b31fa5c002456414fd15 \ No newline at end of file diff --git a/doxygen/inherit_graph_34.png b/doxygen/inherit_graph_34.png new file mode 100644 index 0000000000..0278124891 Binary files /dev/null and b/doxygen/inherit_graph_34.png differ diff --git a/doxygen/inherit_graph_35.map b/doxygen/inherit_graph_35.map new file mode 100644 index 0000000000..1daa7b318b --- /dev/null +++ b/doxygen/inherit_graph_35.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_35.md5 b/doxygen/inherit_graph_35.md5 new file mode 100644 index 0000000000..215dd643a5 --- /dev/null +++ b/doxygen/inherit_graph_35.md5 @@ -0,0 +1 @@ +0f7631315b1322f805cdda3b34257d8f \ No newline at end of file diff --git a/doxygen/inherit_graph_35.png b/doxygen/inherit_graph_35.png new file mode 100644 index 0000000000..c17a3a77e8 Binary files /dev/null and b/doxygen/inherit_graph_35.png differ diff --git a/doxygen/inherit_graph_36.map b/doxygen/inherit_graph_36.map new file mode 100644 index 0000000000..6deee9a724 --- /dev/null +++ b/doxygen/inherit_graph_36.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_36.md5 b/doxygen/inherit_graph_36.md5 new file mode 100644 index 0000000000..78cee3d8ae --- /dev/null +++ b/doxygen/inherit_graph_36.md5 @@ -0,0 +1 @@ +dd4bbb2f8552ce489836951794dd2f54 \ No newline at end of file diff --git a/doxygen/inherit_graph_36.png b/doxygen/inherit_graph_36.png new file mode 100644 index 0000000000..d42d16e314 Binary files /dev/null and b/doxygen/inherit_graph_36.png differ diff --git a/doxygen/inherit_graph_37.map b/doxygen/inherit_graph_37.map new file mode 100644 index 0000000000..ff31c8eb48 --- /dev/null +++ b/doxygen/inherit_graph_37.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_37.md5 b/doxygen/inherit_graph_37.md5 new file mode 100644 index 0000000000..9301bdfef3 --- /dev/null +++ b/doxygen/inherit_graph_37.md5 @@ -0,0 +1 @@ +f63905b8650347d2a70968ffdbac8736 \ No newline at end of file diff --git a/doxygen/inherit_graph_37.png b/doxygen/inherit_graph_37.png new file mode 100644 index 0000000000..c39506df8c Binary files /dev/null and b/doxygen/inherit_graph_37.png differ diff --git a/doxygen/inherit_graph_38.map b/doxygen/inherit_graph_38.map new file mode 100644 index 0000000000..cda1cd5f17 --- /dev/null +++ b/doxygen/inherit_graph_38.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_38.md5 b/doxygen/inherit_graph_38.md5 new file mode 100644 index 0000000000..796075d0d0 --- /dev/null +++ b/doxygen/inherit_graph_38.md5 @@ -0,0 +1 @@ +a4cfe925bce9fee023437f5b406e4160 \ No newline at end of file diff --git a/doxygen/inherit_graph_38.png b/doxygen/inherit_graph_38.png new file mode 100644 index 0000000000..10ef8d83ac Binary files /dev/null and b/doxygen/inherit_graph_38.png differ diff --git a/doxygen/inherit_graph_39.map b/doxygen/inherit_graph_39.map new file mode 100644 index 0000000000..8b2c16daba --- /dev/null +++ b/doxygen/inherit_graph_39.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_39.md5 b/doxygen/inherit_graph_39.md5 new file mode 100644 index 0000000000..066a2d47bf --- /dev/null +++ b/doxygen/inherit_graph_39.md5 @@ -0,0 +1 @@ +a0c1bc546a46a57312f25c2a1cff87dd \ No newline at end of file diff --git a/doxygen/inherit_graph_39.png b/doxygen/inherit_graph_39.png new file mode 100644 index 0000000000..525680831a Binary files /dev/null and b/doxygen/inherit_graph_39.png differ diff --git a/doxygen/inherit_graph_4.map b/doxygen/inherit_graph_4.map new file mode 100644 index 0000000000..a1a4b5b71f --- /dev/null +++ b/doxygen/inherit_graph_4.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_4.md5 b/doxygen/inherit_graph_4.md5 new file mode 100644 index 0000000000..a5acc3e0cf --- /dev/null +++ b/doxygen/inherit_graph_4.md5 @@ -0,0 +1 @@ +6219a897663b9273d263b29e039ecc9d \ No newline at end of file diff --git a/doxygen/inherit_graph_4.png b/doxygen/inherit_graph_4.png new file mode 100644 index 0000000000..75a4f338f0 Binary files /dev/null and b/doxygen/inherit_graph_4.png differ diff --git a/doxygen/inherit_graph_40.map b/doxygen/inherit_graph_40.map new file mode 100644 index 0000000000..74337fac35 --- /dev/null +++ b/doxygen/inherit_graph_40.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_40.md5 b/doxygen/inherit_graph_40.md5 new file mode 100644 index 0000000000..4fdc4c64e9 --- /dev/null +++ b/doxygen/inherit_graph_40.md5 @@ -0,0 +1 @@ +39ffca0cdf8fa6a94afce2a48d253707 \ No newline at end of file diff --git a/doxygen/inherit_graph_40.png b/doxygen/inherit_graph_40.png new file mode 100644 index 0000000000..23b62b7cd8 Binary files /dev/null and b/doxygen/inherit_graph_40.png differ diff --git a/doxygen/inherit_graph_41.map b/doxygen/inherit_graph_41.map new file mode 100644 index 0000000000..3f72abddb5 --- /dev/null +++ b/doxygen/inherit_graph_41.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_41.md5 b/doxygen/inherit_graph_41.md5 new file mode 100644 index 0000000000..8f1f51074c --- /dev/null +++ b/doxygen/inherit_graph_41.md5 @@ -0,0 +1 @@ +7a44e837f0307766d5acc670a677516d \ No newline at end of file diff --git a/doxygen/inherit_graph_41.png b/doxygen/inherit_graph_41.png new file mode 100644 index 0000000000..a887c456d9 Binary files /dev/null and b/doxygen/inherit_graph_41.png differ diff --git a/doxygen/inherit_graph_42.map b/doxygen/inherit_graph_42.map new file mode 100644 index 0000000000..adf5f1c772 --- /dev/null +++ b/doxygen/inherit_graph_42.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_42.md5 b/doxygen/inherit_graph_42.md5 new file mode 100644 index 0000000000..e8247cf7e1 --- /dev/null +++ b/doxygen/inherit_graph_42.md5 @@ -0,0 +1 @@ +388758842ddd1b9cd08d1f34519e134f \ No newline at end of file diff --git a/doxygen/inherit_graph_42.png b/doxygen/inherit_graph_42.png new file mode 100644 index 0000000000..a887c456d9 Binary files /dev/null and b/doxygen/inherit_graph_42.png differ diff --git a/doxygen/inherit_graph_43.map b/doxygen/inherit_graph_43.map new file mode 100644 index 0000000000..4ce1bc5f94 --- /dev/null +++ b/doxygen/inherit_graph_43.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_43.md5 b/doxygen/inherit_graph_43.md5 new file mode 100644 index 0000000000..10927dde71 --- /dev/null +++ b/doxygen/inherit_graph_43.md5 @@ -0,0 +1 @@ +05fc186ad03abdbf752b06280ed7a26e \ No newline at end of file diff --git a/doxygen/inherit_graph_43.png b/doxygen/inherit_graph_43.png new file mode 100644 index 0000000000..9ddb2cd3da Binary files /dev/null and b/doxygen/inherit_graph_43.png differ diff --git a/doxygen/inherit_graph_44.map b/doxygen/inherit_graph_44.map new file mode 100644 index 0000000000..c06132fc0d --- /dev/null +++ b/doxygen/inherit_graph_44.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_44.md5 b/doxygen/inherit_graph_44.md5 new file mode 100644 index 0000000000..c7913b7a3c --- /dev/null +++ b/doxygen/inherit_graph_44.md5 @@ -0,0 +1 @@ +fb0d562dbd435b80b2d808467a3006a2 \ No newline at end of file diff --git a/doxygen/inherit_graph_44.png b/doxygen/inherit_graph_44.png new file mode 100644 index 0000000000..b4cb3bf3d0 Binary files /dev/null and b/doxygen/inherit_graph_44.png differ diff --git a/doxygen/inherit_graph_45.map b/doxygen/inherit_graph_45.map new file mode 100644 index 0000000000..ae0117206e --- /dev/null +++ b/doxygen/inherit_graph_45.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_45.md5 b/doxygen/inherit_graph_45.md5 new file mode 100644 index 0000000000..267a2811a4 --- /dev/null +++ b/doxygen/inherit_graph_45.md5 @@ -0,0 +1 @@ +6c0ab9698441bceb4254fc7a2a225ea8 \ No newline at end of file diff --git a/doxygen/inherit_graph_45.png b/doxygen/inherit_graph_45.png new file mode 100644 index 0000000000..66f9b22d28 Binary files /dev/null and b/doxygen/inherit_graph_45.png differ diff --git a/doxygen/inherit_graph_46.map b/doxygen/inherit_graph_46.map new file mode 100644 index 0000000000..ba26b64fe2 --- /dev/null +++ b/doxygen/inherit_graph_46.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_46.md5 b/doxygen/inherit_graph_46.md5 new file mode 100644 index 0000000000..4be1216827 --- /dev/null +++ b/doxygen/inherit_graph_46.md5 @@ -0,0 +1 @@ +4e7e8fe4ec5aa4d5ccc99accf1eda6e2 \ No newline at end of file diff --git a/doxygen/inherit_graph_46.png b/doxygen/inherit_graph_46.png new file mode 100644 index 0000000000..84726cfefe Binary files /dev/null and b/doxygen/inherit_graph_46.png differ diff --git a/doxygen/inherit_graph_47.map b/doxygen/inherit_graph_47.map new file mode 100644 index 0000000000..58907eafe5 --- /dev/null +++ b/doxygen/inherit_graph_47.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_47.md5 b/doxygen/inherit_graph_47.md5 new file mode 100644 index 0000000000..029118f18d --- /dev/null +++ b/doxygen/inherit_graph_47.md5 @@ -0,0 +1 @@ +514d03087245c8bf305f3f4e7a10f488 \ No newline at end of file diff --git a/doxygen/inherit_graph_47.png b/doxygen/inherit_graph_47.png new file mode 100644 index 0000000000..843f3d6313 Binary files /dev/null and b/doxygen/inherit_graph_47.png differ diff --git a/doxygen/inherit_graph_48.map b/doxygen/inherit_graph_48.map new file mode 100644 index 0000000000..d3cd7a57ca --- /dev/null +++ b/doxygen/inherit_graph_48.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_48.md5 b/doxygen/inherit_graph_48.md5 new file mode 100644 index 0000000000..980e074010 --- /dev/null +++ b/doxygen/inherit_graph_48.md5 @@ -0,0 +1 @@ +acfb2329b831abeae4e9a1e4f378400b \ No newline at end of file diff --git a/doxygen/inherit_graph_48.png b/doxygen/inherit_graph_48.png new file mode 100644 index 0000000000..752a2ba2a6 Binary files /dev/null and b/doxygen/inherit_graph_48.png differ diff --git a/doxygen/inherit_graph_49.map b/doxygen/inherit_graph_49.map new file mode 100644 index 0000000000..6ff53a976b --- /dev/null +++ b/doxygen/inherit_graph_49.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_49.md5 b/doxygen/inherit_graph_49.md5 new file mode 100644 index 0000000000..a692ca5af9 --- /dev/null +++ b/doxygen/inherit_graph_49.md5 @@ -0,0 +1 @@ +41b5ef24301655d4d036b8130c19f329 \ No newline at end of file diff --git a/doxygen/inherit_graph_49.png b/doxygen/inherit_graph_49.png new file mode 100644 index 0000000000..d5f24c066e Binary files /dev/null and b/doxygen/inherit_graph_49.png differ diff --git a/doxygen/inherit_graph_5.map b/doxygen/inherit_graph_5.map new file mode 100644 index 0000000000..7f68b87c5a --- /dev/null +++ b/doxygen/inherit_graph_5.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_5.md5 b/doxygen/inherit_graph_5.md5 new file mode 100644 index 0000000000..65a67aacd7 --- /dev/null +++ b/doxygen/inherit_graph_5.md5 @@ -0,0 +1 @@ +1fa2988ea38cc7d14cca1e2441170cf1 \ No newline at end of file diff --git a/doxygen/inherit_graph_5.png b/doxygen/inherit_graph_5.png new file mode 100644 index 0000000000..427f9de720 Binary files /dev/null and b/doxygen/inherit_graph_5.png differ diff --git a/doxygen/inherit_graph_50.map b/doxygen/inherit_graph_50.map new file mode 100644 index 0000000000..7631eff2fb --- /dev/null +++ b/doxygen/inherit_graph_50.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_50.md5 b/doxygen/inherit_graph_50.md5 new file mode 100644 index 0000000000..3fbb95c67e --- /dev/null +++ b/doxygen/inherit_graph_50.md5 @@ -0,0 +1 @@ +e97567b8010d30ac64643053ad8cb485 \ No newline at end of file diff --git a/doxygen/inherit_graph_50.png b/doxygen/inherit_graph_50.png new file mode 100644 index 0000000000..c9202fc94e Binary files /dev/null and b/doxygen/inherit_graph_50.png differ diff --git a/doxygen/inherit_graph_51.map b/doxygen/inherit_graph_51.map new file mode 100644 index 0000000000..344c908d90 --- /dev/null +++ b/doxygen/inherit_graph_51.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_51.md5 b/doxygen/inherit_graph_51.md5 new file mode 100644 index 0000000000..312658193e --- /dev/null +++ b/doxygen/inherit_graph_51.md5 @@ -0,0 +1 @@ +5f3c346a4a2c9e3595de01096b4352a9 \ No newline at end of file diff --git a/doxygen/inherit_graph_51.png b/doxygen/inherit_graph_51.png new file mode 100644 index 0000000000..4e9ee189a7 Binary files /dev/null and b/doxygen/inherit_graph_51.png differ diff --git a/doxygen/inherit_graph_52.map b/doxygen/inherit_graph_52.map new file mode 100644 index 0000000000..816a7eadbf --- /dev/null +++ b/doxygen/inherit_graph_52.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_52.md5 b/doxygen/inherit_graph_52.md5 new file mode 100644 index 0000000000..8059afa36f --- /dev/null +++ b/doxygen/inherit_graph_52.md5 @@ -0,0 +1 @@ +ecf7b142f3d4cd8c66eeed52aa34d31c \ No newline at end of file diff --git a/doxygen/inherit_graph_52.png b/doxygen/inherit_graph_52.png new file mode 100644 index 0000000000..2bebedd58a Binary files /dev/null and b/doxygen/inherit_graph_52.png differ diff --git a/doxygen/inherit_graph_53.map b/doxygen/inherit_graph_53.map new file mode 100644 index 0000000000..c9c5f08b59 --- /dev/null +++ b/doxygen/inherit_graph_53.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_53.md5 b/doxygen/inherit_graph_53.md5 new file mode 100644 index 0000000000..8803d20040 --- /dev/null +++ b/doxygen/inherit_graph_53.md5 @@ -0,0 +1 @@ +7f1da4fc5ce43fe3c4a08fc30e05abd9 \ No newline at end of file diff --git a/doxygen/inherit_graph_53.png b/doxygen/inherit_graph_53.png new file mode 100644 index 0000000000..2c1586f82e Binary files /dev/null and b/doxygen/inherit_graph_53.png differ diff --git a/doxygen/inherit_graph_54.map b/doxygen/inherit_graph_54.map new file mode 100644 index 0000000000..8a3395818a --- /dev/null +++ b/doxygen/inherit_graph_54.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_54.md5 b/doxygen/inherit_graph_54.md5 new file mode 100644 index 0000000000..c30030b128 --- /dev/null +++ b/doxygen/inherit_graph_54.md5 @@ -0,0 +1 @@ +726cb3d428a9ffeb270e772cb5373d84 \ No newline at end of file diff --git a/doxygen/inherit_graph_54.png b/doxygen/inherit_graph_54.png new file mode 100644 index 0000000000..7532d7f552 Binary files /dev/null and b/doxygen/inherit_graph_54.png differ diff --git a/doxygen/inherit_graph_55.map b/doxygen/inherit_graph_55.map new file mode 100644 index 0000000000..4fb6c09141 --- /dev/null +++ b/doxygen/inherit_graph_55.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_55.md5 b/doxygen/inherit_graph_55.md5 new file mode 100644 index 0000000000..6a54f03dec --- /dev/null +++ b/doxygen/inherit_graph_55.md5 @@ -0,0 +1 @@ +965198c728e52247f9b9abc1c7e9b33c \ No newline at end of file diff --git a/doxygen/inherit_graph_55.png b/doxygen/inherit_graph_55.png new file mode 100644 index 0000000000..074093c728 Binary files /dev/null and b/doxygen/inherit_graph_55.png differ diff --git a/doxygen/inherit_graph_56.map b/doxygen/inherit_graph_56.map new file mode 100644 index 0000000000..00a5e3e6df --- /dev/null +++ b/doxygen/inherit_graph_56.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_56.md5 b/doxygen/inherit_graph_56.md5 new file mode 100644 index 0000000000..ec7d4fff07 --- /dev/null +++ b/doxygen/inherit_graph_56.md5 @@ -0,0 +1 @@ +0fc89b2a271007160d9378a7f6aabbe6 \ No newline at end of file diff --git a/doxygen/inherit_graph_56.png b/doxygen/inherit_graph_56.png new file mode 100644 index 0000000000..76b50de894 Binary files /dev/null and b/doxygen/inherit_graph_56.png differ diff --git a/doxygen/inherit_graph_57.map b/doxygen/inherit_graph_57.map new file mode 100644 index 0000000000..ee4af8ef68 --- /dev/null +++ b/doxygen/inherit_graph_57.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_57.md5 b/doxygen/inherit_graph_57.md5 new file mode 100644 index 0000000000..56529b3a4a --- /dev/null +++ b/doxygen/inherit_graph_57.md5 @@ -0,0 +1 @@ +4f4d4f639a8732ef3d5eb81ad8bf9462 \ No newline at end of file diff --git a/doxygen/inherit_graph_57.png b/doxygen/inherit_graph_57.png new file mode 100644 index 0000000000..5aa2bbec58 Binary files /dev/null and b/doxygen/inherit_graph_57.png differ diff --git a/doxygen/inherit_graph_58.map b/doxygen/inherit_graph_58.map new file mode 100644 index 0000000000..904a7d8020 --- /dev/null +++ b/doxygen/inherit_graph_58.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_58.md5 b/doxygen/inherit_graph_58.md5 new file mode 100644 index 0000000000..623025f0cc --- /dev/null +++ b/doxygen/inherit_graph_58.md5 @@ -0,0 +1 @@ +787b30086a5ef54a5d84b0dbca83659c \ No newline at end of file diff --git a/doxygen/inherit_graph_58.png b/doxygen/inherit_graph_58.png new file mode 100644 index 0000000000..aec7a3f97d Binary files /dev/null and b/doxygen/inherit_graph_58.png differ diff --git a/doxygen/inherit_graph_59.map b/doxygen/inherit_graph_59.map new file mode 100644 index 0000000000..83ada7dfbd --- /dev/null +++ b/doxygen/inherit_graph_59.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_59.md5 b/doxygen/inherit_graph_59.md5 new file mode 100644 index 0000000000..0cec9ddca7 --- /dev/null +++ b/doxygen/inherit_graph_59.md5 @@ -0,0 +1 @@ +89e48d2812ffb9bc93562ccd187e17f7 \ No newline at end of file diff --git a/doxygen/inherit_graph_59.png b/doxygen/inherit_graph_59.png new file mode 100644 index 0000000000..82a515ad48 Binary files /dev/null and b/doxygen/inherit_graph_59.png differ diff --git a/doxygen/inherit_graph_6.map b/doxygen/inherit_graph_6.map new file mode 100644 index 0000000000..64284a4a86 --- /dev/null +++ b/doxygen/inherit_graph_6.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_6.md5 b/doxygen/inherit_graph_6.md5 new file mode 100644 index 0000000000..cb834cd101 --- /dev/null +++ b/doxygen/inherit_graph_6.md5 @@ -0,0 +1 @@ +2eed3c5045260177521923355bc7728e \ No newline at end of file diff --git a/doxygen/inherit_graph_6.png b/doxygen/inherit_graph_6.png new file mode 100644 index 0000000000..c96688e2a9 Binary files /dev/null and b/doxygen/inherit_graph_6.png differ diff --git a/doxygen/inherit_graph_60.map b/doxygen/inherit_graph_60.map new file mode 100644 index 0000000000..8918bc0da0 --- /dev/null +++ b/doxygen/inherit_graph_60.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_60.md5 b/doxygen/inherit_graph_60.md5 new file mode 100644 index 0000000000..93b283a8f7 --- /dev/null +++ b/doxygen/inherit_graph_60.md5 @@ -0,0 +1 @@ +3207d9a5b588af7c4d0c598ab0630fb7 \ No newline at end of file diff --git a/doxygen/inherit_graph_60.png b/doxygen/inherit_graph_60.png new file mode 100644 index 0000000000..d6cc443ef9 Binary files /dev/null and b/doxygen/inherit_graph_60.png differ diff --git a/doxygen/inherit_graph_61.map b/doxygen/inherit_graph_61.map new file mode 100644 index 0000000000..e60c6e9ad6 --- /dev/null +++ b/doxygen/inherit_graph_61.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_61.md5 b/doxygen/inherit_graph_61.md5 new file mode 100644 index 0000000000..38a58e2ce0 --- /dev/null +++ b/doxygen/inherit_graph_61.md5 @@ -0,0 +1 @@ +54a725a6665cbfac5d418c7ac34660c3 \ No newline at end of file diff --git a/doxygen/inherit_graph_61.png b/doxygen/inherit_graph_61.png new file mode 100644 index 0000000000..86e4de0707 Binary files /dev/null and b/doxygen/inherit_graph_61.png differ diff --git a/doxygen/inherit_graph_62.map b/doxygen/inherit_graph_62.map new file mode 100644 index 0000000000..c50b5e9697 --- /dev/null +++ b/doxygen/inherit_graph_62.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_62.md5 b/doxygen/inherit_graph_62.md5 new file mode 100644 index 0000000000..55168ae42f --- /dev/null +++ b/doxygen/inherit_graph_62.md5 @@ -0,0 +1 @@ +b8e912b45fab96a388def824778c88fd \ No newline at end of file diff --git a/doxygen/inherit_graph_62.png b/doxygen/inherit_graph_62.png new file mode 100644 index 0000000000..896def3d46 Binary files /dev/null and b/doxygen/inherit_graph_62.png differ diff --git a/doxygen/inherit_graph_63.map b/doxygen/inherit_graph_63.map new file mode 100644 index 0000000000..714dab72c5 --- /dev/null +++ b/doxygen/inherit_graph_63.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_63.md5 b/doxygen/inherit_graph_63.md5 new file mode 100644 index 0000000000..b579d886e9 --- /dev/null +++ b/doxygen/inherit_graph_63.md5 @@ -0,0 +1 @@ +8de5c250761c46fa41cef8a44915e2d3 \ No newline at end of file diff --git a/doxygen/inherit_graph_63.png b/doxygen/inherit_graph_63.png new file mode 100644 index 0000000000..007fba7fd4 Binary files /dev/null and b/doxygen/inherit_graph_63.png differ diff --git a/doxygen/inherit_graph_64.map b/doxygen/inherit_graph_64.map new file mode 100644 index 0000000000..a9629755a5 --- /dev/null +++ b/doxygen/inherit_graph_64.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_64.md5 b/doxygen/inherit_graph_64.md5 new file mode 100644 index 0000000000..4de7203a62 --- /dev/null +++ b/doxygen/inherit_graph_64.md5 @@ -0,0 +1 @@ +d4cb5e310a0806c8c4a69dcdae2a435d \ No newline at end of file diff --git a/doxygen/inherit_graph_64.png b/doxygen/inherit_graph_64.png new file mode 100644 index 0000000000..09f4d7373f Binary files /dev/null and b/doxygen/inherit_graph_64.png differ diff --git a/doxygen/inherit_graph_65.map b/doxygen/inherit_graph_65.map new file mode 100644 index 0000000000..83cee1da2c --- /dev/null +++ b/doxygen/inherit_graph_65.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_65.md5 b/doxygen/inherit_graph_65.md5 new file mode 100644 index 0000000000..a4c547e71d --- /dev/null +++ b/doxygen/inherit_graph_65.md5 @@ -0,0 +1 @@ +5f65d91f6c891661883018f9d826d501 \ No newline at end of file diff --git a/doxygen/inherit_graph_65.png b/doxygen/inherit_graph_65.png new file mode 100644 index 0000000000..c140e2618d Binary files /dev/null and b/doxygen/inherit_graph_65.png differ diff --git a/doxygen/inherit_graph_66.map b/doxygen/inherit_graph_66.map new file mode 100644 index 0000000000..ffe0a9ca82 --- /dev/null +++ b/doxygen/inherit_graph_66.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_66.md5 b/doxygen/inherit_graph_66.md5 new file mode 100644 index 0000000000..f126604918 --- /dev/null +++ b/doxygen/inherit_graph_66.md5 @@ -0,0 +1 @@ +26d15e7d02d1486a3511f47ae72d8a91 \ No newline at end of file diff --git a/doxygen/inherit_graph_66.png b/doxygen/inherit_graph_66.png new file mode 100644 index 0000000000..8f8771b7fe Binary files /dev/null and b/doxygen/inherit_graph_66.png differ diff --git a/doxygen/inherit_graph_67.map b/doxygen/inherit_graph_67.map new file mode 100644 index 0000000000..52ee3f208d --- /dev/null +++ b/doxygen/inherit_graph_67.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_67.md5 b/doxygen/inherit_graph_67.md5 new file mode 100644 index 0000000000..1453765cd7 --- /dev/null +++ b/doxygen/inherit_graph_67.md5 @@ -0,0 +1 @@ +6603173f3e33bbb4899c6da4817f53b9 \ No newline at end of file diff --git a/doxygen/inherit_graph_67.png b/doxygen/inherit_graph_67.png new file mode 100644 index 0000000000..a0c69372d3 Binary files /dev/null and b/doxygen/inherit_graph_67.png differ diff --git a/doxygen/inherit_graph_68.map b/doxygen/inherit_graph_68.map new file mode 100644 index 0000000000..83f853cd6d --- /dev/null +++ b/doxygen/inherit_graph_68.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_68.md5 b/doxygen/inherit_graph_68.md5 new file mode 100644 index 0000000000..4fb63128dd --- /dev/null +++ b/doxygen/inherit_graph_68.md5 @@ -0,0 +1 @@ +5b0a6b83cc61ece9abfe03de28c88278 \ No newline at end of file diff --git a/doxygen/inherit_graph_68.png b/doxygen/inherit_graph_68.png new file mode 100644 index 0000000000..2a378a3ac4 Binary files /dev/null and b/doxygen/inherit_graph_68.png differ diff --git a/doxygen/inherit_graph_69.map b/doxygen/inherit_graph_69.map new file mode 100644 index 0000000000..9b4b54aba0 --- /dev/null +++ b/doxygen/inherit_graph_69.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_69.md5 b/doxygen/inherit_graph_69.md5 new file mode 100644 index 0000000000..be8daf8aa5 --- /dev/null +++ b/doxygen/inherit_graph_69.md5 @@ -0,0 +1 @@ +22f0592b903cd51abd0deff955b90730 \ No newline at end of file diff --git a/doxygen/inherit_graph_69.png b/doxygen/inherit_graph_69.png new file mode 100644 index 0000000000..f572111227 Binary files /dev/null and b/doxygen/inherit_graph_69.png differ diff --git a/doxygen/inherit_graph_7.map b/doxygen/inherit_graph_7.map new file mode 100644 index 0000000000..266f84ad22 --- /dev/null +++ b/doxygen/inherit_graph_7.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_7.md5 b/doxygen/inherit_graph_7.md5 new file mode 100644 index 0000000000..493a4bedbf --- /dev/null +++ b/doxygen/inherit_graph_7.md5 @@ -0,0 +1 @@ +b8b5b2fd047f3dd0af6a866e0a19c190 \ No newline at end of file diff --git a/doxygen/inherit_graph_7.png b/doxygen/inherit_graph_7.png new file mode 100644 index 0000000000..5acbe9fdbc Binary files /dev/null and b/doxygen/inherit_graph_7.png differ diff --git a/doxygen/inherit_graph_70.map b/doxygen/inherit_graph_70.map new file mode 100644 index 0000000000..1e31ae8cb1 --- /dev/null +++ b/doxygen/inherit_graph_70.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_70.md5 b/doxygen/inherit_graph_70.md5 new file mode 100644 index 0000000000..6cfc15bef4 --- /dev/null +++ b/doxygen/inherit_graph_70.md5 @@ -0,0 +1 @@ +2052218d74632c13da08a77d2c3f6802 \ No newline at end of file diff --git a/doxygen/inherit_graph_70.png b/doxygen/inherit_graph_70.png new file mode 100644 index 0000000000..80c638bc90 Binary files /dev/null and b/doxygen/inherit_graph_70.png differ diff --git a/doxygen/inherit_graph_71.map b/doxygen/inherit_graph_71.map new file mode 100644 index 0000000000..822ff6b185 --- /dev/null +++ b/doxygen/inherit_graph_71.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_71.md5 b/doxygen/inherit_graph_71.md5 new file mode 100644 index 0000000000..71fbd0e17a --- /dev/null +++ b/doxygen/inherit_graph_71.md5 @@ -0,0 +1 @@ +e50a780dc260ab5d544c52036b807d69 \ No newline at end of file diff --git a/doxygen/inherit_graph_71.png b/doxygen/inherit_graph_71.png new file mode 100644 index 0000000000..344122662e Binary files /dev/null and b/doxygen/inherit_graph_71.png differ diff --git a/doxygen/inherit_graph_72.map b/doxygen/inherit_graph_72.map new file mode 100644 index 0000000000..5c0d850464 --- /dev/null +++ b/doxygen/inherit_graph_72.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_72.md5 b/doxygen/inherit_graph_72.md5 new file mode 100644 index 0000000000..a50a2a4c6d --- /dev/null +++ b/doxygen/inherit_graph_72.md5 @@ -0,0 +1 @@ +6653674b7aea32eb26343d4b5395921a \ No newline at end of file diff --git a/doxygen/inherit_graph_72.png b/doxygen/inherit_graph_72.png new file mode 100644 index 0000000000..56f2eedab3 Binary files /dev/null and b/doxygen/inherit_graph_72.png differ diff --git a/doxygen/inherit_graph_73.map b/doxygen/inherit_graph_73.map new file mode 100644 index 0000000000..de23595076 --- /dev/null +++ b/doxygen/inherit_graph_73.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_73.md5 b/doxygen/inherit_graph_73.md5 new file mode 100644 index 0000000000..08034f8224 --- /dev/null +++ b/doxygen/inherit_graph_73.md5 @@ -0,0 +1 @@ +c48c0ca7d436250a88bce99d661bd944 \ No newline at end of file diff --git a/doxygen/inherit_graph_73.png b/doxygen/inherit_graph_73.png new file mode 100644 index 0000000000..4704fd1957 Binary files /dev/null and b/doxygen/inherit_graph_73.png differ diff --git a/doxygen/inherit_graph_74.map b/doxygen/inherit_graph_74.map new file mode 100644 index 0000000000..c1ecf6b9b2 --- /dev/null +++ b/doxygen/inherit_graph_74.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_74.md5 b/doxygen/inherit_graph_74.md5 new file mode 100644 index 0000000000..106e94a095 --- /dev/null +++ b/doxygen/inherit_graph_74.md5 @@ -0,0 +1 @@ +9a53181cf9ba5a01cb246cb748282769 \ No newline at end of file diff --git a/doxygen/inherit_graph_74.png b/doxygen/inherit_graph_74.png new file mode 100644 index 0000000000..d7164bfb91 Binary files /dev/null and b/doxygen/inherit_graph_74.png differ diff --git a/doxygen/inherit_graph_75.map b/doxygen/inherit_graph_75.map new file mode 100644 index 0000000000..8b7e2671aa --- /dev/null +++ b/doxygen/inherit_graph_75.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_75.md5 b/doxygen/inherit_graph_75.md5 new file mode 100644 index 0000000000..eba006ef02 --- /dev/null +++ b/doxygen/inherit_graph_75.md5 @@ -0,0 +1 @@ +26b9ba8c10c6355c3d5507930ed80703 \ No newline at end of file diff --git a/doxygen/inherit_graph_75.png b/doxygen/inherit_graph_75.png new file mode 100644 index 0000000000..26117f82ba Binary files /dev/null and b/doxygen/inherit_graph_75.png differ diff --git a/doxygen/inherit_graph_76.map b/doxygen/inherit_graph_76.map new file mode 100644 index 0000000000..974512913d --- /dev/null +++ b/doxygen/inherit_graph_76.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_76.md5 b/doxygen/inherit_graph_76.md5 new file mode 100644 index 0000000000..5b9774446f --- /dev/null +++ b/doxygen/inherit_graph_76.md5 @@ -0,0 +1 @@ +888ab5bc572d8787bffb439d48dc335e \ No newline at end of file diff --git a/doxygen/inherit_graph_76.png b/doxygen/inherit_graph_76.png new file mode 100644 index 0000000000..fa03d67df1 Binary files /dev/null and b/doxygen/inherit_graph_76.png differ diff --git a/doxygen/inherit_graph_77.map b/doxygen/inherit_graph_77.map new file mode 100644 index 0000000000..e3b5007e43 --- /dev/null +++ b/doxygen/inherit_graph_77.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_77.md5 b/doxygen/inherit_graph_77.md5 new file mode 100644 index 0000000000..a41966b70a --- /dev/null +++ b/doxygen/inherit_graph_77.md5 @@ -0,0 +1 @@ +345328b923481380e19c2d9d77a04855 \ No newline at end of file diff --git a/doxygen/inherit_graph_77.png b/doxygen/inherit_graph_77.png new file mode 100644 index 0000000000..3549449157 Binary files /dev/null and b/doxygen/inherit_graph_77.png differ diff --git a/doxygen/inherit_graph_78.map b/doxygen/inherit_graph_78.map new file mode 100644 index 0000000000..be911ffbc0 --- /dev/null +++ b/doxygen/inherit_graph_78.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_78.md5 b/doxygen/inherit_graph_78.md5 new file mode 100644 index 0000000000..8076c7f153 --- /dev/null +++ b/doxygen/inherit_graph_78.md5 @@ -0,0 +1 @@ +852887a7563faa1473bf4086460dc2ef \ No newline at end of file diff --git a/doxygen/inherit_graph_78.png b/doxygen/inherit_graph_78.png new file mode 100644 index 0000000000..adc2a955bf Binary files /dev/null and b/doxygen/inherit_graph_78.png differ diff --git a/doxygen/inherit_graph_79.map b/doxygen/inherit_graph_79.map new file mode 100644 index 0000000000..28cfc7cdf2 --- /dev/null +++ b/doxygen/inherit_graph_79.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_79.md5 b/doxygen/inherit_graph_79.md5 new file mode 100644 index 0000000000..cc9f2124bf --- /dev/null +++ b/doxygen/inherit_graph_79.md5 @@ -0,0 +1 @@ +07e3934aab74b22691b70a5161beda43 \ No newline at end of file diff --git a/doxygen/inherit_graph_79.png b/doxygen/inherit_graph_79.png new file mode 100644 index 0000000000..0a75838480 Binary files /dev/null and b/doxygen/inherit_graph_79.png differ diff --git a/doxygen/inherit_graph_8.map b/doxygen/inherit_graph_8.map new file mode 100644 index 0000000000..349ca6a86c --- /dev/null +++ b/doxygen/inherit_graph_8.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_8.md5 b/doxygen/inherit_graph_8.md5 new file mode 100644 index 0000000000..6fe03a5c86 --- /dev/null +++ b/doxygen/inherit_graph_8.md5 @@ -0,0 +1 @@ +8918162f5a3836aa5579ebb796bdadc5 \ No newline at end of file diff --git a/doxygen/inherit_graph_8.png b/doxygen/inherit_graph_8.png new file mode 100644 index 0000000000..a4930cabac Binary files /dev/null and b/doxygen/inherit_graph_8.png differ diff --git a/doxygen/inherit_graph_80.map b/doxygen/inherit_graph_80.map new file mode 100644 index 0000000000..6686adcca4 --- /dev/null +++ b/doxygen/inherit_graph_80.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/inherit_graph_80.md5 b/doxygen/inherit_graph_80.md5 new file mode 100644 index 0000000000..8344cdf1e0 --- /dev/null +++ b/doxygen/inherit_graph_80.md5 @@ -0,0 +1 @@ +d9e41c66f53910252a6d7b8ca902d2f6 \ No newline at end of file diff --git a/doxygen/inherit_graph_80.png b/doxygen/inherit_graph_80.png new file mode 100644 index 0000000000..75d12c2d15 Binary files /dev/null and b/doxygen/inherit_graph_80.png differ diff --git a/doxygen/inherit_graph_81.map b/doxygen/inherit_graph_81.map new file mode 100644 index 0000000000..94a3b599c0 --- /dev/null +++ b/doxygen/inherit_graph_81.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_81.md5 b/doxygen/inherit_graph_81.md5 new file mode 100644 index 0000000000..ff3cfa55d5 --- /dev/null +++ b/doxygen/inherit_graph_81.md5 @@ -0,0 +1 @@ +62da8b2e54224b169c5482b08c577c1c \ No newline at end of file diff --git a/doxygen/inherit_graph_81.png b/doxygen/inherit_graph_81.png new file mode 100644 index 0000000000..17d0deb78e Binary files /dev/null and b/doxygen/inherit_graph_81.png differ diff --git a/doxygen/inherit_graph_82.map b/doxygen/inherit_graph_82.map new file mode 100644 index 0000000000..239c4a5ae3 --- /dev/null +++ b/doxygen/inherit_graph_82.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_82.md5 b/doxygen/inherit_graph_82.md5 new file mode 100644 index 0000000000..11c83f9377 --- /dev/null +++ b/doxygen/inherit_graph_82.md5 @@ -0,0 +1 @@ +5ed58f496851ccf04f3f24ef75668e03 \ No newline at end of file diff --git a/doxygen/inherit_graph_82.png b/doxygen/inherit_graph_82.png new file mode 100644 index 0000000000..1317033b7b Binary files /dev/null and b/doxygen/inherit_graph_82.png differ diff --git a/doxygen/inherit_graph_83.map b/doxygen/inherit_graph_83.map new file mode 100644 index 0000000000..eb9e5a8b9a --- /dev/null +++ b/doxygen/inherit_graph_83.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_83.md5 b/doxygen/inherit_graph_83.md5 new file mode 100644 index 0000000000..e139964b09 --- /dev/null +++ b/doxygen/inherit_graph_83.md5 @@ -0,0 +1 @@ +6fff2bc84990098b730138ead65ce9e0 \ No newline at end of file diff --git a/doxygen/inherit_graph_83.png b/doxygen/inherit_graph_83.png new file mode 100644 index 0000000000..5b7555c2c9 Binary files /dev/null and b/doxygen/inherit_graph_83.png differ diff --git a/doxygen/inherit_graph_84.map b/doxygen/inherit_graph_84.map new file mode 100644 index 0000000000..603bbde11f --- /dev/null +++ b/doxygen/inherit_graph_84.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_84.md5 b/doxygen/inherit_graph_84.md5 new file mode 100644 index 0000000000..5ba0555cf1 --- /dev/null +++ b/doxygen/inherit_graph_84.md5 @@ -0,0 +1 @@ +cb8347940b7daeb1cc7b6532080f0571 \ No newline at end of file diff --git a/doxygen/inherit_graph_84.png b/doxygen/inherit_graph_84.png new file mode 100644 index 0000000000..1814b6a38b Binary files /dev/null and b/doxygen/inherit_graph_84.png differ diff --git a/doxygen/inherit_graph_85.map b/doxygen/inherit_graph_85.map new file mode 100644 index 0000000000..1e49277da2 --- /dev/null +++ b/doxygen/inherit_graph_85.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/inherit_graph_85.md5 b/doxygen/inherit_graph_85.md5 new file mode 100644 index 0000000000..406e59d523 --- /dev/null +++ b/doxygen/inherit_graph_85.md5 @@ -0,0 +1 @@ +61b2a5b479848a27b9211c18d4896e89 \ No newline at end of file diff --git a/doxygen/inherit_graph_85.png b/doxygen/inherit_graph_85.png new file mode 100644 index 0000000000..e89358d967 Binary files /dev/null and b/doxygen/inherit_graph_85.png differ diff --git a/doxygen/inherit_graph_86.map b/doxygen/inherit_graph_86.map new file mode 100644 index 0000000000..ebae4c67f8 --- /dev/null +++ b/doxygen/inherit_graph_86.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_86.md5 b/doxygen/inherit_graph_86.md5 new file mode 100644 index 0000000000..90ccadb898 --- /dev/null +++ b/doxygen/inherit_graph_86.md5 @@ -0,0 +1 @@ +fc455e8fd206aa656d2690b45d64bf56 \ No newline at end of file diff --git a/doxygen/inherit_graph_86.png b/doxygen/inherit_graph_86.png new file mode 100644 index 0000000000..81f423e6d5 Binary files /dev/null and b/doxygen/inherit_graph_86.png differ diff --git a/doxygen/inherit_graph_87.map b/doxygen/inherit_graph_87.map new file mode 100644 index 0000000000..9ddf9b1b5c --- /dev/null +++ b/doxygen/inherit_graph_87.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_87.md5 b/doxygen/inherit_graph_87.md5 new file mode 100644 index 0000000000..85f3bf8375 --- /dev/null +++ b/doxygen/inherit_graph_87.md5 @@ -0,0 +1 @@ +94df3a698bb48f7e8e5dd0cd40904d9e \ No newline at end of file diff --git a/doxygen/inherit_graph_87.png b/doxygen/inherit_graph_87.png new file mode 100644 index 0000000000..8ae622ef21 Binary files /dev/null and b/doxygen/inherit_graph_87.png differ diff --git a/doxygen/inherit_graph_88.map b/doxygen/inherit_graph_88.map new file mode 100644 index 0000000000..68de00abab --- /dev/null +++ b/doxygen/inherit_graph_88.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_88.md5 b/doxygen/inherit_graph_88.md5 new file mode 100644 index 0000000000..6d4cb8627a --- /dev/null +++ b/doxygen/inherit_graph_88.md5 @@ -0,0 +1 @@ +a5adaaa9e65217d72c2971e53a81b854 \ No newline at end of file diff --git a/doxygen/inherit_graph_88.png b/doxygen/inherit_graph_88.png new file mode 100644 index 0000000000..57e06513ba Binary files /dev/null and b/doxygen/inherit_graph_88.png differ diff --git a/doxygen/inherit_graph_89.map b/doxygen/inherit_graph_89.map new file mode 100644 index 0000000000..0a04c021da --- /dev/null +++ b/doxygen/inherit_graph_89.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_89.md5 b/doxygen/inherit_graph_89.md5 new file mode 100644 index 0000000000..5e9c5eefbe --- /dev/null +++ b/doxygen/inherit_graph_89.md5 @@ -0,0 +1 @@ +cb6a36dfc9496b4c4b1243978c2b4449 \ No newline at end of file diff --git a/doxygen/inherit_graph_89.png b/doxygen/inherit_graph_89.png new file mode 100644 index 0000000000..e5d49f4de3 Binary files /dev/null and b/doxygen/inherit_graph_89.png differ diff --git a/doxygen/inherit_graph_9.map b/doxygen/inherit_graph_9.map new file mode 100644 index 0000000000..a3966637dd --- /dev/null +++ b/doxygen/inherit_graph_9.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_9.md5 b/doxygen/inherit_graph_9.md5 new file mode 100644 index 0000000000..c4c505abe4 --- /dev/null +++ b/doxygen/inherit_graph_9.md5 @@ -0,0 +1 @@ +91a2aaa6c2bfa410ce6e09fcc2c3b288 \ No newline at end of file diff --git a/doxygen/inherit_graph_9.png b/doxygen/inherit_graph_9.png new file mode 100644 index 0000000000..80f193c7fc Binary files /dev/null and b/doxygen/inherit_graph_9.png differ diff --git a/doxygen/inherit_graph_90.map b/doxygen/inherit_graph_90.map new file mode 100644 index 0000000000..d0137e296a --- /dev/null +++ b/doxygen/inherit_graph_90.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_90.md5 b/doxygen/inherit_graph_90.md5 new file mode 100644 index 0000000000..5aa7eb0192 --- /dev/null +++ b/doxygen/inherit_graph_90.md5 @@ -0,0 +1 @@ +0768ac4da9f1fe1bbae6d585a1ea99ec \ No newline at end of file diff --git a/doxygen/inherit_graph_90.png b/doxygen/inherit_graph_90.png new file mode 100644 index 0000000000..98a2a35fd0 Binary files /dev/null and b/doxygen/inherit_graph_90.png differ diff --git a/doxygen/inherit_graph_91.map b/doxygen/inherit_graph_91.map new file mode 100644 index 0000000000..c8df132997 --- /dev/null +++ b/doxygen/inherit_graph_91.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_91.md5 b/doxygen/inherit_graph_91.md5 new file mode 100644 index 0000000000..980e74c491 --- /dev/null +++ b/doxygen/inherit_graph_91.md5 @@ -0,0 +1 @@ +2fc230d961d0744f3110eb0a02c9d7bf \ No newline at end of file diff --git a/doxygen/inherit_graph_91.png b/doxygen/inherit_graph_91.png new file mode 100644 index 0000000000..5f0fa7b6f5 Binary files /dev/null and b/doxygen/inherit_graph_91.png differ diff --git a/doxygen/inherit_graph_92.map b/doxygen/inherit_graph_92.map new file mode 100644 index 0000000000..6f06c37521 --- /dev/null +++ b/doxygen/inherit_graph_92.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_92.md5 b/doxygen/inherit_graph_92.md5 new file mode 100644 index 0000000000..1bb3343620 --- /dev/null +++ b/doxygen/inherit_graph_92.md5 @@ -0,0 +1 @@ +d88756fb47c7942bd4b7868f0e11dfe2 \ No newline at end of file diff --git a/doxygen/inherit_graph_92.png b/doxygen/inherit_graph_92.png new file mode 100644 index 0000000000..2bad0777a7 Binary files /dev/null and b/doxygen/inherit_graph_92.png differ diff --git a/doxygen/inherit_graph_93.map b/doxygen/inherit_graph_93.map new file mode 100644 index 0000000000..9bfc751359 --- /dev/null +++ b/doxygen/inherit_graph_93.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_93.md5 b/doxygen/inherit_graph_93.md5 new file mode 100644 index 0000000000..6bb8a63976 --- /dev/null +++ b/doxygen/inherit_graph_93.md5 @@ -0,0 +1 @@ +68470a99abca6eb73bc6ca9cc811f059 \ No newline at end of file diff --git a/doxygen/inherit_graph_93.png b/doxygen/inherit_graph_93.png new file mode 100644 index 0000000000..2f8bc286f0 Binary files /dev/null and b/doxygen/inherit_graph_93.png differ diff --git a/doxygen/inherit_graph_94.map b/doxygen/inherit_graph_94.map new file mode 100644 index 0000000000..5a48316005 --- /dev/null +++ b/doxygen/inherit_graph_94.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_94.md5 b/doxygen/inherit_graph_94.md5 new file mode 100644 index 0000000000..4e77cf4b89 --- /dev/null +++ b/doxygen/inherit_graph_94.md5 @@ -0,0 +1 @@ +8e48c99624f8c61964b5065e1bdefda9 \ No newline at end of file diff --git a/doxygen/inherit_graph_94.png b/doxygen/inherit_graph_94.png new file mode 100644 index 0000000000..5233ea3862 Binary files /dev/null and b/doxygen/inherit_graph_94.png differ diff --git a/doxygen/inherit_graph_95.map b/doxygen/inherit_graph_95.map new file mode 100644 index 0000000000..81042861b1 --- /dev/null +++ b/doxygen/inherit_graph_95.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_95.md5 b/doxygen/inherit_graph_95.md5 new file mode 100644 index 0000000000..5d6b62e3f2 --- /dev/null +++ b/doxygen/inherit_graph_95.md5 @@ -0,0 +1 @@ +46571129c8bd16efbaaee6e76ef08409 \ No newline at end of file diff --git a/doxygen/inherit_graph_95.png b/doxygen/inherit_graph_95.png new file mode 100644 index 0000000000..80bd94bba9 Binary files /dev/null and b/doxygen/inherit_graph_95.png differ diff --git a/doxygen/inherit_graph_96.map b/doxygen/inherit_graph_96.map new file mode 100644 index 0000000000..714b6fee82 --- /dev/null +++ b/doxygen/inherit_graph_96.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/inherit_graph_96.md5 b/doxygen/inherit_graph_96.md5 new file mode 100644 index 0000000000..89517066fb --- /dev/null +++ b/doxygen/inherit_graph_96.md5 @@ -0,0 +1 @@ +c99d8d73ff5766bfadd19cf5d600988d \ No newline at end of file diff --git a/doxygen/inherit_graph_96.png b/doxygen/inherit_graph_96.png new file mode 100644 index 0000000000..ff8e930d76 Binary files /dev/null and b/doxygen/inherit_graph_96.png differ diff --git a/doxygen/inherit_graph_97.map b/doxygen/inherit_graph_97.map new file mode 100644 index 0000000000..9b56b4976e --- /dev/null +++ b/doxygen/inherit_graph_97.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/doxygen/inherit_graph_97.md5 b/doxygen/inherit_graph_97.md5 new file mode 100644 index 0000000000..6ec386e1dd --- /dev/null +++ b/doxygen/inherit_graph_97.md5 @@ -0,0 +1 @@ +1a784cbfe89b73874362956ea84c7ae3 \ No newline at end of file diff --git a/doxygen/inherit_graph_97.png b/doxygen/inherit_graph_97.png new file mode 100644 index 0000000000..22ebcee734 Binary files /dev/null and b/doxygen/inherit_graph_97.png differ diff --git a/doxygen/inherit_graph_98.map b/doxygen/inherit_graph_98.map new file mode 100644 index 0000000000..39e19ca85b --- /dev/null +++ b/doxygen/inherit_graph_98.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/inherit_graph_98.md5 b/doxygen/inherit_graph_98.md5 new file mode 100644 index 0000000000..18a7f373ef --- /dev/null +++ b/doxygen/inherit_graph_98.md5 @@ -0,0 +1 @@ +8567a8a338256a3707a79e7509b1b758 \ No newline at end of file diff --git a/doxygen/inherit_graph_98.png b/doxygen/inherit_graph_98.png new file mode 100644 index 0000000000..4ce179c353 Binary files /dev/null and b/doxygen/inherit_graph_98.png differ diff --git a/doxygen/inherit_graph_99.map b/doxygen/inherit_graph_99.map new file mode 100644 index 0000000000..a6d23d307d --- /dev/null +++ b/doxygen/inherit_graph_99.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_99.md5 b/doxygen/inherit_graph_99.md5 new file mode 100644 index 0000000000..6a47cd1242 --- /dev/null +++ b/doxygen/inherit_graph_99.md5 @@ -0,0 +1 @@ +eee26040db0a164c303812a7fe4730a0 \ No newline at end of file diff --git a/doxygen/inherit_graph_99.png b/doxygen/inherit_graph_99.png new file mode 100644 index 0000000000..dabcbf5321 Binary files /dev/null and b/doxygen/inherit_graph_99.png differ diff --git a/doxygen/inherits.html b/doxygen/inherits.html new file mode 100644 index 0000000000..36f90c4ca1 --- /dev/null +++ b/doxygen/inherits.html @@ -0,0 +1,654 @@ + + + + + + + +Distributed Ranges: Class Hierarchy + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + +
+ + + + + + +
+ + + + +
+ + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + +
+
+ + + + diff --git a/doxygen/init_8hpp_source.html b/doxygen/init_8hpp_source.html new file mode 100644 index 0000000000..e676a6470a --- /dev/null +++ b/doxygen/init_8hpp_source.html @@ -0,0 +1,191 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/init.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
init.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <cassert>
+
8#include <memory>
+
9#include <span>
+
10#include <sycl/sycl.hpp>
+
11#include <type_traits>
+
12#include <vector>
+
13
+
14#include <dr/sp/algorithms/execution_policy.hpp>
+
15#include <dr/sp/util.hpp>
+
16#include <oneapi/dpl/execution>
+
17
+
18namespace dr::sp {
+
19
+
20namespace __detail {
+
21
+
22inline sycl::context *global_context_;
+
23
+
24inline std::vector<sycl::device> devices_;
+
25
+
26inline std::vector<sycl::queue> queues_;
+
27
+
28inline std::vector<oneapi::dpl::execution::device_policy<>> dpl_policies_;
+
29
+
30inline std::size_t ngpus_;
+
31
+
32inline sycl::context &global_context() { return *global_context_; }
+
33
+
34inline std::size_t ngpus() { return ngpus_; }
+
35
+
36inline std::span<sycl::device> global_devices() { return devices_; }
+
37
+
38} // namespace __detail
+
39
+
40inline sycl::context &context() { return __detail::global_context(); }
+
41
+
42inline std::span<sycl::device> devices() { return __detail::global_devices(); }
+
43
+
44inline std::size_t nprocs() { return __detail::ngpus(); }
+
45
+
46inline device_policy par_unseq;
+
47
+
48template <rng::range R>
+
49inline void init(R &&devices)
+
50 requires(
+
51 std::is_same_v<sycl::device, std::remove_cvref_t<rng::range_value_t<R>>>)
+
52{
+
53 __detail::devices_.assign(rng::begin(devices), rng::end(devices));
+
54 __detail::global_context_ = new sycl::context(__detail::devices_);
+
55 __detail::ngpus_ = rng::size(__detail::devices_);
+
56
+
57 for (auto &&device : __detail::devices_) {
+
58 sycl::queue q(*__detail::global_context_, device);
+
59 __detail::queues_.push_back(q);
+
60
+
61 __detail::dpl_policies_.emplace_back(__detail::queues_.back());
+
62 }
+
63
+
64 par_unseq = device_policy(__detail::devices_);
+
65}
+
66
+
67template <__detail::sycl_device_selector Selector>
+
68inline void init(Selector &&selector) {
+
69 auto devices = get_numa_devices(selector);
+
70 init(devices);
+
71}
+
72
+
73inline void init() { init(sycl::default_selector_v); }
+
74
+
75inline void finalize() {
+
76 __detail::dpl_policies_.clear();
+
77 __detail::queues_.clear();
+
78 __detail::devices_.clear();
+
79 delete __detail::global_context_;
+
80}
+
81
+
82namespace __detail {
+
83
+
84inline sycl::queue &queue(std::size_t rank) { return queues_[rank]; }
+
85
+
86// Retrieve global queues because of CMPLRLLVM-47008
+
87inline sycl::queue &queue(const sycl::device &device) {
+
88 for (std::size_t rank = 0; rank < sp::nprocs(); rank++) {
+
89 if (sp::devices()[rank] == device) {
+
90 return queue(rank);
+
91 }
+
92 }
+
93 assert(false);
+
94 // Reaches here with -DNDEBUG
+
95 return queue(0);
+
96}
+
97
+
98inline sycl::queue &default_queue() { return queue(0); }
+
99
+
100inline auto &dpl_policy(std::size_t rank) {
+
101 return __detail::dpl_policies_[rank];
+
102}
+
103
+
104} // namespace __detail
+
105
+
106} // namespace dr::sp
+
+ + + + diff --git a/doxygen/iterator__adaptor_8hpp_source.html b/doxygen/iterator__adaptor_8hpp_source.html new file mode 100644 index 0000000000..de8f713dd1 --- /dev/null +++ b/doxygen/iterator__adaptor_8hpp_source.html @@ -0,0 +1,287 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/iterator_adaptor.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
iterator_adaptor.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <iterator>
+
8#include <type_traits>
+
9
+
10#include <dr/detail/ranges_shim.hpp>
+
11
+
12namespace dr {
+
13
+
14namespace {
+
15
+
16template <typename R>
+
17concept has_segments_method = requires(R r) {
+
18 { r.segments() };
+
19};
+
20
+
21} // namespace
+
22
+
23template <typename Accessor> class iterator_adaptor {
+
24public:
+
25 using accessor_type = Accessor;
+
26 using const_accessor_type = typename Accessor::const_iterator_accessor;
+
27 using nonconst_accessor_type = typename Accessor::nonconst_iterator_accessor;
+
28
+
29 using difference_type = typename Accessor::difference_type;
+
30 using value_type = typename Accessor::value_type;
+ + +
33 using reference = typename Accessor::reference;
+
34 using iterator_category = typename Accessor::iterator_category;
+
35
+ +
37
+
38 static_assert(std::is_same_v<iterator, iterator_adaptor<Accessor>>);
+
39
+
40 iterator_adaptor() = default;
+
41 ~iterator_adaptor() = default;
+
42 iterator_adaptor(const iterator_adaptor &) = default;
+
43 iterator_adaptor &operator=(const iterator_adaptor &) = default;
+
44
+
45 template <typename... Args>
+
46 requires(
+
47 sizeof...(Args) >= 1 &&
+
48 !((sizeof...(Args) == 1 &&
+
49 (std::is_same_v<nonconst_iterator, std::decay_t<Args>> || ...)) ||
+
50 (std::is_same_v<const_iterator, std::decay_t<Args>> || ...) ||
+
51 (std::is_same_v<nonconst_accessor_type, std::decay_t<Args>> || ...) ||
+
52 (std::is_same_v<const_accessor_type, std::decay_t<Args>> || ...)) &&
+
53 std::is_constructible_v<accessor_type, Args...>)
+
54 iterator_adaptor(Args &&...args) : accessor_(std::forward<Args>(args)...) {}
+
55
+
56 iterator_adaptor(const accessor_type &accessor) : accessor_(accessor) {}
+
57 iterator_adaptor(const const_accessor_type &accessor)
+
58 requires(!std::is_same_v<accessor_type, const_accessor_type>)
+
59 : accessor_(accessor) {}
+
60
+
61 operator const_iterator() const
+
62 requires(!std::is_same_v<iterator, const_iterator>)
+
63 {
+
64 return const_iterator(accessor_);
+
65 }
+
66
+
67 bool operator==(const_iterator other) const {
+
68 return accessor_ == other.accessor_;
+
69 }
+
70
+
71 bool operator!=(const_iterator other) const { return !(*this == other); }
+
72
+
73 bool operator<(const_iterator other) const
+
74 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
75 {
+
76 return accessor_ < other.accessor_;
+
77 }
+
78
+
79 bool operator<=(const_iterator other) const
+
80 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
81 {
+
82 return *this < other || *this == other;
+
83 }
+
84
+
85 bool operator>(const_iterator other) const
+
86 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
87 {
+
88 return !(*this <= other);
+
89 }
+
90
+
91 bool operator>=(const_iterator other) const
+
92 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
93 {
+
94 return !(*this < other);
+
95 }
+
96
+
97 reference operator*() const { return *accessor_; }
+
98
+
99 reference operator[](difference_type offset) const
+
100 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
101 {
+
102 return *(*this + offset);
+
103 }
+
104
+
105 iterator &operator+=(difference_type offset) noexcept
+
106 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
107 {
+
108 accessor_ += offset;
+
109 return *this;
+
110 }
+
111
+
112 iterator &operator-=(difference_type offset) noexcept
+
113 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
114 {
+
115 accessor_ += -offset;
+
116 return *this;
+
117 }
+
118
+
119 iterator operator+(difference_type offset) const
+
120 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
121 {
+
122 iterator other = *this;
+
123 other += offset;
+
124 return other;
+
125 }
+
126
+
127 iterator operator-(difference_type offset) const
+
128 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
129 {
+
130 iterator other = *this;
+
131 other += -offset;
+
132 return other;
+
133 }
+
134
+
135 difference_type operator-(const_iterator other) const
+
136 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
137 {
+
138 return accessor_ - other.accessor_;
+
139 }
+
140
+
141 iterator &operator++() noexcept
+
142 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
143 {
+
144 *this += 1;
+
145 return *this;
+
146 }
+
147
+
148 iterator &operator++() noexcept
+
149 requires(
+
150 !std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
151 {
+
152 ++accessor_;
+
153 return *this;
+
154 }
+
155
+
156 iterator operator++(int) noexcept {
+
157 iterator other = *this;
+
158 ++(*this);
+
159 return other;
+
160 }
+
161
+
162 iterator &operator--() noexcept
+
163 requires(
+
164 std::is_same_v<iterator_category, std::random_access_iterator_tag> ||
+
165 std::is_same_v<iterator_category, std::bidirectional_iterator_tag>)
+
166 {
+
167 *this += -1;
+
168 return *this;
+
169 }
+
170
+
171 iterator operator--(int) noexcept
+
172 requires(
+
173 std::is_same_v<iterator_category, std::random_access_iterator_tag> ||
+
174 std::is_same_v<iterator_category, std::bidirectional_iterator_tag>)
+
175 {
+
176 iterator other = *this;
+
177 --(*this);
+
178 return other;
+
179 }
+
180
+
181 auto segments() const noexcept
+
182 requires(has_segments_method<accessor_type>)
+
183 {
+
184 return accessor_.segments();
+
185 }
+
186
+
187 friend iterator operator+(difference_type n, iterator iter)
+
188 requires(std::is_same_v<iterator_category, std::random_access_iterator_tag>)
+
189 {
+
190 return iter + n;
+
191 }
+
192
+
193private:
+
194 friend const_iterator;
+
195 friend nonconst_iterator;
+
196
+
197 accessor_type accessor_;
+
198};
+
199
+
200} // namespace dr
+
Definition: iterator_adaptor.hpp:23
+
Definition: iterator_adaptor.hpp:17
+
+ + + + diff --git a/doxygen/jquery.js b/doxygen/jquery.js new file mode 100644 index 0000000000..1dffb65b58 --- /dev/null +++ b/doxygen/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doxygen/local__gemm_8hpp_source.html b/doxygen/local__gemm_8hpp_source.html new file mode 100644 index 0000000000..7b7f7343b6 --- /dev/null +++ b/doxygen/local__gemm_8hpp_source.html @@ -0,0 +1,169 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/matrix/local_gemm.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
local_gemm.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/sp/views/dense_matrix_view.hpp>
+
8
+
9#ifdef USE_MKL
+
10#include <oneapi/mkl.hpp>
+
11#endif
+
12
+
13namespace dr::sp {
+
14
+
15namespace __detail {
+
16
+
17template <typename T>
+
18auto custom_gemm(sycl::queue &q, sp::dense_matrix_view<T> a,
+
19 sp::dense_matrix_view<T> b, sp::dense_matrix_view<T> c,
+
20 const std::vector<sycl::event> &dependencies = {}) {
+
21 assert(c.shape()[0] == a.shape()[0]);
+
22 assert(c.shape()[1] == b.shape()[1]);
+
23 assert(a.shape()[1] == b.shape()[0]);
+
24
+
25 std::size_t M = c.shape()[0];
+
26 std::size_t N = c.shape()[1];
+
27 std::size_t K = a.shape()[1];
+
28
+
29 auto a_p = a.data();
+
30 auto b_p = b.data();
+
31 auto c_p = c.data();
+
32
+
33 auto e = q.parallel_for(sycl::range<3>{M, K, N}, [=](auto idx) {
+
34 auto i = idx[0];
+
35 auto k = idx[1];
+
36 auto j = idx[2];
+
37
+
38 sycl::atomic_ref<T, sycl::memory_order::relaxed, sycl::memory_scope::device>
+
39 c_ref(c_p[i * N + j]);
+
40
+
41 c_ref += a_p[i * K + k] * b_p[k * N + j];
+
42 });
+
43 return e;
+
44}
+
45
+
46#ifdef USE_MKL
+
47
+
48template <typename T>
+
49auto mkl_gemm(sycl::queue &q, sp::dense_matrix_view<T> a,
+
50 sp::dense_matrix_view<T> b, sp::dense_matrix_view<T> c,
+
51 const std::vector<sycl::event> &dependencies = {}) {
+
52 assert(c.shape()[0] == a.shape()[0]);
+
53 assert(c.shape()[1] == b.shape()[1]);
+
54 assert(a.shape()[1] == b.shape()[0]);
+
55
+
56 auto event = oneapi::mkl::blas::row_major::gemm(
+
57 q, oneapi::mkl::transpose::nontrans, oneapi::mkl::transpose::nontrans,
+
58 c.shape()[0], c.shape()[1], a.shape()[1], T(1), a.data(), a.ld(),
+
59 b.data(), b.ld(), T(1), c.data(), c.ld(), dependencies);
+
60
+
61 return event;
+
62}
+
63
+
64template <typename T>
+
65auto local_gemm(sycl::queue &q, sp::dense_matrix_view<T> a,
+
66 sp::dense_matrix_view<T> b, sp::dense_matrix_view<T> c,
+
67 const std::vector<sycl::event> &dependencies = {}) {
+
68 return mkl_gemm(q, a, b, c, dependencies);
+
69}
+
70
+
71#else
+
72
+
73template <typename T>
+
74auto local_gemm(sycl::queue &q, sp::dense_matrix_view<T> a,
+
75 sp::dense_matrix_view<T> b, sp::dense_matrix_view<T> c,
+
76 const std::vector<sycl::event> &dependencies = {}) {
+
77 return custom_gemm(q, a, b, c, dependencies);
+
78}
+
79
+
80#endif
+
81
+
82} // namespace __detail
+
83
+
84} // namespace dr::sp
+
+ + + + diff --git a/doxygen/local__gemv_8hpp_source.html b/doxygen/local__gemv_8hpp_source.html new file mode 100644 index 0000000000..e39aafc62c --- /dev/null +++ b/doxygen/local__gemv_8hpp_source.html @@ -0,0 +1,185 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/matrix/local_gemv.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
local_gemv.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/detail/ranges_shim.hpp>
+
8#include <dr/sp/containers/sparse_matrix.hpp>
+
9#include <dr/sp/util.hpp>
+
10
+
11#ifdef USE_MKL
+
12#include <oneapi/mkl.hpp>
+
13#endif
+
14
+
15namespace dr::sp {
+
16
+
17namespace __detail {
+
18
+
19template <typename T, typename I, std::random_access_iterator Iter,
+
20 typename... Args>
+
21 requires(std::is_same_v<std::iter_value_t<Iter>, T>)
+
22auto custom_gemv(sycl::queue &q, csr_matrix_view<T, I, Args...> a, Iter b,
+
23 Iter c, const std::vector<sycl::event> &dependencies = {}) {
+
24 std::size_t wg = 32;
+
25
+
26 auto event = q.submit([&](auto &&h) {
+
27 h.depends_on(dependencies);
+
28 h.parallel_for(sycl::nd_range<1>(a.shape()[0] * wg, wg), [=](auto item) {
+
29 auto row_index = item.get_group(0);
+
30 auto local_id = item.get_local_id();
+
31 auto group_size = item.get_local_range(0);
+
32
+
33 auto row = a.row(row_index);
+
34
+
35 for (std::size_t idx = local_id; idx < row.size(); idx += group_size) {
+
36 auto &&[index, a_v] = row[idx];
+
37 auto &&[i, k] = index;
+
38
+
39 auto &&b_v = *(b + k);
+
40 auto &&c_v = *(c + i);
+
41
+
42 sycl::atomic_ref<T, sycl::memory_order::relaxed,
+
43 sycl::memory_scope::device>
+
44 c_ref(c_v);
+
45
+
46 c_ref += a_v * b_v;
+
47 }
+
48 });
+
49 });
+
50 return event;
+
51}
+
52
+
53#ifdef USE_MKL
+
54
+
55template <typename T, typename I, std::random_access_iterator Iter,
+
56 typename... Args>
+
57 requires(std::is_same_v<std::iter_value_t<Iter>, T>)
+
58auto mkl_gemv(sycl::queue &q, csr_matrix_view<T, I, Args...> a, Iter b, Iter c,
+
59 const std::vector<sycl::event> &dependencies = {}) {
+
60
+
61 oneapi::mkl::sparse::matrix_handle_t a_handle;
+
62 oneapi::mkl::sparse::init_matrix_handle(&a_handle);
+
63
+
64 auto rowptr = dr::sp::__detail::local(a.rowptr_data());
+
65 auto colind = dr::sp::__detail::local(a.colind_data());
+
66 auto values = dr::sp::__detail::local(a.values_data());
+
67
+
68 oneapi::mkl::sparse::set_csr_data(q, a_handle, a.shape()[0], a.shape()[1],
+
69 oneapi::mkl::index_base::zero, rowptr,
+
70 colind, values);
+
71
+
72 auto event =
+
73 oneapi::mkl::sparse::gemv(q, oneapi::mkl::transpose::nontrans, T(1),
+
74 a_handle, b, T(1), c, dependencies);
+
75 return event;
+
76}
+
77
+
78template <typename T, typename I, std::random_access_iterator Iter,
+
79 typename... Args>
+
80 requires(std::is_same_v<std::iter_value_t<Iter>, T>)
+
81auto local_gemv(sycl::queue &q, csr_matrix_view<T, I, Args...> a, Iter b,
+
82 Iter c, const std::vector<sycl::event> &dependencies = {}) {
+
83 return mkl_gemv(q, a, b, c, dependencies);
+
84}
+
85
+
86#else
+
87
+
88template <typename T, typename I, std::random_access_iterator Iter,
+
89 typename... Args>
+
90 requires(std::is_same_v<std::iter_value_t<Iter>, T>)
+
91auto local_gemv(sycl::queue &q, csr_matrix_view<T, I, Args...> a, Iter b,
+
92 Iter c, const std::vector<sycl::event> &dependencies = {}) {
+
93 return custom_gemv(q, a, b, c, dependencies);
+
94}
+
95
+
96#endif
+
97
+
98} // namespace __detail
+
99
+
100} // namespace dr::sp
+
+ + + + diff --git a/doxygen/logger_8hpp_source.html b/doxygen/logger_8hpp_source.html new file mode 100644 index 0000000000..aaf4c3ff8c --- /dev/null +++ b/doxygen/logger_8hpp_source.html @@ -0,0 +1,203 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/logger.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
logger.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <chrono>
+
8#include <fstream>
+
9#include <iostream>
+
10
+
11#include <vendor/source_location/source_location.hpp>
+
12
+
13#include <dr/detail/format_shim.hpp>
+
14#include <dr/detail/ranges_shim.hpp>
+
15
+
16namespace dr {
+
17
+
18class timer {
+
19public:
+
20 timer() : begin_(std::chrono::high_resolution_clock::now()) {}
+
21
+
22 auto elapsed() {
+
23 auto end = std::chrono::high_resolution_clock::now();
+
24 return std::chrono::duration<double>(end - begin_).count();
+
25 }
+
26
+
27private:
+
28 std::chrono::time_point<std::chrono::high_resolution_clock> begin_;
+
29};
+
30
+
31class logger {
+
32public:
+
33 enum filters { base, for_each, transpose, mdspan_view, mpi, last };
+
34
+
35 logger() { rng::fill(enabled_, true); }
+
36
+
37 void set_file(std::ofstream &fout) { fout_ = &fout; }
+
38
+
39 void filter(const std::vector<std::string> &names) {
+
40 if (names.size() == 0) {
+
41 return;
+
42 }
+
43
+
44 // Disable everything
+
45 rng::fill(enabled_, false);
+
46
+
47 // Enabled selected filters
+
48 for (const auto &name : names) {
+
49 std::size_t index = filters::last;
+
50 for (std::size_t i = 0; i < filter_names_.size(); i++) {
+
51 if (name == filter_names_[i]) {
+
52 index = i;
+
53 }
+
54 }
+
55 if (index == filters::last) {
+
56 std::cerr << "Ignoring unrecognized filter: " << name << "\n";
+
57 } else {
+
58 enabled_[index] = true;
+
59 }
+
60 }
+
61 }
+
62
+
63#ifdef DR_FORMAT
+
64
+
65 template <typename... Args>
+
66 void debug(const nostd::source_location &location,
+
67 fmt::format_string<Args...> format, Args &&...args) {
+
68 if (fout_ && enabled_[filters::base]) {
+
69 *fout_ << fmt::format(format, std::forward<Args>(args)...) << " <"
+
70 << location.file_name() << ":" << location.line() << ">\n";
+
71 fout_->flush();
+
72 }
+
73 }
+
74
+
75 template <typename... Args>
+
76 void debug(fmt::format_string<Args...> format, Args &&...args) {
+
77 debug(filters::base, format, std::forward<Args>(args)...);
+
78 }
+
79
+
80 template <typename... Args>
+
81 void debug(filters filter, fmt::format_string<Args...> format,
+
82 Args &&...args) {
+
83 if (fout_ && enabled_[filter]) {
+
84 *fout_ << fmt::format(format, std::forward<Args>(args)...);
+
85 fout_->flush();
+
86 }
+
87 }
+
88
+
89#else
+
90
+
91 template <typename... Args>
+
92 void debug(const nostd::source_location &location, std::string format,
+
93 Args &&...args) {}
+
94
+
95 template <typename... Args> void debug(std::string format, Args &&...args) {}
+
96
+
97 template <typename... Args>
+
98 void debug(filters filter, std::string format, Args &&...args) {}
+
99
+
100#endif
+
101
+
102private:
+
103 std::ofstream *fout_ = nullptr;
+
104 std::array<bool, filters::last> enabled_;
+
105 std::array<std::string, filters::last> filter_names_ = {
+
106 "base", "for_each", "transpose", "mdspan_view", "mpi"};
+
107};
+
108
+
109inline logger drlog;
+
110
+
111#define DRLOG(...) \
+
112 dr::drlog.debug(nostd::source_location::current(), __VA_ARGS__)
+
113
+
114} // namespace dr
+
Definition: index.hpp:34
+
Definition: logger.hpp:31
+
Definition: logger.hpp:18
+
Definition: source_location.hpp:13
+
+ + + + diff --git a/doxygen/matrix__algorithms_8hpp_source.html b/doxygen/matrix__algorithms_8hpp_source.html new file mode 100644 index 0000000000..4fcca7b03d --- /dev/null +++ b/doxygen/matrix__algorithms_8hpp_source.html @@ -0,0 +1,93 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/matrix/matrix_algorithms.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
matrix_algorithms.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/sp/algorithms/matrix/gemm.hpp>
+
8#include <dr/sp/algorithms/matrix/gemv.hpp>
+
+ + + + diff --git a/doxygen/matrix__entry_8hpp_source.html b/doxygen/matrix__entry_8hpp_source.html new file mode 100644 index 0000000000..e6b77e120a --- /dev/null +++ b/doxygen/matrix__entry_8hpp_source.html @@ -0,0 +1,318 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/matrix_entry.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
matrix_entry.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <concepts>
+
8#include <limits>
+
9#include <type_traits>
+
10
+
11#include <dr/detail/index.hpp>
+
12
+
13namespace dr::sp {
+
14
+
15template <typename T, typename I = std::size_t> class matrix_entry {
+
16public:
+
17 using index_type = I;
+
18 using map_type = T;
+
19
+
20 matrix_entry(dr::index<I> index, const map_type &value)
+
21 : index_(index), value_(value) {}
+
22 matrix_entry(dr::index<I> index, map_type &&value)
+
23 : index_(index), value_(std::move(value)) {}
+
24
+
25 template <typename U>
+
26 requires(std::is_constructible_v<T, U>)
+ +
28 : index_(index), value_(std::forward<U>(value)) {}
+
29
+
30 template <typename Entry>
+
31 matrix_entry(Entry &&entry)
+
32 : index_(std::get<0>(entry)), value_(std::get<1>(entry)) {}
+
33
+
34 template <std::size_t Index> auto get() const noexcept {
+
35 if constexpr (Index == 0) {
+
36 return index();
+
37 }
+
38 if constexpr (Index == 1) {
+
39 return value();
+
40 }
+
41 }
+
42
+
43 operator std::pair<std::pair<I, I>, T>() const noexcept {
+
44 return {{index_[0], index_[1]}, value_};
+
45 }
+
46
+
47 dr::index<I> index() const noexcept { return index_; }
+
48
+
49 map_type value() const noexcept { return value_; }
+
50
+
51 template <std::integral U>
+
52 requires(!std::is_same_v<I, U> &&
+
53 std::numeric_limits<U>::max() >= std::numeric_limits<I>::max())
+
54 operator matrix_entry<T, U>() const noexcept {
+
55 return matrix_entry<T, U>(index_, value_);
+
56 }
+
57
+
58 template <std::integral U>
+
59 requires(!std::is_const_v<T> && !std::is_same_v<I, U> &&
+
60 std::numeric_limits<U>::max() >= std::numeric_limits<I>::max())
+
61 operator matrix_entry<std::add_const_t<T>, U>() const noexcept {
+
62 return matrix_entry<std::add_const_t<T>, U>(index_, value_);
+
63 }
+
64
+
65 bool operator<(const matrix_entry &other) const noexcept {
+
66 if (index()[0] < other.index()[0]) {
+
67 return true;
+
68 } else if (index()[0] == other.index()[0] &&
+
69 index()[1] < other.index()[1]) {
+
70 return true;
+
71 }
+
72 return false;
+
73 }
+
74
+
75 matrix_entry() = default;
+
76 ~matrix_entry() = default;
+
77
+
78 matrix_entry(const matrix_entry &) = default;
+
79 matrix_entry(matrix_entry &&) = default;
+
80 matrix_entry &operator=(const matrix_entry &) = default;
+
81 matrix_entry &operator=(matrix_entry &&) = default;
+
82
+
83private:
+
84 dr::index<I> index_;
+
85 map_type value_;
+
86};
+
87
+
88} // namespace dr::sp
+
89
+
90namespace std {
+
91
+
92template <typename T, typename I>
+
93 requires(!std::is_const_v<T>)
+ + +
96 a = b;
+
97 b = other;
+
98}
+
99
+
100template <std::size_t Index, typename T, typename I>
+
101struct tuple_element<Index, dr::sp::matrix_entry<T, I>>
+
102 : tuple_element<Index, std::tuple<dr::index<I>, T>> {};
+
103
+
104template <typename T, typename I>
+
105struct tuple_size<dr::sp::matrix_entry<T, I>> : integral_constant<size_t, 2> {};
+
106
+
107} // namespace std
+
108
+
109namespace dr::sp {
+
110
+
111template <typename T, typename I = std::size_t, typename TRef = T &>
+ +
113public:
+
114 using scalar_type = T;
+
115 using index_type = I;
+
116
+
117 using key_type = dr::index<I>;
+
118 using map_type = T;
+
119
+
120 using scalar_reference = TRef;
+
121
+ +
123
+
124 matrix_ref(dr::index<I> index, scalar_reference value)
+
125 : index_(index), value_(value) {}
+
126
+
127 operator value_type() const noexcept { return value_type(index_, value_); }
+
128
+
129 operator std::pair<std::pair<I, I>, T>() const noexcept {
+
130 return {{index_[0], index_[1]}, value_};
+
131 }
+
132
+
133 template <std::size_t Index>
+
134 decltype(auto) get() const noexcept
+
135 requires(Index <= 1)
+
136 {
+
137 if constexpr (Index == 0) {
+
138 return index();
+
139 }
+
140 if constexpr (Index == 1) {
+
141 return value();
+
142 }
+
143 }
+
144
+
145 dr::index<I> index() const noexcept { return index_; }
+
146
+
147 scalar_reference value() const noexcept { return value_; }
+
148
+
149 template <std::integral U>
+
150 requires(!std::is_same_v<I, U> &&
+
151 std::numeric_limits<U>::max() >= std::numeric_limits<I>::max())
+
152 operator matrix_ref<T, U, TRef>() const noexcept {
+
153 return matrix_ref<T, U, TRef>(index_, value_);
+
154 }
+
155
+
156 template <std::integral U>
+
157 requires(!std::is_const_v<T> && !std::is_same_v<I, U> &&
+
158 std::numeric_limits<U>::max() >= std::numeric_limits<I>::max())
+
159 operator matrix_ref<std::add_const_t<T>, U, TRef>() const noexcept {
+
160 return matrix_ref<std::add_const_t<T>, U, TRef>(index_, value_);
+
161 }
+
162
+
163 bool operator<(matrix_entry<T, I> other) const noexcept {
+
164 if (index()[0] < other.index()[0]) {
+
165 return true;
+
166 } else if (index()[0] == other.index()[0] &&
+
167 index()[1] < other.index()[1]) {
+
168 return true;
+
169 }
+
170 return false;
+
171 }
+
172
+
173 matrix_ref() = delete;
+
174 ~matrix_ref() = default;
+
175
+
176 matrix_ref(const matrix_ref &) = default;
+
177 matrix_ref &operator=(const matrix_ref &) = delete;
+
178 matrix_ref(matrix_ref &&) = default;
+
179 matrix_ref &operator=(matrix_ref &&) = default;
+
180
+
181private:
+
182 dr::index<I> index_;
+
183 scalar_reference value_;
+
184};
+
185
+
186} // namespace dr::sp
+
187
+
188namespace std {
+
189
+
190template <typename T, typename I, typename TRef>
+
191 requires(!std::is_const_v<T>)
+ + +
194 a = b;
+
195 b = other;
+
196}
+
197
+
198template <std::size_t Index, typename T, typename I, typename TRef>
+
199struct tuple_element<Index, dr::sp::matrix_ref<T, I, TRef>>
+
200 : tuple_element<Index, std::tuple<dr::index<I>, TRef>> {};
+
201
+
202template <typename T, typename I, typename TRef>
+
203struct tuple_size<dr::sp::matrix_ref<T, I, TRef>>
+
204 : integral_constant<std::size_t, 2> {};
+
205
+
206template <std::size_t Index, typename T, typename I, typename TRef>
+
207inline decltype(auto) get(dr::sp::matrix_ref<T, I, TRef> ref)
+
208 requires(Index <= 1)
+
209{
+
210 if constexpr (Index == 0) {
+
211 return ref.index();
+
212 }
+
213 if constexpr (Index == 1) {
+
214 return ref.value();
+
215 }
+
216}
+
217
+
218template <std::size_t Index, typename T, typename I, typename TRef>
+
219inline decltype(auto) get(dr::sp::matrix_entry<T, I> entry)
+
220 requires(Index <= 1)
+
221{
+
222 if constexpr (Index == 0) {
+
223 return entry.index();
+
224 }
+
225 if constexpr (Index == 1) {
+
226 return entry.value();
+
227 }
+
228}
+
229
+
230} // namespace std
+
Definition: index.hpp:34
+
Definition: matrix_entry.hpp:15
+
Definition: matrix_entry.hpp:112
+
+ + + + diff --git a/doxygen/matrix__io_8hpp_source.html b/doxygen/matrix__io_8hpp_source.html new file mode 100644 index 0000000000..9e2348c1a1 --- /dev/null +++ b/doxygen/matrix__io_8hpp_source.html @@ -0,0 +1,371 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/util/matrix_io.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
matrix_io.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <algorithm>
+
8#include <cassert>
+
9#include <fstream>
+
10#include <sstream>
+
11#include <string>
+
12#include <tuple>
+
13#include <vector>
+
14
+
15#include <dr/sp/util/coo_matrix.hpp>
+
16#include <dr/sp/views/csr_matrix_view.hpp>
+
17
+
18namespace dr::sp {
+
19
+
20namespace __detail {
+
21
+
22// Preconditions:
+
23// 1) `tuples` sorted by row, column
+
24// 2) `tuples` has shape `shape`
+
25// 3) `tuples` has `nnz` elements
+
26template <typename Tuples, typename Allocator>
+
27auto convert_to_csr(Tuples &&tuples, dr::index<> shape, std::size_t nnz,
+
28 Allocator &&allocator) {
+
29 auto &&[index, v] = *tuples.begin();
+
30 auto &&[i, j] = index;
+
31
+
32 using T = std::remove_reference_t<decltype(v)>;
+
33 using I = std::remove_reference_t<decltype(i)>;
+
34
+
35 typename std::allocator_traits<Allocator>::template rebind_alloc<I>
+
36 i_allocator(allocator);
+
37
+
38 T *values = allocator.allocate(nnz);
+
39 I *rowptr = i_allocator.allocate(shape[0] + 1);
+
40 I *colind = i_allocator.allocate(nnz);
+
41
+
42 rowptr[0] = 0;
+
43
+
44 std::size_t r = 0;
+
45 std::size_t c = 0;
+
46 for (auto iter = tuples.begin(); iter != tuples.end(); ++iter) {
+
47 auto &&[index, value] = *iter;
+
48 auto &&[i, j] = index;
+
49
+
50 values[c] = value;
+
51 colind[c] = j;
+
52
+
53 while (r < i) {
+
54 assert(r + 1 <= shape[0]);
+
55 // throw std::runtime_error("csr_matrix_impl_: given invalid matrix");
+
56 rowptr[r + 1] = c;
+
57 r++;
+
58 }
+
59 c++;
+
60
+
61 assert(c <= nnz);
+
62 // throw std::runtime_error("csr_matrix_impl_: given invalid matrix");
+
63 }
+
64
+
65 for (; r < shape[0]; r++) {
+
66 rowptr[r + 1] = nnz;
+
67 }
+
68
+
69 return csr_matrix_view(values, rowptr, colind,
+
70 dr::index<I>(shape[0], shape[1]), nnz, 0);
+
71}
+
72
+
75template <typename T, typename I = std::size_t>
+
76inline coo_matrix<T, I> mmread(std::string file_path, bool one_indexed = true) {
+
77 using size_type = std::size_t;
+
78
+
79 std::ifstream f;
+
80
+
81 f.open(file_path.c_str());
+
82
+
83 if (!f.is_open()) {
+
84 // TODO better choice of exception.
+
85 throw std::runtime_error("mmread: cannot open " + file_path);
+
86 }
+
87
+
88 std::string buf;
+
89
+
90 // Make sure the file is matrix market matrix, coordinate, and check whether
+
91 // it is symmetric. If the matrix is symmetric, non-diagonal elements will
+
92 // be inserted in both (i, j) and (j, i). Error out if skew-symmetric or
+
93 // Hermitian.
+
94 std::getline(f, buf);
+
95 std::istringstream ss(buf);
+
96 std::string item;
+
97 ss >> item;
+
98 if (item != "%%MatrixMarket") {
+
99 throw std::runtime_error(file_path +
+
100 " could not be parsed as a Matrix Market file.");
+
101 }
+
102 ss >> item;
+
103 if (item != "matrix") {
+
104 throw std::runtime_error(file_path +
+
105 " could not be parsed as a Matrix Market file.");
+
106 }
+
107 ss >> item;
+
108 if (item != "coordinate") {
+
109 throw std::runtime_error(file_path +
+
110 " could not be parsed as a Matrix Market file.");
+
111 }
+
112 bool pattern;
+
113 ss >> item;
+
114 if (item == "pattern") {
+
115 pattern = true;
+
116 } else {
+
117 pattern = false;
+
118 }
+
119 // TODO: do something with real vs. integer vs. pattern?
+
120 ss >> item;
+
121 bool symmetric;
+
122 if (item == "general") {
+
123 symmetric = false;
+
124 } else if (item == "symmetric") {
+
125 symmetric = true;
+
126 } else {
+
127 throw std::runtime_error(file_path + " has an unsupported matrix type");
+
128 }
+
129
+
130 bool outOfComments = false;
+
131 while (!outOfComments) {
+
132 std::getline(f, buf);
+
133
+
134 if (buf[0] != '%') {
+
135 outOfComments = true;
+
136 }
+
137 }
+
138
+
139 I m, n, nnz;
+
140 // std::istringstream ss(buf);
+
141 ss.clear();
+
142 ss.str(buf);
+
143 ss >> m >> n >> nnz;
+
144
+
145 // NOTE for symmetric matrices: `nnz` holds the number of stored values in
+
146 // the matrix market file, while `matrix.nnz_` will hold the total number of
+
147 // stored values (including "mirrored" symmetric values).
+
148 coo_matrix<T, I> matrix({m, n});
+
149 if (symmetric) {
+
150 matrix.reserve(2 * nnz);
+
151 } else {
+
152 matrix.reserve(nnz);
+
153 }
+
154
+
155 size_type c = 0;
+
156 while (std::getline(f, buf)) {
+
157 I i, j;
+
158 T v;
+
159 std::istringstream ss(buf);
+
160 if (!pattern) {
+
161 ss >> i >> j >> v;
+
162 } else {
+
163 ss >> i >> j;
+
164 v = T(1);
+
165 }
+
166 if (one_indexed) {
+
167 i--;
+
168 j--;
+
169 }
+
170
+
171 if (i >= m || j >= n) {
+
172 throw std::runtime_error(
+
173 "read_MatrixMarket: file has nonzero out of bounds.");
+
174 }
+
175
+
176 matrix.push_back({{i, j}, v});
+
177
+
178 if (symmetric && i != j) {
+
179 matrix.push_back({{j, i}, v});
+
180 }
+
181
+
182 c++;
+
183 if (c > nnz) {
+
184 throw std::runtime_error("read_MatrixMarket: error reading Matrix Market "
+
185 "file, file has more nonzeros than reported.");
+
186 }
+
187 }
+
188
+
189 auto sort_fn = [](const auto &a, const auto &b) {
+
190 auto &&[a_index, a_value] = a;
+
191 auto &&[b_index, b_value] = b;
+
192 auto &&[a_i, a_j] = a_index;
+
193 auto &&[b_i, b_j] = b_index;
+
194 if (a_i < b_i) {
+
195 return true;
+
196 } else if (a_i == b_i) {
+
197 if (a_j < b_j) {
+
198 return true;
+
199 }
+
200 }
+
201 return false;
+
202 };
+
203
+
204 std::sort(matrix.begin(), matrix.end(), sort_fn);
+
205
+
206 f.close();
+
207
+
208 return matrix;
+
209}
+
210
+
211template <typename T, typename I, typename Allocator, typename... Args>
+
212void destroy_csr_matrix_view(dr::sp::csr_matrix_view<T, I, Args...> view,
+
213 Allocator &&alloc) {
+
214 alloc.deallocate(view.values_data(), view.size());
+
215 typename std::allocator_traits<Allocator>::template rebind_alloc<I> i_alloc(
+
216 alloc);
+
217 i_alloc.deallocate(view.colind_data(), view.size());
+
218 i_alloc.deallocate(view.rowptr_data(), view.shape()[0] + 1);
+
219}
+
220
+
221} // namespace __detail
+
222
+
223template <typename T, typename I>
+
224auto create_distributed(dr::sp::csr_matrix_view<T, I> local_mat,
+
225 const matrix_partition &partition) {
+
226 dr::sp::sparse_matrix<T, I> a(local_mat.shape(), partition);
+
227
+
228 std::vector<dr::sp::csr_matrix_view<T, I>> views;
+
229 std::vector<sycl::event> events;
+
230 views.reserve(a.grid_shape()[0] * a.grid_shape()[1]);
+
231
+
232 for (I i = 0; i < a.grid_shape()[0]; i++) {
+
233 for (I j = 0; j < a.grid_shape()[1]; j++) {
+
234 auto &&tile = a.tile({i, j});
+
235 dr::index<I> row_bounds(i * a.tile_shape()[0],
+
236 i * a.tile_shape()[0] + tile.shape()[0]);
+
237 dr::index<I> column_bounds(j * a.tile_shape()[1],
+
238 j * a.tile_shape()[1] + tile.shape()[1]);
+
239
+
240 auto local_submat = local_mat.submatrix(row_bounds, column_bounds);
+
241
+
242 auto submatrix_shape = dr::index<I>(row_bounds[1] - row_bounds[0],
+
243 column_bounds[1] - column_bounds[0]);
+
244
+
245 auto copied_submat = __detail::convert_to_csr(
+
246 local_submat, submatrix_shape, rng::distance(local_submat),
+
247 std::allocator<T>{});
+
248
+
249 auto e = a.copy_tile_async({i, j}, copied_submat);
+
250
+
251 views.push_back(copied_submat);
+
252 events.push_back(e);
+
253 }
+
254 }
+
255 __detail::wait(events);
+
256
+
257 for (auto &&view : views) {
+
258 __detail::destroy_csr_matrix_view(view, std::allocator<T>{});
+
259 }
+
260
+
261 return a;
+
262}
+
263
+
264template <typename T, typename I = std::size_t>
+
265auto mmread(std::string file_path, const matrix_partition &partition,
+
266 bool one_indexed = true) {
+
267 auto m = __detail::mmread<T, I>(file_path, one_indexed);
+
268 auto shape = m.shape();
+
269 auto nnz = m.size();
+
270
+
271 auto local_mat = __detail::convert_to_csr(m, shape, nnz, std::allocator<T>{});
+
272
+
273 auto a = create_distributed(local_mat, partition);
+
274
+
275 __detail::destroy_csr_matrix_view(local_mat, std::allocator<T>{});
+
276
+
277 return a;
+
278}
+
279
+
280template <typename T, typename I = std::size_t>
+
281auto mmread(std::string file_path, bool one_indexed = true) {
+
282 return mmread<T, I>(file_path, dr::sp::row_cyclic(), one_indexed);
+
283}
+
284
+
285} // namespace dr::sp
+
Definition: index.hpp:34
+
Definition: csr_matrix_view.hpp:126
+
Definition: sparse_matrix.hpp:135
+
+ + + + diff --git a/doxygen/matrix__partition_8hpp_source.html b/doxygen/matrix__partition_8hpp_source.html new file mode 100644 index 0000000000..413f06e2f4 --- /dev/null +++ b/doxygen/matrix__partition_8hpp_source.html @@ -0,0 +1,207 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/matrix_partition.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
matrix_partition.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/detail/index.hpp>
+
8#include <dr/sp/containers/detail.hpp>
+
9#include <dr/sp/init.hpp>
+
10
+
11namespace dr::sp {
+
12
+
13namespace tile {
+
14
+
15// Special constant to indicate tile dimensions of
+
16// {ceil(m / p_m), ceil(n / p_n)} should be chosen
+
17// in order to evenly divide a dimension amongst the
+
18// ranks in the processor grid.
+
19inline constexpr std::size_t div = std::numeric_limits<std::size_t>::max();
+
20
+
21} // namespace tile
+
22
+ +
24public:
+
25 virtual std::size_t tile_rank(dr::index<> matrix_shape,
+
26 dr::index<> tile_id) const = 0;
+
27 virtual dr::index<> grid_shape(dr::index<> matrix_shape) const = 0;
+
28 virtual dr::index<> tile_shape(dr::index<> matrix_shape) const = 0;
+
29
+
30 virtual std::unique_ptr<matrix_partition> clone() const = 0;
+
31 virtual ~matrix_partition(){};
+
32};
+
33
+
34class block_cyclic final : public matrix_partition {
+
35public:
+
36 block_cyclic(dr::index<> tile_shape = {dr::sp::tile::div, dr::sp::tile::div},
+
37 dr::index<> grid_shape = detail::factor(dr::sp::nprocs()))
+
38 : tile_shape_(tile_shape), grid_shape_(grid_shape) {}
+
39
+
40 block_cyclic(const block_cyclic &) noexcept = default;
+
41
+
42 dr::index<> tile_shape() const { return tile_shape_; }
+
43
+
44 std::size_t tile_rank(dr::index<> matrix_shape, dr::index<> tile_id) const {
+
45 dr::index<> pgrid_idx = {tile_id[0] % grid_shape_[0],
+
46 tile_id[1] % grid_shape_[1]};
+
47
+
48 auto pgrid = processor_grid_();
+
49
+
50 return pgrid[pgrid_idx[0] * grid_shape_[1] + pgrid_idx[1]];
+
51 }
+
52
+
53 dr::index<> grid_shape(dr::index<> matrix_shape) const {
+
54 auto ts = this->tile_shape(matrix_shape);
+
55
+
56 return dr::index<>((matrix_shape[0] + ts[0] - 1) / ts[0],
+
57 (matrix_shape[1] + ts[1] - 1) / ts[1]);
+
58 }
+
59
+
60 dr::index<> tile_shape(dr::index<> matrix_shape) const {
+
61 std::array<std::size_t, 2> tshape = {tile_shape_[0], tile_shape_[1]};
+
62
+
63 constexpr std::size_t ndims = 2;
+
64 for (std::size_t i = 0; i < ndims; i++) {
+
65 if (tshape[i] == dr::sp::tile::div) {
+
66 tshape[i] = (matrix_shape[i] + grid_shape_[i] - 1) / grid_shape_[i];
+
67 }
+
68 }
+
69
+
70 return tshape;
+
71 }
+
72
+
73 std::unique_ptr<matrix_partition> clone() const noexcept {
+
74 return std::unique_ptr<matrix_partition>(new block_cyclic(*this));
+
75 }
+
76
+
77private:
+
78 std::vector<std::size_t> processor_grid_() const {
+
79 std::vector<std::size_t> grid(grid_shape_[0] * grid_shape_[1]);
+
80
+
81 for (std::size_t i = 0; i < grid.size(); i++) {
+
82 grid[i] = i;
+
83 }
+
84 return grid;
+
85 }
+
86
+
87 dr::index<> tile_shape_;
+
88 dr::index<> grid_shape_;
+
89};
+
90
+
91inline auto row_cyclic() {
+
92 return block_cyclic({dr::sp::tile::div, dr::sp::tile::div},
+
93 {dr::sp::nprocs(), 1});
+
94}
+
95
+
96inline std::vector<block_cyclic> partition_matmul(std::size_t m, std::size_t n,
+
97 std::size_t k) {
+
98 dr::index<> c_pgrid = detail::factor(sp::nprocs());
+
99
+
100 block_cyclic c_block({dr::sp::tile::div, dr::sp::tile::div},
+
101 {c_pgrid[0], c_pgrid[1]});
+
102
+
103 std::size_t k_block;
+
104
+
105 if (m * k >= k * n) {
+
106 k_block = (sp::nprocs() + c_pgrid[0] - 1) / c_pgrid[0];
+
107 } else {
+
108 k_block = (sp::nprocs() + c_pgrid[1] - 1) / c_pgrid[1];
+
109 }
+
110
+
111 block_cyclic a_block({dr::sp::tile::div, dr::sp::tile::div},
+
112 {c_pgrid[0], k_block});
+
113 block_cyclic b_block({dr::sp::tile::div, dr::sp::tile::div},
+
114 {k_block, c_pgrid[1]});
+
115
+
116 return {a_block, b_block, c_block};
+
117}
+
118
+
119} // namespace dr::sp
+
Definition: index.hpp:34
+
Definition: matrix_partition.hpp:34
+
Definition: matrix_partition.hpp:23
+
+ + + + diff --git a/doxygen/md__for__each_8hpp_source.html b/doxygen/md__for__each_8hpp_source.html new file mode 100644 index 0000000000..5ccb4852e0 --- /dev/null +++ b/doxygen/md__for__each_8hpp_source.html @@ -0,0 +1,308 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/md_for_each.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
md_for_each.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <algorithm>
+
8#include <execution>
+
9#include <type_traits>
+
10#include <utility>
+
11
+
12#include <dr/concepts/concepts.hpp>
+
13#include <dr/detail/logger.hpp>
+
14#include <dr/detail/onedpl_direct_iterator.hpp>
+
15#include <dr/detail/ranges_shim.hpp>
+
16#include <dr/detail/tuple_utils.hpp>
+
17#include <dr/mp/global.hpp>
+
18
+
19namespace dr::mp::__detail {
+
20
+
21struct any {
+
22 template <typename T> operator T() const noexcept {
+
23 return std::declval<T>();
+
24 }
+
25};
+
26
+
27template <typename F, typename Arg1>
+
28concept one_argument = requires(F &f) {
+
29 { f(Arg1{}) };
+
30};
+
31
+
32template <typename F, typename Arg1, typename Arg2>
+
33concept two_arguments = requires(F &f) {
+
34 { f(Arg1{}, Arg2{}) };
+
35};
+
36
+
37}; // namespace dr::mp::__detail
+
38
+
39namespace dr::mp {
+
40
+
41namespace detail = dr::__detail;
+
42
+
44template <typename... Ts>
+
45void stencil_for_each(auto op, is_mdspan_view auto &&...drs) {
+
46 auto ranges = std::tie(drs...);
+
47 auto &&dr0 = std::get<0>(ranges);
+
48 if (rng::empty(dr0)) {
+
49 return;
+
50 }
+
51
+
52 auto all_segments = rng::views::zip(dr::ranges::segments(drs)...);
+
53 for (auto segs : all_segments) {
+
54 auto seg0 = std::get<0>(segs);
+
55 auto mdspan0 = seg0.mdspan();
+
56
+
57 // If local
+
58 if (dr::ranges::rank(seg0) == default_comm().rank()) {
+
59 // Calculate loop invariant info about the operands. Use a tuple
+
60 // to hold the info for all operands.
+
61 auto operand_infos = detail::tuple_transform(segs, [](auto &&seg) {
+
62 // mdspan for tile. This could be a submdspan, so we need the
+
63 // extents of the root to get the memory strides
+
64 return std::make_pair(seg.mdspan(), seg.root_mdspan().extents());
+
65 });
+
66
+
67 if (mp::use_sycl()) {
+
68#ifdef SYCL_LANGUAGE_VERSION
+
69 auto do_point = [=](auto index) {
+
70 // Transform operand_infos into stencils
+
71 auto stencils =
+
72 detail::tuple_transform(operand_infos, [=](auto info) {
+
73 return md::mdspan(
+
74 std::to_address(&info.first(index[0], index[1])),
+
75 info.second);
+
76 });
+
77 op(stencils);
+
78 };
+
79 // TODO: Extend sycl_utils.hpp to handle ranges > 1D. It uses
+
80 // ndrange and handles > 32 bits.
+
81 dr::__detail::parallel_for(
+
82 mp::sycl_queue(), sycl::range(mdspan0.extent(0), mdspan0.extent(1)),
+
83 do_point)
+
84 .wait();
+
85#else
+
86 assert(false);
+
87#endif
+
88 } else {
+
89 // Given an index, invoke op on a tuple of stencils
+
90 auto invoke_index = [=](auto index) {
+
91 // Transform operand_infos into stencils
+
92 auto stencils =
+
93 detail::tuple_transform(operand_infos, [=](auto info) {
+
94 return md::mdspan(std::to_address(&info.first(index)),
+
95 info.second);
+
96 });
+
97 op(stencils);
+
98 };
+
99#if 0
+
100 // Does not vectorize. Something about loop index being forced into memory
+
101 detail::mdspan_foreach<mdspan0.rank(), decltype(invoke_index)>(
+
102 mdspan0.extents(), invoke_index);
+
103#else
+
104 for (std::size_t i = 0; i < mdspan0.extents().extent(0); i++) {
+
105 for (std::size_t j = 0; j < mdspan0.extents().extent(1); j++) {
+
106 invoke_index(std::array<std::size_t, 2>{i, j});
+
107 }
+
108 }
+
109#endif
+
110 }
+
111 }
+
112 }
+
113
+
114 barrier();
+
115}
+
116
+
118template <typename F, typename... Ts>
+
119void for_each(F op, is_mdspan_view auto &&...drs) {
+
120 auto ranges = std::tie(drs...);
+
121 auto &&dr0 = std::get<0>(ranges);
+
122 if (rng::empty(dr0)) {
+
123 return;
+
124 }
+
125
+
126 auto all_segments = rng::views::zip(dr::ranges::segments(drs)...);
+
127 for (auto segs : all_segments) {
+
128 auto seg0 = std::get<0>(segs);
+
129 auto mdspan0 = seg0.mdspan();
+
130
+
131 // If local
+
132 if (dr::ranges::rank(seg0) == default_comm().rank()) {
+
133 auto origin = seg0.origin();
+
134
+
135 // make a tuple of mdspans
+
136 auto operand_mdspans = detail::tuple_transform(
+
137 segs, [](auto &&seg) { return seg.mdspan(); });
+
138
+
139 if (mp::use_sycl()) {
+
140#ifdef SYCL_LANGUAGE_VERSION
+
141 //
+
142 auto invoke_index = [=](auto index) {
+
143 // Transform mdspans into references
+
144 auto references = detail::tie_transform(
+
145 operand_mdspans, [mdspan0, index](auto mdspan) -> decltype(auto) {
+
146 static_assert(1 <= mdspan0.rank() && mdspan0.rank() <= 3);
+
147 if constexpr (mdspan0.rank() == 1) {
+
148 return mdspan(index[0]);
+
149 } else if constexpr (mdspan0.rank() == 2) {
+
150 return mdspan(index[0], index[1]);
+
151 } else if constexpr (mdspan0.rank() == 3) {
+
152 return mdspan(index[0], index[1], index[2]);
+
153 }
+
154 });
+
155 static_assert(
+
156 std::invocable<F, decltype(references)> ||
+
157 std::invocable<F, decltype(index), decltype(references)>);
+
158 if constexpr (std::invocable<F, decltype(references)>) {
+
159 op(references);
+
160 } else {
+
161 auto global_index = index;
+
162 for (std::size_t i = 0; i < rng::size(global_index); i++) {
+
163 global_index[i] += origin[i];
+
164 }
+
165
+
166 op(global_index, references);
+
167 }
+
168 };
+
169
+
170 if constexpr (mdspan0.rank() == 1) {
+
171 auto range = sycl::range(mdspan0.extent(0));
+
172 dr::__detail::parallel_for(mp::sycl_queue(), range, invoke_index)
+
173 .wait();
+
174 } else if constexpr (mdspan0.rank() == 2) {
+
175 auto range = sycl::range(mdspan0.extent(0), mdspan0.extent(1));
+
176 dr::__detail::parallel_for(mp::sycl_queue(), range, invoke_index)
+
177 .wait();
+
178 } else if constexpr (mdspan0.rank() == 3) {
+
179 auto range = sycl::range(mdspan0.extent(0), mdspan0.extent(1),
+
180 mdspan0.extent(2));
+
181 dr::__detail::parallel_for(mp::sycl_queue(), range, invoke_index)
+
182 .wait();
+
183 }
+
184#else
+
185 assert(false);
+
186#endif
+
187 } else {
+
188 // invoke op on a tuple of references created by using the mdspan's and
+
189 // index
+
190 auto invoke_index = [=](auto index) {
+
191 // Transform operand_infos into references
+
192 auto references = detail::tie_transform(
+
193 operand_mdspans,
+
194 [index](auto mdspan) -> decltype(auto) { return mdspan(index); });
+
195 static_assert(
+
196 std::invocable<F, decltype(references)> ||
+
197 std::invocable<F, decltype(index), decltype(references)>);
+
198 if constexpr (std::invocable<F, decltype(references)>) {
+
199 op(references);
+
200 } else if constexpr (std::invocable<F, decltype(index),
+
201 decltype(references)>) {
+
202 auto global_index = index;
+
203 for (std::size_t i = 0; i < rng::size(global_index); i++) {
+
204 global_index[i] += origin[i];
+
205 }
+
206
+
207 op(global_index, references);
+
208 } else {
+
209 assert(false);
+
210 }
+
211 };
+
212 detail::mdspan_foreach<mdspan0.rank(), decltype(invoke_index)>(
+
213 mdspan0.extents(), invoke_index);
+
214 }
+
215 }
+
216 }
+
217
+
218 barrier();
+
219}
+
220
+
221} // namespace dr::mp
+
Definition: md_for_each.hpp:28
+
Definition: md_for_each.hpp:33
+
Definition: mdspan_view.hpp:206
+
Definition: md_for_each.hpp:21
+
+ + + + diff --git a/doxygen/mdarray__shim_8hpp_source.html b/doxygen/mdarray__shim_8hpp_source.html new file mode 100644 index 0000000000..22ab55f3ac --- /dev/null +++ b/doxygen/mdarray__shim_8hpp_source.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/mdarray_shim.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
mdarray_shim.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <experimental/mdarray>
+
+ + + + diff --git a/doxygen/mdspan__shim_8hpp_source.html b/doxygen/mdspan__shim_8hpp_source.html new file mode 100644 index 0000000000..2acd681b28 --- /dev/null +++ b/doxygen/mdspan__shim_8hpp_source.html @@ -0,0 +1,94 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/mdspan_shim.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
mdspan_shim.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <experimental/mdspan>
+
8#define MDSPAN_NAMESPACE std::experimental
+
9namespace md = MDSPAN_NAMESPACE;
+
+ + + + diff --git a/doxygen/mdspan__utils_8hpp_source.html b/doxygen/mdspan__utils_8hpp_source.html new file mode 100644 index 0000000000..e6acb32b79 --- /dev/null +++ b/doxygen/mdspan__utils_8hpp_source.html @@ -0,0 +1,427 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/mdspan_utils.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
mdspan_utils.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/detail/mdspan_shim.hpp>
+
8
+
9namespace dr::__detail {
+
10
+
11template <std::size_t Rank> auto dims(md::dextents<std::size_t, Rank> extents) {
+
12 if constexpr (Rank == 1) {
+
13 return std::tuple(extents.extent(0));
+
14 } else if constexpr (Rank == 2) {
+
15 return std::tuple(extents.extent(0), extents.extent(1));
+
16 } else if constexpr (Rank == 3) {
+
17 return std::tuple(extents.extent(0), extents.extent(1), extents.extent(2));
+
18 } else {
+
19 assert(false);
+
20 }
+
21}
+
22
+
23template <typename Index> auto shape_to_strides(const Index &shape) {
+
24 const std::size_t rank = rng::size(shape);
+
25 Index strides;
+
26 strides[rank - 1] = 1;
+
27 for (std::size_t i = 1; i < rank; i++) {
+
28 strides[rank - i - 1] = strides[rank - i] * shape[rank - i];
+
29 }
+
30 return strides;
+
31}
+
32
+
33template <typename Index>
+
34auto linear_to_index(std::size_t linear, const Index &shape) {
+
35 Index index, strides(shape_to_strides(shape));
+
36
+
37 for (std::size_t i = 0; i < rng::size(shape); i++) {
+
38 index[i] = linear / strides[i];
+
39 linear = linear % strides[i];
+
40 }
+
41
+
42 return index;
+
43}
+
44
+
45template <typename Mdspan>
+
46concept mdspan_like = requires(Mdspan &mdspan) {
+
47 mdspan.rank();
+
48 mdspan.extents();
+
49};
+
50
+
51template <typename Mdarray>
+
52concept mdarray_like = requires(Mdarray &mdarray) { mdarray.to_mdspan(); };
+
53
+
54template <std::size_t Rank> using dr_extents = std::array<std::size_t, Rank>;
+
55template <std::size_t Rank> using md_extents = md::dextents<std::size_t, Rank>;
+
56
+
57//
+
58// Mdspan accessor using an iterator
+
59//
+
60template <std::random_access_iterator Iter> class mdspan_iter_accessor {
+
61public:
+
62 using data_handle_type = Iter;
+
63 using reference = std::iter_reference_t<Iter>;
+ +
65
+
66 constexpr mdspan_iter_accessor() noexcept = default;
+
67 constexpr auto access(Iter iter, std::size_t index) const {
+
68 return iter[index];
+
69 }
+
70
+
71 constexpr auto offset(Iter iter, std::size_t index) const noexcept {
+
72 return iter + index;
+
73 }
+
74};
+
75
+
76template <typename M, std::size_t Rank, std::size_t... indexes>
+
77auto make_submdspan_impl(M mdspan, const dr_extents<Rank> &starts,
+
78 const dr_extents<Rank> &ends,
+
79 std::index_sequence<indexes...>) {
+
80 return md::submdspan(mdspan, std::tuple(starts[indexes], ends[indexes])...);
+
81}
+
82
+
83// Mdspan accepts slices, but that is hard to work with because it
+
84// requires parameter packs. Work with starts/size vectors internally
+
85// and use slices at the interface
+
86template <std::size_t Rank>
+
87auto make_submdspan(auto mdspan, const std::array<std::size_t, Rank> &starts,
+
88 const std::array<std::size_t, Rank> &ends) {
+
89 return make_submdspan_impl(mdspan, starts, ends,
+
90 std::make_index_sequence<Rank>{});
+
91}
+
92
+
93template <std::size_t Rank, typename Op>
+
94void mdspan_foreach(md_extents<Rank> extents, Op op,
+
95 dr_extents<Rank> index = dr_extents<Rank>(),
+
96 std::size_t rank = 0) {
+
97 for (index[rank] = 0; index[rank] < extents.extent(rank); index[rank]++) {
+
98 if (rank == Rank - 1) {
+
99 op(index);
+
100 } else {
+
101 mdspan_foreach(extents, op, index, rank + 1);
+
102 }
+
103 }
+
104}
+
105
+
106// Pack mdspan into contiguous container
+
107template <mdspan_like Src>
+
108auto mdspan_copy(Src src, std::forward_iterator auto dst) {
+
109 __detail::event event;
+
110
+
111 constexpr std::size_t rank = std::remove_cvref_t<Src>::rank();
+
112 if (rank >= 2 && rank <= 3 && mp::use_sycl()) {
+
113#ifdef SYCL_LANGUAGE_VERSION
+
114 constexpr std::size_t rank = std::remove_cvref_t<Src>::rank();
+
115 if constexpr (rank == 2) {
+
116 event = dr::__detail::parallel_for(
+
117 dr::mp::sycl_queue(), sycl::range(src.extent(0), src.extent(1)),
+
118 [src, dst](auto idx) {
+
119 dst[idx[0] * src.extent(1) + idx[1]] = src(idx);
+
120 });
+
121 } else if constexpr (rank == 3) {
+
122 event = dr::__detail::parallel_for(
+
123 dr::mp::sycl_queue(),
+
124 sycl::range(src.extent(0), src.extent(1), src.extent(2)),
+
125 [src, dst](auto idx) {
+
126 dst[idx[0] * src.extent(1) * src.extent(2) +
+
127 idx[1] * src.extent(2) + idx[2]] = src(idx);
+
128 });
+
129 } else {
+
130 assert(false);
+
131 }
+
132#endif
+
133 } else {
+
134 auto pack = [src, &dst](auto index) { *dst++ = src(index); };
+
135 mdspan_foreach<src.rank(), decltype(pack)>(src.extents(), pack);
+
136 }
+
137
+
138 return event;
+
139}
+
140
+
141// unpack contiguous container into mdspan
+
142template <mdspan_like Dst>
+
143auto mdspan_copy(std::forward_iterator auto src, Dst dst) {
+
144 __detail::event event;
+
145
+
146 constexpr std::size_t rank = std::remove_cvref_t<Dst>::rank();
+
147 if (rank >= 2 && rank <= 3 && mp::use_sycl()) {
+
148#ifdef SYCL_LANGUAGE_VERSION
+
149 if constexpr (rank == 2) {
+
150 event = dr::__detail::parallel_for(
+
151 dr::mp::sycl_queue(), sycl::range(dst.extent(0), dst.extent(1)),
+
152 [src, dst](auto idx) {
+
153 dst(idx) = src[idx[0] * dst.extent(1) + idx[1]];
+
154 });
+
155 } else if constexpr (rank == 3) {
+
156 event = dr::__detail::parallel_for(
+
157 dr::mp::sycl_queue(),
+
158 sycl::range(dst.extent(0), dst.extent(1), dst.extent(2)),
+
159 [src, dst](auto idx) {
+
160 dst(idx) = src[idx[0] * dst.extent(1) * dst.extent(2) +
+
161 idx[1] * dst.extent(2) + idx[2]];
+
162 });
+
163 } else {
+
164 assert(false);
+
165 }
+
166#endif
+
167 } else {
+
168 auto unpack = [&src, dst](auto index) { dst(index) = *src++; };
+
169 mdspan_foreach<dst.rank(), decltype(unpack)>(dst.extents(), unpack);
+
170 }
+
171
+
172 return event;
+
173}
+
174
+
175// copy mdspan to mdspan
+
176auto mdspan_copy(mdspan_like auto src, mdspan_like auto dst) {
+
177 __detail::event event;
+
178
+
179 assert(src.extents() == dst.extents());
+
180
+
181 constexpr std::size_t rank = std::remove_cvref_t<decltype(src)>::rank();
+
182 if (rank >= 2 && rank <= 3 && mp::use_sycl()) {
+
183#ifdef SYCL_LANGUAGE_VERSION
+
184 dr::drlog.debug("mdspan_copy using sycl\n");
+
185 if constexpr (rank == 2) {
+
186 event = dr::__detail::parallel_for(
+
187 dr::mp::sycl_queue(), sycl::range(dst.extent(0), dst.extent(1)),
+
188 [src, dst](auto idx) { dst(idx) = src(idx); });
+
189 } else if constexpr (rank == 3) {
+
190 event = dr::__detail::parallel_for(
+
191 dr::mp::sycl_queue(),
+
192 sycl::range(dst.extent(0), dst.extent(1), dst.extent(2)),
+
193 [src, dst](auto idx) { dst(idx) = src(idx); });
+
194 } else {
+
195 assert(false);
+
196 }
+
197#endif
+
198 } else {
+
199
+
200 auto copy = [src, dst](auto index) { dst(index) = src(index); };
+
201 mdspan_foreach<src.rank(), decltype(copy)>(src.extents(), copy);
+
202 }
+
203
+
204 return event;
+
205}
+
206
+
207// For operator(), rearrange indices according to template arguments.
+
208//
+
209// For mdtranspose<mdspan3d, 2, 0, 1> a(b);
+
210//
+
211// a(1, 2, 3) references b(3, 1, 2)
+
212//
+
213template <typename Mdspan, std::size_t... Is>
+
214class mdtranspose : public Mdspan {
+
215private:
+
216 static constexpr std::size_t rank_ = Mdspan::rank();
+
217
+
218public:
+
219 // Inherit constructors from base class
+
220 mdtranspose(Mdspan &mdspan) : Mdspan(mdspan) {}
+
221
+
222 // rearrange indices according to template arguments
+
223 template <std::integral... Indexes>
+
224 auto &operator()(Indexes... indexes) const {
+
225 std::tuple index(indexes...);
+
226 return Mdspan::operator()(std::get<Is>(index)...);
+
227 }
+
228 auto &operator()(std::array<std::size_t, rank_> index) const {
+
229 return Mdspan::operator()(index[Is]...);
+
230 }
+
231
+
232 auto extents() const {
+
233 // To get the extents, we must invert the index mapping
+
234 std::array<std::size_t, rank_> from_transposed({Is...});
+
235 std::array<std::size_t, rank_> extents_t;
+
236 for (std::size_t i = 0; i < rank_; i++) {
+
237 extents_t[from_transposed[i]] = Mdspan::extent(i);
+
238 }
+
239
+
240 return md_extents<rank_>(extents_t);
+
241 }
+
242 auto extent(std::size_t d) const { return extents().extent(d); }
+
243};
+
244
+
245} // namespace dr::__detail
+
246
+
247template <dr::__detail::mdspan_like Mdspan>
+
248struct fmt::formatter<Mdspan, char> : public formatter<string_view> {
+
249 template <typename FmtContext>
+
250 auto format(Mdspan mdspan, FmtContext &ctx) const {
+
251 std::array<std::size_t, mdspan.rank()> index;
+
252 rng::fill(index, 0);
+
253 format_mdspan(ctx, mdspan, index, 0);
+
254 return ctx.out();
+
255 }
+
256
+
257 void format_mdspan(auto &ctx, auto mdspan, auto &index,
+
258 std::size_t dim) const {
+
259 for (std::size_t i = 0; i < mdspan.extent(dim); i++) {
+
260 index[dim] = i;
+
261 if (dim == mdspan.rank() - 1) {
+
262 if (i == 0) {
+
263 fmt::format_to(ctx.out(), "{}: ", index);
+
264 }
+
265 fmt::format_to(ctx.out(), "{:4} ", mdspan(index));
+
266 } else {
+
267 format_mdspan(ctx, mdspan, index, dim + 1);
+
268 }
+
269 }
+
270 fmt::format_to(ctx.out(), "\n");
+
271 }
+
272};
+
273
+
274namespace MDSPAN_NAMESPACE {
+
275
+
276template <dr::__detail::mdspan_like M1, dr::__detail::mdspan_like M2>
+
277bool operator==(const M1 &m1, const M2 &m2) {
+
278 constexpr std::size_t rank1 = M1::rank(), rank2 = M2::rank();
+
279 static_assert(rank1 == rank2);
+
280 if (dr::__detail::dims<rank1>(m1.extents()) !=
+
281 dr::__detail::dims<rank1>(m2.extents())) {
+
282 return false;
+
283 }
+
284
+
285 // See mdspan_foreach for a way to generalize this to all ranks
+
286 if constexpr (M1::rank() == 1) {
+
287 for (std::size_t i = 0; i < m1.extent(0); i++) {
+
288 if (m1(i) != m2(i)) {
+
289 return false;
+
290 }
+
291 }
+
292 } else if constexpr (M1::rank() == 2) {
+
293 for (std::size_t i = 0; i < m1.extent(0); i++) {
+
294 for (std::size_t j = 0; j < m1.extent(1); j++) {
+
295 if (m1(i, j) != m2(i, j)) {
+
296 return false;
+
297 }
+
298 }
+
299 }
+
300 } else if constexpr (M1::rank() == 3) {
+
301 for (std::size_t i = 0; i < m1.extent(0); i++) {
+
302 for (std::size_t j = 0; j < m1.extent(1); j++) {
+
303 for (std::size_t k = 0; k < m1.extent(2); k++) {
+
304 if (m1(i, j, k) != m2(i, j, k)) {
+
305 return false;
+
306 }
+
307 }
+
308 }
+
309 }
+
310 } else {
+
311 assert(false);
+
312 }
+
313
+
314 return true;
+
315}
+
316
+
317template <dr::__detail::mdspan_like M>
+
318inline std::ostream &operator<<(std::ostream &os, const M &m) {
+
319 if constexpr (dr::__detail::mdarray_like<M>) {
+
320 os << fmt::format("\n{}", m.to_mdspan());
+
321 } else {
+
322 os << fmt::format("\n{}", m);
+
323 }
+
324 return os;
+
325}
+
326
+
327} // namespace MDSPAN_NAMESPACE
+
328
+
329namespace dr {
+
330
+
331template <typename R>
+ +
333 distributed_range<R> && requires(R &r) { r.mdspan(); };
+
334
+
335} // namespace dr
+
Definition: mdspan_utils.hpp:60
+
Definition: mdspan_utils.hpp:214
+
Definition: index.hpp:34
+
Definition: mdspan_utils.hpp:52
+
Definition: mdspan_utils.hpp:46
+
Definition: mdspan_utils.hpp:332
+
Definition: concepts.hpp:20
+
+ + + + diff --git a/doxygen/mdspan__view_8hpp_source.html b/doxygen/mdspan__view_8hpp_source.html new file mode 100644 index 0000000000..4d10fa9fdf --- /dev/null +++ b/doxygen/mdspan__view_8hpp_source.html @@ -0,0 +1,362 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views/mdspan_view.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
mdspan_view.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <dr/detail/mdspan_shim.hpp>
+
8#include <dr/detail/mdspan_utils.hpp>
+
9#include <dr/detail/ranges_shim.hpp>
+
10#include <dr/detail/ranges_utils.hpp>
+
11#include <dr/mp/containers/distributed_vector.hpp>
+
12
+
13namespace dr::mp::decomp {
+
14
+
15inline constexpr std::size_t div = std::numeric_limits<std::size_t>::max();
+
16inline constexpr std::size_t all = div - 1;
+
17
+
18} // namespace dr::mp::decomp
+
19
+
20namespace dr::mp::__detail {
+
21
+
22//
+
23// Add a local mdspan to the underlying segment
+
24//
+
25template <typename BaseSegment, std::size_t Rank>
+
26class md_segment : public rng::view_interface<md_segment<BaseSegment, Rank>> {
+
27private:
+
28public:
+
29 using index_type = dr::__detail::dr_extents<Rank>;
+
30
+
31 md_segment() {}
+
32 md_segment(index_type origin, BaseSegment segment, index_type tile_shape)
+
33 : base_(segment), origin_(origin),
+
34 mdspan_(local_tile(segment, tile_shape)) {
+
35 dr::drlog.debug(dr::logger::mdspan_view,
+
36 "md_segment\n origin: {}\n tile shape: {}\n", origin,
+
37 tile_shape);
+
38 }
+
39
+
40 // view_interface uses below to define everything else
+
41 auto begin() const { return base_.begin(); }
+
42 auto end() const { return base_.end(); }
+
43
+
44 auto reserved() const { return base_.reserved(); }
+
45
+
46 auto halo() const { return dr::mp::halo(base_); }
+
47
+
48 // mdspan-specific methods
+
49 auto mdspan() const { return mdspan_; }
+
50 auto origin() const { return origin_; }
+
51 // for slices, this would be the underlying mdspan
+
52 auto root_mdspan() const { return mdspan(); }
+
53
+
54private:
+
55 using T = rng::range_value_t<BaseSegment>;
+
56
+
57 static auto local_tile(BaseSegment segment, const index_type &tile_shape) {
+
58 // Undefined behavior if the segments is not local
+
59 T *ptr = dr::ranges::rank(segment) == default_comm().rank()
+
60 ? std::to_address(dr::ranges::local(rng::begin(segment)))
+
61 : nullptr;
+
62 return md::mdspan(ptr, tile_shape);
+
63 }
+
64
+
65 BaseSegment base_;
+
66 index_type origin_;
+
67 md::mdspan<T, dr::__detail::md_extents<Rank>, md::layout_stride> mdspan_;
+
68};
+
69
+
70} // namespace dr::mp::__detail
+
71
+
72namespace dr::mp {
+
73
+
74//
+
75// Wrap a distributed range, adding an mdspan and adapting the
+
76// segments to also be mdspans for local access
+
77//
+
78template <distributed_contiguous_range R, std::size_t Rank,
+
79 typename Layout = md::layout_right>
+
80struct mdspan_view : public rng::view_interface<mdspan_view<R, Rank>> {
+
81private:
+
82 using base_type = rng::views::all_t<R>;
+
83 using iterator_type = rng::iterator_t<base_type>;
+
84 using extents_type = md::dextents<std::size_t, Rank>;
+
85 using mdspan_type =
+
86 md::mdspan<iterator_type, extents_type, Layout,
+ +
88 using difference_type = rng::iter_difference_t<iterator_type>;
+
89 using index_type = dr::__detail::dr_extents<Rank>;
+
90
+
91 base_type base_;
+
92 index_type full_shape_;
+
93 index_type tile_shape_;
+
94
+
95 static auto segment_index_to_global_origin(std::size_t linear,
+
96 index_type full_shape,
+
97 index_type tile_shape) {
+
98 index_type grid_shape;
+
99 for (std::size_t i = 0; i < Rank; i++) {
+
100 grid_shape[i] = dr::__detail::partition_up(full_shape[i], tile_shape[i]);
+
101 }
+
102 auto origin = dr::__detail::linear_to_index(linear, grid_shape);
+
103 for (std::size_t i = 0; i < Rank; i++) {
+
104 origin[i] *= tile_shape[i];
+
105 }
+
106
+
107 return origin;
+
108 }
+
109
+
110 static auto make_segments(auto base, auto full_shape, auto tile_shape) {
+
111 auto make_md = [=](auto v) {
+
112 auto clipped = tile_shape;
+
113 std::size_t segment_index = std::get<0>(v);
+
114 std::size_t end = (segment_index + 1) * tile_shape[0];
+
115 if (end > full_shape[0]) {
+
116 clipped[0] -= std::min(end - full_shape[0], clipped[0]);
+
117 }
+ +
119 segment_index_to_global_origin(segment_index, full_shape, tile_shape),
+
120 std::get<1>(v), clipped);
+
121 };
+
122
+
123 dr::drlog.debug(dr::logger::mdspan_view,
+
124 "mdspan_view\n full shape: {}\n tile shape: {}\n",
+
125 full_shape, tile_shape);
+
126 // use bounded_enumerate so we get a std::ranges::common_range
+
127 return dr::__detail::bounded_enumerate(dr::ranges::segments(base)) |
+
128 rng::views::transform(make_md);
+
129 }
+
130 using segments_type = decltype(make_segments(std::declval<base_type>(),
+
131 full_shape_, tile_shape_));
+
132
+
133public:
+
134 mdspan_view(R r, dr::__detail::dr_extents<Rank> full_shape)
+
135 : base_(rng::views::all(std::forward<R>(r))) {
+
136 full_shape_ = full_shape;
+
137
+
138 // Default tile shape splits on leading dimension
+
139 tile_shape_ = full_shape;
+
140 tile_shape_[0] = decomp::div;
+
141
+
142 replace_decomp();
+
143 segments_ = make_segments(base_, full_shape_, tile_shape_);
+
144 }
+
145
+
146 mdspan_view(R r, dr::__detail::dr_extents<Rank> full_shape,
+
147 dr::__detail::dr_extents<Rank> tile_shape)
+
148 : base_(rng::views::all(std::forward<R>(r))), full_shape_(full_shape),
+
149 tile_shape_(tile_shape) {
+
150 replace_decomp();
+
151 segments_ = make_segments(base_, full_shape_, tile_shape_);
+
152 }
+
153
+
154 // Base implements random access range
+
155 auto begin() const { return base_.begin(); }
+
156 auto end() const { return base_.end(); }
+
157 auto operator[](difference_type n) { return base_[n]; }
+
158
+
159 // Add a local mdspan to the base segment
+
160 // Mdspan access to base
+
161 auto mdspan() const { return mdspan_type(rng::begin(base_), full_shape_); }
+
162 static constexpr auto rank() { return Rank; }
+
163
+
164 auto segments() const { return segments_; }
+
165
+
166 // Mdspan access to grid
+
167 auto grid() {
+
168 dr::__detail::dr_extents<Rank> grid_shape;
+
169 for (std::size_t i : rng::views::iota(0u, Rank)) {
+
170 grid_shape[i] =
+
171 dr::__detail::partition_up(full_shape_[i], tile_shape_[i]);
+
172 }
+
173 using grid_iterator_type = rng::iterator_t<segments_type>;
+
174 using grid_type =
+
175 md::mdspan<grid_iterator_type, extents_type, Layout,
+ +
177 return grid_type(rng::begin(segments_), grid_shape);
+
178 }
+
179
+
180private:
+
181 // Replace div with actual value
+
182 void replace_decomp() {
+
183 auto n = std::size_t(rng::size(dr::ranges::segments(base_)));
+
184 for (std::size_t i = 0; i < Rank; i++) {
+
185 if (tile_shape_[i] == decomp::div) {
+
186 tile_shape_[i] = dr::__detail::partition_up(full_shape_[i], n);
+
187 } else if (tile_shape_[i] == decomp::all) {
+
188 tile_shape_[i] = full_shape_[i];
+
189 }
+
190 }
+
191 }
+
192
+
193 segments_type segments_;
+
194};
+
195
+
196template <typename R, std::size_t Rank>
+
197mdspan_view(R &&r, dr::__detail::dr_extents<Rank> extents)
+ +
199
+
200template <typename R, std::size_t Rank>
+
201mdspan_view(R &&r, dr::__detail::dr_extents<Rank> full_shape,
+
202 dr::__detail::dr_extents<Rank> tile_shape)
+ +
204
+
205template <typename R>
+ +
207 dr::distributed_range<R> && requires(R &r) { r.mdspan(); };
+
208
+
209} // namespace dr::mp
+
210
+
211namespace dr::mp::views {
+
212
+
213template <std::size_t Rank> class mdspan_adapter_closure {
+
214public:
+
215 mdspan_adapter_closure(dr::__detail::dr_extents<Rank> full_shape,
+
216 dr::__detail::dr_extents<Rank> tile_shape)
+
217 : full_shape_(full_shape), tile_shape_(tile_shape), tile_valid_(true) {}
+
218
+
219 mdspan_adapter_closure(dr::__detail::dr_extents<Rank> full_shape)
+
220 : full_shape_(full_shape) {}
+
221
+
222 template <rng::viewable_range R> auto operator()(R &&r) const {
+
223 if (tile_valid_) {
+
224 return mdspan_view(std::forward<R>(r), full_shape_, tile_shape_);
+
225 } else {
+
226 return mdspan_view(std::forward<R>(r), full_shape_);
+
227 }
+
228 }
+
229
+
230 template <rng::viewable_range R>
+
231 friend auto operator|(R &&r, const mdspan_adapter_closure &closure) {
+
232 return closure(std::forward<R>(r));
+
233 }
+
234
+
235private:
+
236 dr::__detail::dr_extents<Rank> full_shape_;
+
237 dr::__detail::dr_extents<Rank> tile_shape_;
+
238 bool tile_valid_ = false;
+
239};
+
240
+ +
242public:
+
243 template <rng::viewable_range R, typename Shape>
+
244 auto operator()(R &&r, Shape &&full_shape, Shape &&tile_shape) const {
+
245 return mdspan_adapter_closure(std::forward<Shape>(full_shape),
+
246 std::forward<Shape>(tile_shape))(
+
247 std::forward<R>(r));
+
248 }
+
249
+
250 template <rng::viewable_range R, typename Shape>
+
251 auto operator()(R &&r, Shape &&full_shape) const {
+
252 return mdspan_adapter_closure(std::forward<Shape>(full_shape))(
+
253 std::forward<R>(r));
+
254 }
+
255
+
256 template <typename Shape>
+
257 auto operator()(Shape &&full_shape, Shape &&tile_shape) const {
+
258 return mdspan_adapter_closure(std::forward<Shape>(full_shape),
+
259 std::forward<Shape>(tile_shape));
+
260 }
+
261
+
262 template <typename Shape> auto operator()(Shape &&full_shape) const {
+
263 return mdspan_adapter_closure(std::forward<Shape>(full_shape));
+
264 }
+
265};
+
266
+
267inline constexpr auto mdspan = mdspan_fn_{};
+
268
+
269} // namespace dr::mp::views
+
Definition: mdspan_utils.hpp:60
+
Definition: mdspan_view.hpp:26
+
Definition: mdspan_view.hpp:213
+
Definition: mdspan_view.hpp:241
+
Definition: concepts.hpp:42
+
Definition: concepts.hpp:20
+
Definition: mdspan_view.hpp:206
+
Definition: mdspan_view.hpp:80
+
+ + + + diff --git a/doxygen/memory_8hpp_source.html b/doxygen/memory_8hpp_source.html new file mode 100644 index 0000000000..c99739fab1 --- /dev/null +++ b/doxygen/memory_8hpp_source.html @@ -0,0 +1,190 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/memory.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
memory.hpp
+
+
+
1// SPDX-FileCopyrightText: Intel Corporation
+
2//
+
3// SPDX-License-Identifier: BSD-3-Clause
+
4
+
5#pragma once
+
6
+
7#include <cstring>
+
8
+
9namespace dr {
+
10
+
11template <typename T> struct default_memory {
+
12 using value_type = T;
+
13 std::allocator<T> std_allocator;
+
14
+
15 T *allocate(std::size_t size) {
+
16 auto p = std_allocator.allocate(size);
+
17 assert(p != nullptr);
+
18 memset(p, 0, sizeof(T) * size);
+
19 return p;
+
20 }
+
21
+
22 template <typename F> F *allocate(std::size_t size) {
+
23 std::allocator<F> allocator;
+
24 auto p = allocator.allocate(size);
+
25 assert(p != nullptr);
+
26 memset(p, 0, sizeof(F) * size);
+
27 return p;
+
28 }
+
29
+
30 constexpr void deallocate(T *p, std::size_t n) {
+
31 std_allocator.deallocate(p, n);
+
32 }
+
33
+
34 template <typename F> void deallocate(F *p, std::size_t n) {
+
35 std::allocator<F> allocator;
+
36 allocator.deallocate(p, n);
+
37 p = nullptr;
+
38 }
+
39
+
40 void memcpy(void *dst, const void *src, std::size_t numBytes) {
+
41 std::memcpy(dst, src, numBytes);
+
42 }
+
43
+
44 template <typename F> void offload(F lambda) { lambda(); }
+
45};
+
46
+
47#ifdef SYCL_LANGUAGE_VERSION
+
48template <typename T> struct sycl_memory {
+
49 using value_type = T;
+
50 using device_type = sycl::device;
+
51
+
52 sycl::device device_;
+
53 sycl::context context_;
+
54 sycl::usm::alloc kind_;
+
55 std::size_t alignment_;
+
56 sycl::queue offload_queue_;
+
57
+
58 sycl_memory(sycl::queue queue,
+
59 sycl::usm::alloc kind = sycl::usm::alloc::shared,
+
60 std::size_t alignment = 1)
+
61 : device_(queue.get_device()), context_(queue.get_context()), kind_(kind),
+
62 alignment_(alignment), offload_queue_(queue) {}
+
63
+
64 T *allocate(std::size_t n) {
+
65 auto p = sycl::aligned_alloc<T>(alignment_, n, device_, context_, kind_);
+
66 assert(p != nullptr);
+
67 return p;
+
68 }
+
69
+
70 template <typename F> F *allocate(std::size_t n) {
+
71 auto p = sycl::aligned_alloc<F>(alignment_, n, device_, context_, kind_);
+
72 assert(p != nullptr);
+
73 return p;
+
74 }
+
75
+
76 void deallocate(T *p, std::size_t n) {
+
77 assert(p != nullptr);
+
78 sycl::free(p, context_);
+
79 p = nullptr;
+
80 }
+
81
+
82 template <typename F> void deallocate(F *p, std::size_t n) {
+
83 assert(p != nullptr);
+
84 sycl::free(p, context_);
+
85 p = nullptr;
+
86 }
+
87
+
88 void memcpy(void *dst, const void *src, std::size_t numBytes) {
+
89 assert(dst != nullptr);
+
90 assert(src != nullptr);
+
91 offload_queue_.memcpy(dst, src, numBytes).wait();
+
92 }
+
93
+
94 template <typename F> void offload(F lambda) {
+
95 if (kind_ == sycl::usm::alloc::device) {
+
96 offload_queue_.single_task(lambda).wait();
+
97 } else {
+
98 lambda();
+
99 }
+
100 }
+
101};
+
102#endif
+
103
+
104} // namespace dr
+
Definition: memory.hpp:11
+
+ + + + diff --git a/doxygen/menu.js b/doxygen/menu.js new file mode 100644 index 0000000000..b0b26936a0 --- /dev/null +++ b/doxygen/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
    '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doxygen/menudata.js b/doxygen/menudata.js new file mode 100644 index 0000000000..1b1c559b33 --- /dev/null +++ b/doxygen/menudata.js @@ -0,0 +1,36 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Concepts",url:"concepts.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"inherits.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Functions",url:"functions_func.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}]} diff --git a/doxygen/mp_2algorithms_2copy_8hpp_source.html b/doxygen/mp_2algorithms_2copy_8hpp_source.html new file mode 100644 index 0000000000..6f837b37d1 --- /dev/null +++ b/doxygen/mp_2algorithms_2copy_8hpp_source.html @@ -0,0 +1,159 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/copy.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    copy.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/detail/ranges_shim.hpp>
    +
    8
    +
    9namespace dr::mp {
    +
    10
    +
    12void copy(rng::forward_range auto &&in, dr::distributed_iterator auto out) {
    +
    13 if (rng::empty(in)) {
    +
    14 return;
    +
    15 }
    +
    16
    +
    17 auto copy = [](auto &&v) { std::get<1>(v) = std::get<0>(v); };
    +
    18
    +
    19 for_each(views::zip(in, views::counted(out, rng::size(in))), copy);
    +
    20}
    +
    21
    +
    23template <dr::distributed_iterator DI_IN>
    +
    24void copy(DI_IN &&first, DI_IN &&last, dr::distributed_iterator auto &&out) {
    +
    25 copy(rng::subrange(first, last), out);
    +
    26}
    +
    27
    +
    28template <std::contiguous_iterator CI_IN>
    +
    29void copy(CI_IN &&first, CI_IN &&last,
    + +
    31 copy(0, rng::subrange(first, last), out);
    +
    32}
    +
    33
    +
    34void copy(rng::contiguous_range auto &&in,
    + +
    36 copy(0, in, out);
    +
    37}
    +
    38
    +
    39void copy(dr::distributed_contiguous_range auto &&in,
    +
    40 std::contiguous_iterator auto out) {
    +
    41 copy(0, in, out);
    +
    42}
    +
    43
    +
    45void copy(std::size_t root, dr::distributed_contiguous_range auto &&in,
    +
    46 std::contiguous_iterator auto out) {
    +
    47 if (default_comm().rank() == root) {
    +
    48 for (const auto &segment : dr::ranges::segments(in)) {
    +
    49 auto sz = rng::size(segment);
    +
    50 rng::begin(segment).get(std::to_address(out), sz);
    +
    51 out += sz;
    +
    52 }
    +
    53 }
    +
    54 barrier();
    +
    55}
    +
    56
    +
    58void copy(std::size_t root, rng::contiguous_range auto &&in,
    + +
    60 if (default_comm().rank() == root) {
    +
    61 auto in_ptr = std::to_address(in.begin());
    +
    62 for (auto remainder = rng::size(in); remainder > 0;) {
    +
    63 auto segment = *(dr::ranges::segments(out).begin());
    +
    64 auto sz = std::min(rng::size(segment), remainder);
    +
    65 assert(sz > 0);
    +
    66 rng::begin(segment).put(in_ptr, sz);
    +
    67 in_ptr += sz;
    +
    68 out += sz;
    +
    69 remainder -= sz;
    +
    70 }
    +
    71 }
    +
    72 barrier();
    +
    73}
    +
    74
    +
    75} // namespace dr::mp
    +
    Definition: concepts.hpp:51
    +
    Definition: concepts.hpp:42
    +
    Definition: concepts.hpp:31
    +
    + + + + diff --git a/doxygen/mp_2algorithms_2equal_8hpp_source.html b/doxygen/mp_2algorithms_2equal_8hpp_source.html new file mode 100644 index 0000000000..bf4fba6501 --- /dev/null +++ b/doxygen/mp_2algorithms_2equal_8hpp_source.html @@ -0,0 +1,146 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/equal.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    equal.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6#include <concepts>
    +
    7#include <dr/concepts/concepts.hpp>
    +
    8#include <dr/mp/algorithms/reduce.hpp>
    +
    9#include <dr/mp/algorithms/transform.hpp>
    +
    10#include <dr/mp/views/zip.hpp>
    +
    11
    +
    12namespace dr::mp::_detail {
    +
    13template <dr::distributed_range R1, dr::distributed_range R2>
    +
    14 requires std::equality_comparable_with<rng::range_value_t<R1>,
    +
    15 rng::range_value_t<R2>>
    +
    16bool equal(std::size_t root, bool root_provided, R1 &&r1, R2 &&r2) {
    +
    17
    +
    18 if (rng::distance(r1) != rng::distance(r2)) {
    +
    19 return false;
    +
    20 }
    +
    21
    +
    22 // we must use ints instead of bools, because distributed ranges do not
    +
    23 // support bools
    +
    24 auto compare = [](auto &&elems) {
    +
    25 return elems.first == elems.second ? 1 : 0;
    +
    26 };
    +
    27
    +
    28 auto zipped_views = views::zip(r1, r2);
    +
    29
    +
    30 // we are using mp::transform instead of mp::views::transform due to
    +
    31 // compilation error refer to DRA-192 and test/gtest/mp/reduce.cpp
    +
    32 mp::distributed_vector<int> compared(rng::distance(r1));
    +
    33 mp::transform(zipped_views, compared.begin(), compare);
    +
    34
    +
    35 auto min = [](double x, double y) { return std::min(x, y); };
    +
    36 if (root_provided) {
    +
    37 auto result = mp::reduce(root, compared, 1, min);
    +
    38 return result == 1;
    +
    39 }
    +
    40 auto result = mp::reduce(compared, 1, min);
    +
    41 return result == 1;
    +
    42}
    +
    43
    +
    44} // namespace dr::mp::_detail
    +
    45
    +
    46namespace dr::mp {
    +
    47template <dr::distributed_range R1, dr::distributed_range R2>
    +
    48 requires std::equality_comparable_with<rng::range_value_t<R1>,
    +
    49 rng::range_value_t<R2>>
    +
    50bool equal(std::size_t root, R1 &&r1, R2 &&r2) {
    +
    51 return _detail::equal(root, true, r1, r2);
    +
    52}
    +
    53
    +
    54template <dr::distributed_range R1, dr::distributed_range R2>
    +
    55 requires std::equality_comparable_with<rng::range_value_t<R1>,
    +
    56 rng::range_value_t<R2>>
    +
    57bool equal(R1 &&r1, R2 &&r2) {
    +
    58 return _detail::equal(0, false, r1, r2);
    +
    59}
    +
    60
    +
    61} // namespace dr::mp
    +
    + + + + diff --git a/doxygen/mp_2algorithms_2exclusive__scan_8hpp_source.html b/doxygen/mp_2algorithms_2exclusive__scan_8hpp_source.html new file mode 100644 index 0000000000..596c9be0fe --- /dev/null +++ b/doxygen/mp_2algorithms_2exclusive__scan_8hpp_source.html @@ -0,0 +1,138 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/exclusive_scan.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    exclusive_scan.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/mp/algorithms/inclusive_exclusive_scan_impl.hpp>
    +
    8
    +
    9namespace dr::mp {
    +
    10
    + +
    12 dr::distributed_contiguous_range O, typename T, typename BinaryOp>
    +
    13auto exclusive_scan(R &&r, O &&o, T init, BinaryOp &&binary_op) {
    +
    14 return __detail::inclusive_exclusive_scan_impl_<true>(
    +
    15 std::forward<R>(r), rng::begin(std::forward<O>(o)),
    +
    16 std::forward<BinaryOp>(binary_op),
    +
    17 std::optional<rng::range_value_t<R>>(init));
    +
    18}
    +
    19
    + + +
    22auto exclusive_scan(R &&r, O &&o, T init) {
    +
    23 return dr::mp::exclusive_scan(std::forward<R>(r), std::forward<O>(o),
    +
    24 static_cast<rng::range_value_t<R>>(init),
    +
    25 std::plus<rng::range_value_t<R>>());
    +
    26}
    +
    27
    +
    28// Distributed iterator versions
    +
    29
    +
    30template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter,
    +
    31 typename T, typename BinaryOp>
    +
    32OutputIter exclusive_scan(Iter first, Iter last, OutputIter d_first, T init,
    +
    33 BinaryOp &&binary_op) {
    +
    34
    +
    35 return dr::mp::exclusive_scan(rng::subrange(first, last), d_first,
    +
    36 std::forward<BinaryOp>(binary_op), init);
    +
    37}
    +
    38
    +
    39template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter,
    +
    40 typename T>
    +
    41OutputIter exclusive_scan(Iter first, Iter last, OutputIter d_first, T init) {
    +
    42 auto dist = rng::distance(first, last);
    +
    43 auto d_last = d_first;
    +
    44 rng::advance(d_last, dist);
    +
    45 dr::mp::exclusive_scan(rng::subrange(first, last),
    +
    46 rng::subrange(d_first, d_last), init);
    +
    47
    +
    48 return d_last;
    +
    49}
    +
    50
    +
    51} // namespace dr::mp
    +
    Definition: concepts.hpp:42
    +
    Definition: concepts.hpp:31
    +
    + + + + diff --git a/doxygen/mp_2algorithms_2fill_8hpp_source.html b/doxygen/mp_2algorithms_2fill_8hpp_source.html new file mode 100644 index 0000000000..dca4065575 --- /dev/null +++ b/doxygen/mp_2algorithms_2fill_8hpp_source.html @@ -0,0 +1,117 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/fill.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    fill.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <algorithm>
    +
    8#include <execution>
    +
    9#include <type_traits>
    +
    10#include <utility>
    +
    11
    +
    12#include <dr/concepts/concepts.hpp>
    +
    13#include <dr/detail/logger.hpp>
    +
    14#include <dr/detail/onedpl_direct_iterator.hpp>
    +
    15#include <dr/detail/ranges_shim.hpp>
    +
    16#include <dr/mp/global.hpp>
    +
    17
    +
    18namespace dr::mp {
    +
    19
    +
    21auto fill(dr::distributed_contiguous_range auto &&dr, auto value) {
    +
    22 for_each(dr, [=](auto &v) { v = value; });
    +
    23 return rng::end(dr);
    +
    24}
    +
    25
    +
    27template <dr::distributed_iterator DI>
    +
    28auto fill(DI first, DI last, auto value) {
    +
    29 mp::fill(rng::subrange(first, last), value);
    +
    30 return last;
    +
    31}
    +
    32
    +
    33} // namespace dr::mp
    +
    Definition: concepts.hpp:42
    +
    + + + + diff --git a/doxygen/mp_2algorithms_2for__each_8hpp_source.html b/doxygen/mp_2algorithms_2for__each_8hpp_source.html new file mode 100644 index 0000000000..f7e007f186 --- /dev/null +++ b/doxygen/mp_2algorithms_2for__each_8hpp_source.html @@ -0,0 +1,148 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/for_each.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    for_each.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <algorithm>
    +
    8#include <execution>
    +
    9#include <type_traits>
    +
    10#include <utility>
    +
    11
    +
    12#include <dr/concepts/concepts.hpp>
    +
    13#include <dr/detail/logger.hpp>
    +
    14#include <dr/detail/onedpl_direct_iterator.hpp>
    +
    15#include <dr/detail/ranges_shim.hpp>
    +
    16#include <dr/detail/sycl_utils.hpp>
    +
    17#include <dr/mp/global.hpp>
    +
    18
    +
    19namespace dr::mp {
    +
    20
    +
    22void for_each(dr::distributed_range auto &&dr, auto op) {
    +
    23 dr::drlog.debug(dr::logger::for_each, "for_each: parallel execution\n");
    +
    24 if (rng::empty(dr)) {
    +
    25 return;
    +
    26 }
    +
    27 assert(aligned(dr));
    +
    28
    +
    29 for (const auto &s : local_segments(dr)) {
    +
    30 if (mp::use_sycl()) {
    +
    31 dr::drlog.debug(" using sycl\n");
    +
    32
    +
    33 assert(rng::distance(s) > 0);
    +
    34#ifdef SYCL_LANGUAGE_VERSION
    +
    35 dr::__detail::parallel_for(
    +
    36 dr::mp::sycl_queue(), sycl::range<1>(rng::distance(s)),
    +
    37 [first = rng::begin(s), op](auto idx) { op(first[idx]); })
    +
    38 .wait();
    +
    39#else
    +
    40 assert(false);
    +
    41#endif
    +
    42 } else {
    +
    43 dr::drlog.debug(" using cpu\n");
    +
    44 rng::for_each(s, op);
    +
    45 }
    +
    46 }
    +
    47 barrier();
    +
    48}
    +
    49
    +
    51template <dr::distributed_iterator DI>
    +
    52void for_each(DI first, DI last, auto op) {
    +
    53 mp::for_each(rng::subrange(first, last), op);
    +
    54}
    +
    55
    +
    57template <dr::distributed_iterator DI, std::integral I>
    +
    58DI for_each_n(DI first, I n, auto op) {
    +
    59 auto last = first;
    +
    60 rng::advance(last, n);
    +
    61 mp::for_each(first, last, op);
    +
    62 return last;
    +
    63}
    +
    64
    +
    65} // namespace dr::mp
    +
    Definition: concepts.hpp:20
    +
    + + + + diff --git a/doxygen/mp_2algorithms_2inclusive__scan_8hpp_source.html b/doxygen/mp_2algorithms_2inclusive__scan_8hpp_source.html new file mode 100644 index 0000000000..748149d83e --- /dev/null +++ b/doxygen/mp_2algorithms_2inclusive__scan_8hpp_source.html @@ -0,0 +1,158 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/inclusive_scan.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    inclusive_scan.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/mp/algorithms/inclusive_exclusive_scan_impl.hpp>
    +
    8
    +
    9namespace dr::mp {
    +
    10
    + +
    12 dr::distributed_contiguous_range O, typename BinaryOp, typename T>
    +
    13auto inclusive_scan(R &&r, O &&o, BinaryOp &&binary_op, T init) {
    +
    14 return __detail::inclusive_exclusive_scan_impl_<false>(
    +
    15 std::forward<R>(r), rng::begin(std::forward<O>(o)),
    +
    16 std::forward<BinaryOp>(binary_op), std::optional(init));
    +
    17}
    +
    18
    + +
    20 dr::distributed_contiguous_range O, typename BinaryOp>
    +
    21auto inclusive_scan(R &&r, O &&o, BinaryOp &&binary_op) {
    +
    22 return __detail::inclusive_exclusive_scan_impl_<false>(
    +
    23 std::forward<R>(r), rng::begin(std::forward<O>(o)),
    +
    24 std::forward<BinaryOp>(binary_op));
    +
    25}
    +
    26
    + + +
    29auto inclusive_scan(R &&r, O &&o) {
    +
    30 return dr::mp::inclusive_scan(std::forward<R>(r), std::forward<O>(o),
    +
    31 std::plus<rng::range_value_t<R>>());
    +
    32}
    +
    33
    +
    34// Distributed iterator versions
    +
    35
    +
    36template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter,
    +
    37 typename BinaryOp, typename T>
    +
    38OutputIter inclusive_scan(Iter first, Iter last, OutputIter d_first,
    +
    39 BinaryOp &&binary_op, T init) {
    +
    40
    +
    41 return dr::mp::inclusive_scan(rng::subrange(first, last), d_first,
    +
    42 std::forward<BinaryOp>(binary_op), init);
    +
    43}
    +
    44
    +
    45template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter,
    +
    46 typename BinaryOp>
    +
    47OutputIter inclusive_scan(Iter first, Iter last, OutputIter d_first,
    +
    48 BinaryOp &&binary_op) {
    +
    49
    +
    50 auto dist = rng::distance(first, last);
    +
    51 auto d_last = d_first;
    +
    52 rng::advance(d_last, dist);
    +
    53 dr::mp::inclusive_scan(rng::subrange(first, last),
    +
    54 rng::subrange(d_first, d_last),
    +
    55 std::forward<BinaryOp>(binary_op));
    +
    56
    +
    57 return d_last;
    +
    58}
    +
    59
    +
    60template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter>
    +
    61OutputIter inclusive_scan(Iter first, Iter last, OutputIter d_first) {
    +
    62 auto dist = rng::distance(first, last);
    +
    63 auto d_last = d_first;
    +
    64 rng::advance(d_last, dist);
    +
    65 dr::mp::inclusive_scan(rng::subrange(first, last),
    +
    66 rng::subrange(d_first, d_last));
    +
    67
    +
    68 return d_last;
    +
    69}
    +
    70
    +
    71} // namespace dr::mp
    +
    Definition: concepts.hpp:42
    +
    Definition: concepts.hpp:31
    +
    + + + + diff --git a/doxygen/mp_2algorithms_2iota_8hpp_source.html b/doxygen/mp_2algorithms_2iota_8hpp_source.html new file mode 100644 index 0000000000..bbd0d493b5 --- /dev/null +++ b/doxygen/mp_2algorithms_2iota_8hpp_source.html @@ -0,0 +1,120 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/iota.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    iota.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <algorithm>
    +
    8#include <execution>
    +
    9#include <type_traits>
    +
    10#include <utility>
    +
    11
    +
    12#include <dr/concepts/concepts.hpp>
    +
    13#include <dr/detail/logger.hpp>
    +
    14#include <dr/detail/onedpl_direct_iterator.hpp>
    +
    15#include <dr/detail/ranges_shim.hpp>
    +
    16#include <dr/mp/global.hpp>
    +
    17
    +
    18namespace dr::mp {
    +
    19
    +
    21template <dr::distributed_range R, std::integral T> void iota(R &&r, T value) {
    +
    22 auto iota_view = rng::views::iota(value, T(value + rng::distance(r)));
    +
    23
    +
    24 for_each(views::zip(iota_view, r), [](auto &&elem) {
    +
    25 auto &&[idx, v] = elem;
    +
    26 v = idx;
    +
    27 });
    +
    28}
    +
    29
    +
    31template <dr::distributed_iterator Iter, std::integral T>
    +
    32void iota(Iter begin, Iter end, T value) {
    +
    33 auto r = rng::subrange(begin, end);
    +
    34 iota(r, value);
    +
    35}
    +
    36
    +
    37} // namespace dr::mp
    +
    + + + + diff --git a/doxygen/mp_2algorithms_2reduce_8hpp_source.html b/doxygen/mp_2algorithms_2reduce_8hpp_source.html new file mode 100644 index 0000000000..c6a94fca02 --- /dev/null +++ b/doxygen/mp_2algorithms_2reduce_8hpp_source.html @@ -0,0 +1,296 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/reduce.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    reduce.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7namespace dr::mp::__detail {
    +
    8
    +
    9inline auto std_reduce(rng::forward_range auto &&r, auto &&binary_op) {
    +
    10 using value_type = rng::range_value_t<decltype(r)>;
    +
    11 if (rng::empty(r)) {
    +
    12 return value_type{};
    +
    13 } else {
    +
    14 auto skip1 = rng::begin(r);
    +
    15 skip1++;
    +
    16 // Explicit cast from distributed_vector reference to value_type
    +
    17 return std::reduce(std::execution::par_unseq, skip1, rng::end(r),
    +
    18 value_type(*rng::begin(r)), binary_op);
    +
    19 }
    +
    20}
    +
    21
    +
    22inline auto dpl_reduce(rng::forward_range auto &&r, auto &&binary_op) {
    +
    23 rng::range_value_t<decltype(r)> none{};
    +
    24#ifdef SYCL_LANGUAGE_VERSION
    +
    25 if (rng::empty(r)) {
    +
    26 return none;
    +
    27 } else {
    +
    28 using T = rng::range_value_t<decltype(r)>;
    +
    29 using Fn = decltype(binary_op);
    +
    30 if constexpr (sycl::has_known_identity_v<Fn, T>) {
    +
    31 dr::drlog.debug(" known identity\n");
    +
    32 return std::reduce(dpl_policy(),
    +
    33 dr::__detail::direct_iterator(rng::begin(r)),
    + +
    35 sycl::known_identity_v<Fn, T>, binary_op);
    +
    36 } else {
    +
    37 dr::drlog.debug(" peel 1st value\n");
    +
    38 return std::reduce(dpl_policy(),
    +
    39 dr::__detail::direct_iterator(rng::begin(r) + 1),
    + +
    41 sycl_get(*rng::begin(r)), binary_op);
    +
    42 }
    +
    43 }
    +
    44#else
    +
    45 assert(false);
    +
    46 return none;
    +
    47#endif
    +
    48}
    +
    49
    +
    51template <dr::distributed_range DR>
    +
    52auto reduce(std::size_t root, bool root_provided, DR &&dr, auto &&binary_op) {
    +
    53 using value_type = rng::range_value_t<DR>;
    +
    54 auto comm = default_comm();
    +
    55
    +
    56 if (rng::empty(dr)) {
    +
    57 return rng::range_value_t<DR>{};
    +
    58 }
    +
    59
    +
    60 if (aligned(dr)) {
    +
    61 dr::drlog.debug("Parallel reduce\n");
    +
    62
    +
    63 // Reduce the local segments
    +
    64 auto reduce = [=](auto &&r) {
    +
    65 assert(rng::size(r) > 0);
    +
    66 if (mp::use_sycl()) {
    +
    67 dr::drlog.debug(" with DPL\n");
    +
    68 return dpl_reduce(r, binary_op);
    +
    69 } else {
    +
    70 dr::drlog.debug(" with CPU\n");
    +
    71 return std_reduce(r, binary_op);
    +
    72 }
    +
    73 };
    +
    74 auto locals = rng::views::transform(local_segments(dr), reduce);
    +
    75 auto local = std_reduce(locals, binary_op);
    +
    76
    +
    77 std::vector<value_type> all(comm.size());
    +
    78 if (root_provided) {
    +
    79 // Everyone gathers to root, only root reduces
    +
    80 comm.gather(local, std::span{all}, root);
    +
    81 if (root == comm.rank()) {
    +
    82 return std_reduce(all, binary_op);
    +
    83 } else {
    +
    84 return value_type{};
    +
    85 }
    +
    86 } else {
    +
    87 // Everyone gathers and everyone reduces
    +
    88 comm.all_gather(local, all);
    +
    89 return std_reduce(all, binary_op);
    +
    90 }
    +
    91 } else {
    +
    92 dr::drlog.debug("Serial reduce\n");
    +
    93 value_type result{};
    +
    94 if (!root_provided || root == comm.rank()) {
    +
    95 result = std_reduce(dr, binary_op);
    +
    96 }
    +
    97 barrier();
    +
    98 return result;
    +
    99 }
    +
    100}
    +
    101
    +
    102// handles init
    +
    103template <typename T, dr::distributed_range DR>
    +
    104T reduce(std::size_t root, bool root_provided, DR &&dr, T init,
    +
    105 auto &&binary_op = std::plus<>{}) {
    +
    106
    +
    107 if (rng::empty(dr)) {
    +
    108 return init;
    +
    109 }
    +
    110 return binary_op(init, reduce(root, root_provided, dr, binary_op));
    +
    111}
    +
    112
    +
    113inline void
    +
    114#if defined(__GNUC__) && !defined(__clang__)
    +
    115 __attribute__((optimize(0)))
    +
    116#endif
    +
    117 no_optimize(auto x) {
    +
    118}
    +
    119
    +
    120}; // namespace dr::mp::__detail
    +
    121
    +
    122namespace dr::mp {
    +
    123
    +
    124//
    +
    125// Ranges
    +
    126//
    +
    127
    +
    128// range, init, and binary op, w/wo root
    +
    129
    +
    131template <typename T, dr::distributed_range DR>
    +
    132auto reduce(std::size_t root, DR &&dr, T init, auto &&binary_op) {
    +
    133 return __detail::reduce(root, true, std::forward<DR>(dr), init, binary_op);
    +
    134}
    +
    136template <typename T, dr::distributed_range DR>
    +
    137auto reduce(DR &&dr, T init, auto &&binary_op) {
    +
    138 return __detail::reduce(0, false, std::forward<DR>(dr), init, binary_op);
    +
    139}
    +
    140
    +
    141// range, init, w/wo root
    +
    142
    +
    144template <typename T, dr::distributed_range DR>
    +
    145auto reduce(std::size_t root, DR &&dr, T init) {
    +
    146 return __detail::reduce(root, true, std::forward<DR>(dr), init,
    +
    147 std::plus<>{});
    +
    148}
    +
    150template <typename T, dr::distributed_range DR> auto reduce(DR &&dr, T init) {
    +
    151 return __detail::reduce(0, false, std::forward<DR>(dr), init, std::plus<>{});
    +
    152}
    +
    153
    +
    154// range, w/wo root
    +
    155
    +
    157template <dr::distributed_range DR> auto reduce(std::size_t root, DR &&dr) {
    +
    158 return __detail::reduce(root, true, std::forward<DR>(dr), std::plus<>{});
    +
    159}
    +
    160
    +
    162template <dr::distributed_range DR> auto reduce(DR &&dr) {
    +
    163 auto x = __detail::reduce(0, false, std::forward<DR>(dr), std::plus<>{});
    +
    164
    +
    165 // The code below avoids an issue where DotProduct_ZipReduce_DR
    +
    166 // fails with gcc11. From debugging, I can see that the call to
    +
    167 // __detail::reduce above computes the correct value, but this
    +
    168 // function returns a bad value. My theory is that the problem is
    +
    169 // related to tail call optimization and the function below disables
    +
    170 // the optimization.
    +
    171 __detail::no_optimize(x);
    +
    172
    +
    173 return x;
    +
    174}
    +
    175
    +
    176//
    +
    177// Iterators
    +
    178//
    +
    179
    +
    180// range, init, and binary op, w/wo root
    +
    181
    +
    183template <typename T, dr::distributed_iterator DI>
    +
    184auto reduce(std::size_t root, DI first, DI last, T init, auto &&binary_op) {
    +
    185 return __detail::reduce(root, true, rng::subrange(first, last), init,
    +
    186 binary_op);
    +
    187}
    +
    189template <typename T, dr::distributed_iterator DI>
    +
    190auto reduce(DI first, DI last, T init, auto &&binary_op) {
    +
    191 return __detail::reduce(0, false, rng::subrange(first, last), init,
    +
    192 binary_op);
    +
    193}
    +
    194
    +
    195// range, init, w/wo root
    +
    196
    +
    198template <typename T, dr::distributed_iterator DI>
    +
    199auto reduce(std::size_t root, DI first, DI last, T init) {
    +
    200 return __detail::reduce(root, true, rng::subrange(first, last), init,
    +
    201 std::plus<>{});
    +
    202}
    +
    204template <typename T, dr::distributed_iterator DI>
    +
    205auto reduce(DI first, DI last, T init) {
    +
    206 return __detail::reduce(0, false, rng::subrange(first, last), init,
    +
    207 std::plus<>{});
    +
    208}
    +
    209
    +
    210// range, w/wo root
    +
    211
    +
    213template <dr::distributed_iterator DI>
    +
    214auto reduce(std::size_t root, DI first, DI last) {
    +
    215 return __detail::reduce(root, true, rng::subrange(first, last),
    +
    216 std::plus<>{});
    +
    217}
    +
    219template <dr::distributed_iterator DI> auto reduce(DI first, DI last) {
    +
    220 return __detail::reduce(0, false, rng::subrange(first, last), std::plus<>{});
    +
    221}
    +
    222
    +
    223} // namespace dr::mp
    +
    Definition: onedpl_direct_iterator.hpp:15
    +
    + + + + diff --git a/doxygen/mp_2algorithms_2sort_8hpp_source.html b/doxygen/mp_2algorithms_2sort_8hpp_source.html new file mode 100644 index 0000000000..0748e4c361 --- /dev/null +++ b/doxygen/mp_2algorithms_2sort_8hpp_source.html @@ -0,0 +1,565 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/sort.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    sort.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#ifdef SYCL_LANGUAGE_VERSION
    +
    8#include <dr/sp/init.hpp>
    +
    9#include <oneapi/dpl/algorithm>
    +
    10#include <oneapi/dpl/execution>
    +
    11#include <oneapi/dpl/iterator>
    +
    12#endif
    +
    13
    +
    14#include <mpi.h>
    +
    15
    +
    16#include <algorithm>
    +
    17#include <utility>
    +
    18
    +
    19#include <dr/concepts/concepts.hpp>
    +
    20#include <dr/detail/logger.hpp>
    +
    21#include <dr/detail/onedpl_direct_iterator.hpp>
    +
    22#include <dr/detail/ranges_shim.hpp>
    +
    23#include <dr/mp/global.hpp>
    +
    24
    +
    25namespace dr::mp {
    +
    26
    +
    27namespace __detail {
    +
    28
    +
    29template <typename T> class buffer {
    +
    30
    +
    31public:
    +
    32 using value_type = T;
    +
    33 std::size_t size() { return size_; }
    +
    34
    +
    35 buffer(std::size_t cnt) : size_(cnt) {
    +
    36 if (cnt > 0) {
    +
    37 data_ = alloc_.allocate(cnt);
    +
    38 assert(data_ != nullptr);
    +
    39 }
    +
    40 }
    +
    41
    +
    42 ~buffer() {
    +
    43 if (data_ != nullptr)
    +
    44 alloc_.deallocate(data_, size_);
    +
    45 data_ = nullptr;
    +
    46 size_ = 0;
    +
    47 }
    +
    48
    +
    49 T *resize(std::size_t cnt) {
    +
    50 if (cnt == size_)
    +
    51 return data_;
    +
    52
    +
    53 if (cnt == 0) {
    +
    54 alloc_.deallocate(data_, size_);
    +
    55 data_ = nullptr;
    +
    56 } else {
    +
    57 T *newdata = alloc_.allocate(cnt);
    +
    58 copy(data_, newdata, std::min(size_, cnt));
    +
    59 alloc_.deallocate(data_, size_);
    +
    60 data_ = newdata;
    +
    61 }
    +
    62 size_ = cnt;
    +
    63 return data_;
    +
    64 }
    +
    65
    +
    66 void replace(buffer &other) {
    +
    67 if (data_ != nullptr)
    +
    68 alloc_.deallocate(data_, size_);
    +
    69
    +
    70 data_ = rng::data(other);
    +
    71 size_ = rng::size(other);
    +
    72 other.data_ = nullptr;
    +
    73 other.size_ = 0;
    +
    74 }
    +
    75
    +
    76 T *data() { return data_; }
    +
    77 T *begin() { return data_; }
    +
    78 T *end() { return data_ + size_; }
    +
    79
    +
    80private:
    +
    81 allocator<T> alloc_;
    +
    82 T *data_ = nullptr;
    +
    83 std::size_t size_ = 0;
    +
    84}; // class buffer
    +
    85
    +
    86template <typename R, typename Compare> void local_sort(R &r, Compare &&comp) {
    +
    87 if (rng::size(r) >= 2) {
    +
    88 if (mp::use_sycl()) {
    +
    89#ifdef SYCL_LANGUAGE_VERSION
    +
    90 auto policy = dpl_policy();
    +
    91 auto &&local_segment = dr::ranges::__detail::local(r);
    +
    92 DRLOG("GPU dpl::sort(), size {}", rng::size(r));
    +
    93 oneapi::dpl::sort(
    +
    94 policy, dr::__detail::direct_iterator(rng::begin(local_segment)),
    +
    95 dr::__detail::direct_iterator(rng::end(local_segment)), comp);
    +
    96#else
    +
    97 assert(false);
    +
    98#endif
    +
    99 } else {
    +
    100 DRLOG("cpu rng::sort, size {}", rng::size(r));
    +
    101 rng::sort(rng::begin(r), rng::end(r), comp);
    +
    102 }
    +
    103 }
    +
    104}
    +
    105
    +
    106template <typename T, typename Compare>
    +
    107void local_merge(buffer<T> &v, std::vector<std::size_t> chunks,
    +
    108 Compare &&comp) {
    +
    109
    +
    110 std::exclusive_scan(chunks.begin(), chunks.end(), chunks.begin(), 0);
    +
    111
    +
    112 while (chunks.size() > 1) {
    +
    113 std::size_t segno = chunks.size();
    +
    114 std::vector<std::size_t> next_chunks;
    +
    115 for (std::size_t i = 0; i < segno / 2; i++) {
    +
    116 auto first = v.begin() + chunks[2 * i];
    +
    117 auto middle = v.begin() + chunks[2 * i + 1];
    +
    118 auto last = (2 * i + 2 < segno) ? v.begin() + chunks[2 * i + 2] : v.end();
    +
    119 if (mp::use_sycl()) {
    +
    120#ifdef SYCL_LANGUAGE_VERSION
    +
    121 auto dfirst = dr::__detail::direct_iterator(first);
    +
    122 auto dmiddle = dr::__detail::direct_iterator(middle);
    +
    123 auto dlast = dr::__detail::direct_iterator(last);
    +
    124 oneapi::dpl::inplace_merge(dpl_policy(), dfirst, dmiddle, dlast, comp);
    +
    125#else
    +
    126 assert(false);
    +
    127#endif
    +
    128 } else {
    +
    129 std::inplace_merge(first, middle, last, comp);
    +
    130 }
    +
    131 next_chunks.push_back(chunks[2 * i]);
    +
    132 }
    +
    133 if (segno % 2 == 1) {
    +
    134 next_chunks.push_back(chunks[segno - 1]);
    +
    135 }
    +
    136 std::swap(chunks, next_chunks);
    +
    137 }
    +
    138}
    +
    139
    +
    140/* elements of dist_sort */
    +
    141template <typename valT, typename Compare, typename Seg>
    +
    142void splitters(Seg &lsegment, Compare &&comp,
    +
    143 std::vector<std::size_t> &vec_split_i,
    +
    144 std::vector<std::size_t> &vec_split_s) {
    +
    145 const std::size_t _comm_size = default_comm().size(); // dr-style ignore
    +
    146
    +
    147 assert(rng::size(vec_split_i) == _comm_size);
    +
    148 assert(rng::size(vec_split_s) == _comm_size);
    +
    149
    +
    150 std::vector<valT> vec_lmedians(_comm_size + 1);
    +
    151 std::vector<valT> vec_gmedians((_comm_size + 1) * _comm_size);
    +
    152
    +
    153 const double _step_m = static_cast<double>(rng::size(lsegment)) /
    +
    154 static_cast<double>(_comm_size);
    +
    155
    +
    156 /* calculate splitting values and indices - find n-1 dividers splitting
    +
    157 * each segment into equal parts */
    +
    158 if (mp::use_sycl()) {
    +
    159#ifdef SYCL_LANGUAGE_VERSION
    +
    160 std::vector<sycl::event> events;
    +
    161
    +
    162 for (std::size_t i = 0; i < rng::size(vec_lmedians) - 1; i++) {
    +
    163 assert(i * _step_m < rng::size(lsegment));
    +
    164 sycl::event ev = sycl_queue().memcpy(
    +
    165 &vec_lmedians[i], &lsegment[i * _step_m], sizeof(valT));
    +
    166 events.emplace_back(ev);
    +
    167 }
    +
    168 sycl::event ev =
    +
    169 sycl_queue().memcpy(&vec_lmedians[rng::size(vec_lmedians) - 1],
    +
    170 &lsegment[rng::size(lsegment) - 1], sizeof(valT));
    +
    171 events.emplace_back(ev);
    +
    172 sycl::event::wait(events);
    +
    173#else
    +
    174 assert(false);
    +
    175#endif
    +
    176 } else {
    +
    177 for (std::size_t i = 0; i < rng::size(vec_lmedians) - 1; i++) {
    +
    178 assert(i * _step_m < rng::size(lsegment));
    +
    179 vec_lmedians[i] = lsegment[i * _step_m];
    +
    180 }
    +
    181 vec_lmedians.back() = lsegment.back();
    +
    182 }
    +
    183
    +
    184 default_comm().all_gather(vec_lmedians, vec_gmedians);
    +
    185 rng::sort(rng::begin(vec_gmedians), rng::end(vec_gmedians), comp);
    +
    186
    +
    187 std::vector<valT> vec_split_v(_comm_size - 1);
    +
    188
    +
    189 for (std::size_t i = 0; i < _comm_size - 1; i++) {
    +
    190 auto global_median_idx = (i + 1) * (_comm_size + 1) - 1;
    +
    191 assert(global_median_idx < rng::size(vec_gmedians));
    +
    192 vec_split_v[i] = vec_gmedians[global_median_idx];
    +
    193 }
    +
    194
    +
    195 /* The while loop is executed in host memory, and together with
    +
    196 * sycl_copy takes most of the execution time of the sort procedure */
    +
    197 if (mp::use_sycl()) {
    +
    198#ifdef SYCL_LANGUAGE_VERSION
    +
    199 auto &&local_policy = dpl_policy();
    +
    200 sycl::queue q = sycl_queue();
    +
    201
    +
    202 auto lsb = dr::__detail::direct_iterator(rng::begin(lsegment));
    +
    203 auto lse = dr::__detail::direct_iterator(rng::end(lsegment));
    +
    204
    +
    205 oneapi::dpl::lower_bound(local_policy, lsb, lse, vec_split_v.begin(),
    +
    206 vec_split_v.end(), vec_split_i.begin() + 1, comp);
    +
    207
    +
    208#else
    +
    209 assert(false);
    +
    210#endif
    +
    211 } else {
    +
    212 for (std::size_t i = 1; i <= rng::size(vec_split_v); i++) {
    +
    213 auto idx = vec_split_v[i - 1];
    +
    214 auto lower =
    +
    215 std::lower_bound(lsegment.begin(), lsegment.end(), idx, comp);
    +
    216 vec_split_i[i] = rng::distance(lsegment.begin(), lower);
    +
    217 }
    +
    218 }
    +
    219 for (std::size_t i = 1; i < vec_split_i.size(); i++) {
    +
    220 vec_split_s[i - 1] = vec_split_i[i] - vec_split_i[i - 1];
    +
    221 }
    +
    222 vec_split_s.back() = rng::size(lsegment) - vec_split_i.back();
    +
    223}
    +
    224
    +
    225template <typename valT>
    +
    226void shift_data(const int64_t shift_left, const int64_t shift_right,
    +
    227 buffer<valT> &vec_recvdata, buffer<valT> &vec_left,
    +
    228 buffer<valT> &vec_right) {
    +
    229 const std::size_t _comm_rank = default_comm().rank();
    +
    230
    +
    231 MPI_Request req_l, req_r;
    +
    232 MPI_Status stat_l, stat_r;
    +
    233
    +
    234 assert(static_cast<int64_t>(rng::size(vec_left)) == std::max(0L, shift_left));
    +
    235 assert(static_cast<int64_t>(rng::size(vec_right)) ==
    +
    236 std::max(0L, shift_right));
    +
    237
    +
    238 if (static_cast<int64_t>(rng::size(vec_recvdata)) < -shift_left) {
    +
    239 // Too little data in recv buffer to shift left - first get from right,
    +
    240 // then send left
    +
    241 DRLOG("Get from right first, recvdata size {} shift left {}",
    +
    242 rng::size(vec_recvdata), shift_left);
    +
    243
    +
    244 assert(shift_right > 0);
    +
    245
    +
    246 default_comm().irecv(rng::data(vec_right), rng::size(vec_right),
    +
    247 _comm_rank + 1, &req_r);
    +
    248 MPI_Wait(&req_r, &stat_r);
    +
    249
    +
    250 std::size_t old_size = rng::size(vec_recvdata);
    +
    251 vec_recvdata.resize(rng::size(vec_recvdata) + shift_right);
    +
    252
    +
    253 assert(rng::size(vec_right) <= rng::size(vec_recvdata) - old_size);
    +
    254
    +
    255 __detail::copy(rng::data(vec_right), rng::data(vec_recvdata) + old_size,
    +
    256 rng::size(vec_right));
    +
    257
    +
    258 vec_right.resize(0);
    +
    259
    +
    260 default_comm().isend(rng::data(vec_recvdata), -shift_left, _comm_rank - 1,
    +
    261 &req_l);
    +
    262 MPI_Wait(&req_l, &stat_l);
    +
    263
    +
    264 } else if (static_cast<int64_t>(rng::size(vec_recvdata)) < -shift_right) {
    +
    265 // Too little data in buffer to shift right - first get from left, then
    +
    266 // send right
    +
    267 // ** This will never happen, because values eq to split go right
    +
    268 DRLOG(
    +
    269 "Too little data in buffer to shift right - this should never happen");
    +
    270 assert(false);
    +
    271
    +
    272 } else {
    +
    273 // enough data in recv buffer
    +
    274 if (shift_left < 0) {
    +
    275 default_comm().isend(rng::data(vec_recvdata), -shift_left, _comm_rank - 1,
    +
    276 &req_l);
    +
    277 } else if (shift_left > 0) {
    +
    278 assert(shift_left == static_cast<int64_t>(rng::size(vec_left)));
    +
    279 default_comm().irecv(rng::data(vec_left), rng::size(vec_left),
    +
    280 _comm_rank - 1, &req_l);
    +
    281 }
    +
    282 if (shift_right > 0) {
    +
    283 assert(shift_right == static_cast<int64_t>(rng::size(vec_right)));
    +
    284 default_comm().irecv(rng::data(vec_right), rng::size(vec_right),
    +
    285 _comm_rank + 1, &req_r);
    +
    286 } else if (shift_right < 0) {
    +
    287 default_comm().isend(rng::data(vec_recvdata) + rng::size(vec_recvdata) +
    +
    288 shift_right,
    +
    289 -shift_right, _comm_rank + 1, &req_r);
    +
    290 }
    +
    291 if (shift_left != 0)
    +
    292 MPI_Wait(&req_l, &stat_l);
    +
    293 if (shift_right != 0)
    +
    294 MPI_Wait(&req_r, &stat_r);
    +
    295 }
    +
    296}
    +
    297
    +
    298template <typename valT>
    +
    299void copy_results(auto &lsegment, const int64_t shift_left,
    +
    300 const int64_t shift_right, buffer<valT> &vec_recvdata,
    +
    301 buffer<valT> &vec_left, buffer<valT> &vec_right) {
    +
    302 const std::size_t invalidate_left = std::max(-shift_left, 0L);
    +
    303 const std::size_t invalidate_right = std::max(-shift_right, 0L);
    +
    304
    +
    305 const std::size_t size_l = rng::size(vec_left);
    +
    306 const std::size_t size_r = rng::size(vec_right);
    +
    307 const std::size_t size_d =
    +
    308 rng::size(vec_recvdata) - (invalidate_left + invalidate_right);
    +
    309
    +
    310 if (mp::use_sycl()) {
    +
    311#ifdef SYCL_LANGUAGE_VERSION
    +
    312 sycl::event e_l, e_d, e_r;
    +
    313
    +
    314 if (size_l > 0) {
    +
    315 assert(size_l <= rng::size(lsegment));
    +
    316 e_l = sycl_queue().copy(rng::data(vec_left), rng::data(lsegment), size_l);
    +
    317 }
    +
    318 if (size_r > 0) {
    +
    319 assert(size_l + size_d + size_r <= rng::size(lsegment));
    +
    320 e_r = sycl_queue().copy(rng::data(vec_right),
    +
    321 rng::data(lsegment) + size_l + size_d, size_r);
    +
    322 }
    +
    323 if (size_d > 0) {
    +
    324 assert(size_l + size_d <= rng::size(lsegment));
    +
    325 assert(invalidate_left + size_d <= rng::size(vec_recvdata));
    +
    326 e_d = sycl_queue().copy(rng::data(vec_recvdata) + invalidate_left,
    +
    327 rng::data(lsegment) + size_l, size_d);
    +
    328 }
    +
    329 if (size_l > 0)
    +
    330 e_l.wait();
    +
    331 if (size_r > 0)
    +
    332 e_r.wait();
    +
    333 if (size_d > 0)
    +
    334 e_d.wait();
    +
    335
    +
    336#else
    +
    337 assert(false);
    +
    338#endif
    +
    339 } else {
    +
    340 if (size_l > 0) {
    +
    341 assert(size_l <= rng::size(lsegment));
    +
    342 std::copy(rng::begin(vec_left), rng::end(vec_left), rng::begin(lsegment));
    +
    343 }
    +
    344 if (size_r > 0) {
    +
    345 assert(size_l + size_d + size_r <= rng::size(lsegment));
    +
    346 std::copy(rng::begin(vec_right), rng::end(vec_right),
    +
    347 rng::begin(lsegment) + size_l + size_d);
    +
    348 }
    +
    349 if (size_d > 0) {
    +
    350 assert(size_l + size_d <= rng::size(lsegment));
    +
    351 assert(invalidate_left + size_d <= rng::size(vec_recvdata));
    +
    352 std::copy(rng::begin(vec_recvdata) + invalidate_left,
    +
    353 rng::begin(vec_recvdata) + invalidate_left + size_d,
    +
    354 rng::begin(lsegment) + size_l);
    +
    355 }
    +
    356 }
    +
    357}
    +
    358
    +
    359template <dr::distributed_range R, typename Compare>
    +
    360void dist_sort(R &r, Compare &&comp) {
    +
    361 using valT = typename R::value_type;
    +
    362
    +
    363 const std::size_t _comm_rank = default_comm().rank();
    +
    364 const std::size_t _comm_size = default_comm().size(); // dr-style ignore
    +
    365
    +
    366 auto &&lsegment = local_segment(r);
    +
    367
    +
    368 std::vector<std::size_t> vec_split_i(_comm_size, 0);
    +
    369 std::vector<std::size_t> vec_split_s(_comm_size, 0);
    +
    370 std::vector<std::size_t> vec_rsizes(_comm_size, 0);
    +
    371 std::vector<std::size_t> vec_rindices(_comm_size, 0);
    +
    372 std::vector<std::size_t> vec_recv_elems(_comm_size, 0);
    +
    373 std::size_t _total_elems = 0;
    +
    374
    +
    375 DRLOG("Rank {}: Dist sort, local segment size {}", default_comm().rank(),
    +
    376 rng::size(lsegment));
    +
    377 __detail::local_sort(lsegment, comp);
    +
    378
    +
    379 /* find splitting values - limits of areas to send to other processes */
    +
    380 __detail::splitters<valT>(lsegment, comp, vec_split_i, vec_split_s);
    +
    381 default_comm().alltoall(vec_split_s, vec_rsizes, 1);
    +
    382
    +
    383 /* prepare data to send and receive */
    +
    384 std::exclusive_scan(vec_rsizes.begin(), vec_rsizes.end(),
    +
    385 vec_rindices.begin(), 0);
    +
    386 const std::size_t _recv_elems = vec_rindices.back() + vec_rsizes.back();
    +
    387
    +
    388 /* send and receive data belonging to each node, then redistribute
    +
    389 * data to achieve size of data equal to size of local segment */
    +
    390 /* async i_all_gather causes problems on some systems */
    +
    391 // MPI_Request req_recvelems;
    +
    392 default_comm().all_gather(_recv_elems, vec_recv_elems);
    +
    393
    +
    394 /* buffer for received data */
    +
    395 buffer<valT> vec_recvdata(_recv_elems);
    +
    396
    +
    397 /* send data not belonging and receive data belonging to local processes
    +
    398 */
    +
    399 default_comm().alltoallv(lsegment, vec_split_s, vec_split_i, vec_recvdata,
    +
    400 vec_rsizes, vec_rindices);
    +
    401
    +
    402 __detail::local_merge(vec_recvdata, vec_rsizes, comp);
    +
    403
    +
    404 // MPI_Wait(&req_recvelems, MPI_STATUS_IGNORE);
    +
    405
    +
    406 _total_elems = std::reduce(vec_recv_elems.begin(), vec_recv_elems.end());
    +
    407
    +
    408 /* prepare data for shift to neighboring processes */
    +
    409 std::vector<int64_t> vec_shift(_comm_size - 1);
    +
    410
    +
    411 const auto desired_elems_num = (_total_elems + _comm_size - 1) / _comm_size;
    +
    412
    +
    413 vec_shift[0] = desired_elems_num - vec_recv_elems[0];
    +
    414 for (std::size_t i = 1; i < _comm_size - 1; i++) {
    +
    415 vec_shift[i] = vec_shift[i - 1] + desired_elems_num - vec_recv_elems[i];
    +
    416 }
    +
    417
    +
    418 const int64_t shift_left = _comm_rank == 0 ? 0 : -vec_shift[_comm_rank - 1];
    +
    419 const int64_t shift_right =
    +
    420 _comm_rank == _comm_size - 1 ? 0 : vec_shift[_comm_rank];
    +
    421
    +
    422 buffer<valT> vec_left(std::max(shift_left, 0L));
    +
    423 buffer<valT> vec_right(std::max(shift_right, 0L));
    +
    424
    +
    425 /* shift data if necessary, to have exactly the number of elements equal to
    +
    426 * lsegment size */
    +
    427 __detail::shift_data<valT>(shift_left, shift_right, vec_recvdata, vec_left,
    +
    428 vec_right);
    +
    429
    +
    430 /* copy results to distributed vector's local segment */
    +
    431 __detail::copy_results<valT>(lsegment, shift_left, shift_right, vec_recvdata,
    +
    432 vec_left, vec_right);
    +
    433} // __detail::dist_sort
    +
    434
    +
    435} // namespace __detail
    +
    436
    +
    437template <dr::distributed_range R, typename Compare = std::less<>>
    +
    438void sort(R &r, Compare &&comp = Compare()) {
    +
    439
    +
    440 using valT = typename R::value_type;
    +
    441
    +
    442 std::size_t _comm_rank = default_comm().rank();
    +
    443 std::size_t _comm_size = default_comm().size(); // dr-style ignore
    +
    444
    +
    445 if (_comm_size == 1) {
    +
    446 DRLOG("mp::sort() - one node only");
    +
    447 auto &&lsegment = local_segment(r);
    +
    448 __detail::local_sort(lsegment, comp);
    +
    449
    +
    450 } else if (rng::size(r) <= (_comm_size - 1) * (_comm_size - 1)) {
    +
    451 /* Distributed vector of size <= (comm_size-1) * (comm_size-1) may have
    +
    452 * 0-size local segments. It is also small enough to prefer sequential sort
    +
    453 */
    +
    454 DRLOG("mp::sort() - local sort on node 0");
    +
    455
    +
    456 std::vector<valT> vec_recvdata(rng::size(r));
    +
    457 dr::mp::copy(0, r, rng::begin(vec_recvdata));
    +
    458
    +
    459 if (_comm_rank == 0) {
    +
    460 rng::sort(vec_recvdata, comp);
    +
    461 }
    +
    462 dr::mp::barrier();
    +
    463 dr::mp::copy(0, vec_recvdata, rng::begin(r));
    +
    464
    +
    465 } else {
    +
    466 DRLOG("mp::sort() - distributed sort");
    +
    467 __detail::dist_sort(r, comp);
    +
    468 dr::mp::barrier();
    +
    469 }
    +
    470}
    +
    471
    +
    472template <dr::distributed_iterator RandomIt, typename Compare = std::less<>>
    +
    473void sort(RandomIt first, RandomIt last, Compare comp = Compare()) {
    +
    474 sort(rng::subrange(first, last), comp);
    +
    475}
    +
    476
    +
    477} // namespace dr::mp
    +
    Definition: onedpl_direct_iterator.hpp:15
    +
    Definition: allocator.hpp:11
    +
    Definition: sort.hpp:29
    +
    + + + + diff --git a/doxygen/mp_2algorithms_2transform_8hpp_source.html b/doxygen/mp_2algorithms_2transform_8hpp_source.html new file mode 100644 index 0000000000..4b33821715 --- /dev/null +++ b/doxygen/mp_2algorithms_2transform_8hpp_source.html @@ -0,0 +1,127 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/transform.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    transform.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <algorithm>
    +
    8#include <execution>
    +
    9#include <type_traits>
    +
    10#include <utility>
    +
    11
    +
    12#include <dr/concepts/concepts.hpp>
    +
    13#include <dr/detail/logger.hpp>
    +
    14#include <dr/detail/onedpl_direct_iterator.hpp>
    +
    15#include <dr/detail/ranges_shim.hpp>
    +
    16#include <dr/mp/global.hpp>
    +
    17
    +
    18namespace dr::mp {
    +
    19
    +
    20void transform(rng::forward_range auto &&in, dr::distributed_iterator auto out,
    +
    21 auto op) {
    +
    22 if (rng::empty(in)) {
    +
    23 return;
    +
    24 }
    +
    25 assert(aligned(in, out));
    +
    26
    +
    27 auto zip = mp::views::zip(in, rng::subrange(out, out + rng::size(in)));
    +
    28 auto transform_op = [op](auto pair) {
    +
    29 auto &[in, out] = pair;
    +
    30 out = op(in);
    +
    31 };
    +
    32 for_each(zip, transform_op);
    +
    33}
    +
    34
    +
    35template <rng::forward_iterator DI_IN>
    +
    36void transform(DI_IN &&first, DI_IN &&last, dr::distributed_iterator auto &&out,
    +
    37 auto op) {
    +
    38 mp::transform(rng::subrange(first, last), out, op);
    +
    39}
    +
    40
    +
    41} // namespace dr::mp
    +
    Definition: concepts.hpp:31
    +
    + + + + diff --git a/doxygen/mp_2containers_2distributed__vector_8hpp_source.html b/doxygen/mp_2containers_2distributed__vector_8hpp_source.html new file mode 100644 index 0000000000..c841eaeef6 --- /dev/null +++ b/doxygen/mp_2containers_2distributed__vector_8hpp_source.html @@ -0,0 +1,420 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/containers/distributed_vector.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    distributed_vector.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/mp/algorithms/fill.hpp>
    +
    8#include <dr/mp/allocator.hpp>
    +
    9#include <dr/mp/containers/distribution.hpp>
    +
    10#include <dr/mp/containers/segment.hpp>
    +
    11
    +
    12namespace dr::mp {
    +
    13
    + +
    15 dr::rma_window win_;
    +
    16
    +
    17public:
    +
    18 void *allocate(std::size_t data_size) {
    +
    19 assert(data_size > 0);
    +
    20 void *data = __detail::allocator<std::byte>().allocate(data_size);
    +
    21 DRLOG("called MPI allocate({}) -> got:{}", data_size, data);
    +
    22 win_.create(default_comm(), data, data_size);
    +
    23 active_wins().insert(win_.mpi_win());
    +
    24 return data;
    +
    25 }
    +
    26
    +
    27 void deallocate(void *data, std::size_t data_size) {
    +
    28 assert(data_size > 0);
    +
    29 DRLOG("calling MPI deallocate ({}, data_size:{})", data, data_size);
    +
    30 active_wins().erase(win_.mpi_win());
    +
    31 win_.free();
    +
    32 __detail::allocator<std::byte>().deallocate(static_cast<std::byte *>(data),
    +
    33 data_size);
    +
    34 }
    +
    35
    +
    36 void getmem(void *dst, std::size_t offset, std::size_t datalen,
    +
    37 int segment_index) {
    +
    38 DRLOG("calling MPI get(dst:{}, "
    +
    39 "segm_offset:{}, size:{}, peer:{})",
    +
    40 dst, offset, datalen, segment_index);
    +
    41
    +
    42#if (MPI_VERSION >= 4) || \
    +
    43 (defined(I_MPI_NUMVERSION) && (I_MPI_NUMVERSION > 20211200000))
    +
    44 // 64-bit API inside
    +
    45 win_.get(dst, datalen, segment_index, offset);
    +
    46#else
    +
    47 for (std::size_t remainder = datalen, off = 0UL; remainder > 0;) {
    +
    48 std::size_t s = std::min(remainder, (std::size_t)INT_MAX);
    +
    49 DRLOG("{}:{} win_.get total {} now {} bytes at off {}, dst offset {}",
    +
    50 default_comm().rank(), __LINE__, datalen, s, off, offset + off);
    +
    51 win_.get((uint8_t *)dst + off, s, segment_index, offset + off);
    +
    52 off += s;
    +
    53 remainder -= s;
    +
    54 }
    +
    55#endif
    +
    56 }
    +
    57
    +
    58 void putmem(void const *src, std::size_t offset, std::size_t datalen,
    +
    59 int segment_index) {
    +
    60 DRLOG("calling MPI put(segm_offset:{}, "
    +
    61 "src:{}, size:{}, peer:{})",
    +
    62 offset, src, datalen, segment_index);
    +
    63
    +
    64#if (MPI_VERSION >= 4) || \
    +
    65 (defined(I_MPI_NUMVERSION) && (I_MPI_NUMVERSION > 20211200000))
    +
    66 // 64-bit API inside
    +
    67 win_.put(src, datalen, segment_index, offset);
    +
    68#else
    +
    69 for (std::size_t remainder = datalen, off = 0UL; remainder > 0;) {
    +
    70 std::size_t s = std::min(remainder, (std::size_t)INT_MAX);
    +
    71 DRLOG("{}:{} win_.put {} bytes at off {}, dst offset {}",
    +
    72 default_comm().rank(), __LINE__, s, off, offset + off);
    +
    73 win_.put((uint8_t *)src + off, s, segment_index, offset + off);
    +
    74 off += s;
    +
    75 remainder -= s;
    +
    76 }
    +
    77#endif
    +
    78 }
    +
    79
    +
    80 std::size_t getrank() { return win_.communicator().rank(); }
    +
    81
    +
    82 void fence() { win_.fence(); }
    +
    83};
    +
    84
    +
    85#ifdef DRISHMEM
    +
    86class IshmemBackend {
    +
    87 void *shared_mem_;
    +
    88
    +
    89public:
    +
    90 void *allocate(std::size_t data_size) {
    +
    91 assert(data_size > 0);
    +
    92 shared_mem_ = ishmem_malloc(data_size);
    +
    93 DRLOG("called ishmem_malloc({}) -> got:{}", data_size, shared_mem_);
    +
    94 return shared_mem_;
    +
    95 }
    +
    96
    +
    97 void deallocate(void *data, std::size_t data_size) {
    +
    98 assert(data_size > 0);
    +
    99 assert(data == shared_mem_);
    +
    100 drlog.debug("calling ishmem_free({})\n", data);
    +
    101 ishmem_free(data);
    +
    102 }
    +
    103
    +
    104 void getmem(void *dst, std::size_t offset, std::size_t datalen,
    +
    105 int segment_index) {
    +
    106 void *src = static_cast<std::byte *>(shared_mem_) + offset;
    +
    107
    +
    108 DRLOG("calling ishmem_getmem(dst:{}, src:{} (= dv:{} + "
    +
    109 "segm_offset:{}), size:{}, peer:{})",
    +
    110 dst, src, shared_mem_, offset, datalen, segment_index);
    +
    111
    +
    112 ishmem_getmem(dst, src, datalen, segment_index);
    +
    113 }
    +
    114
    +
    115 void putmem(void const *src, std::size_t offset, std::size_t datalen,
    +
    116 int segment_index) {
    +
    117 void *dst = static_cast<std::byte *>(shared_mem_) + offset;
    +
    118 DRLOG("calling ishmem_putmem(dst:{} (= dv:{} + segm_offset:{}), "
    +
    119 "src:{}, size:{}, peer:{})",
    +
    120 dst, shared_mem_, offset, src, datalen, segment_index);
    +
    121 ishmem_putmem(dst, src, datalen, segment_index);
    +
    122 }
    +
    123
    +
    124 std::size_t getrank() {
    +
    125 auto my_process_segment_index = ishmem_my_pe();
    +
    126 DRLOG("called ishmem_my_pe() -> {}", my_process_segment_index);
    +
    127 return my_process_segment_index;
    +
    128 }
    +
    129
    +
    130 void fence() {
    +
    131 // TODO: to have locality use ishmemx_fence_work_group
    +
    132 ishmem_fence();
    +
    133 }
    +
    134};
    +
    135#endif
    +
    136
    +
    138template <typename T, class BackendT = MpiBackend> class distributed_vector {
    +
    139
    +
    140public:
    +
    141 using value_type = T;
    +
    142 using size_type = std::size_t;
    +
    143 using difference_type = std::ptrdiff_t;
    +
    144 using backend_type = BackendT;
    +
    145
    +
    146 class iterator {
    +
    147 public:
    +
    148 using iterator_category = std::random_access_iterator_tag;
    +
    149 using value_type = typename distributed_vector::value_type;
    +
    150 using difference_type = typename distributed_vector::difference_type;
    +
    151
    +
    152 iterator() {}
    +
    153 iterator(const distributed_vector *parent, difference_type offset)
    +
    154 : parent_(parent), offset_(offset) {}
    +
    155
    +
    156 auto operator+(difference_type n) const {
    +
    157 return iterator(parent_, offset_ + n);
    +
    158 }
    +
    159 friend auto operator+(difference_type n, const iterator &other) {
    +
    160 return other + n;
    +
    161 }
    +
    162 auto operator-(difference_type n) const {
    +
    163 return iterator(parent_, offset_ - n);
    +
    164 }
    +
    165 auto operator-(iterator other) const { return offset_ - other.offset_; }
    +
    166
    +
    167 auto &operator+=(difference_type n) {
    +
    168 offset_ += n;
    +
    169 return *this;
    +
    170 }
    +
    171 auto &operator-=(difference_type n) {
    +
    172 offset_ -= n;
    +
    173 return *this;
    +
    174 }
    +
    175 auto &operator++() {
    +
    176 offset_++;
    +
    177 return *this;
    +
    178 }
    +
    179 auto operator++(int) {
    +
    180 auto old = *this;
    +
    181 offset_++;
    +
    182 return old;
    +
    183 }
    +
    184 auto &operator--() {
    +
    185 offset_--;
    +
    186 return *this;
    +
    187 }
    +
    188 auto operator--(int) {
    +
    189 auto old = *this;
    +
    190 offset_--;
    +
    191 return old;
    +
    192 }
    +
    193
    +
    194 bool operator==(iterator other) const {
    +
    195 if (parent_ == nullptr || other.parent_ == nullptr) {
    +
    196 return false;
    +
    197 } else {
    +
    198 return offset_ == other.offset_;
    +
    199 }
    +
    200 }
    +
    201 auto operator<=>(iterator other) const {
    +
    202 assert(parent_ == other.parent_);
    +
    203 return offset_ <=> other.offset_;
    +
    204 }
    +
    205
    +
    206 auto operator*() const {
    +
    207 auto segment_size = parent_->segment_size_;
    +
    208 return parent_
    +
    209 ->segments()[offset_ / segment_size][offset_ % segment_size];
    +
    210 }
    +
    211 auto operator[](difference_type n) const { return *(*this + n); }
    +
    212
    +
    213 auto local() {
    +
    214 auto segment_size = parent_->segment_size_;
    +
    215 return (parent_->segments()[offset_ / segment_size].begin() +
    +
    216 offset_ % segment_size)
    +
    217 .local();
    +
    218 }
    +
    219
    +
    220 //
    +
    221 // Support for distributed ranges
    +
    222 //
    +
    223 // distributed iterator provides segments
    +
    224 // remote iterator provides local
    +
    225 //
    +
    226 auto segments() {
    +
    227 return dr::__detail::drop_segments(parent_->segments(), offset_);
    +
    228 }
    +
    229
    +
    230 private:
    +
    231 const distributed_vector *parent_ = nullptr;
    +
    232 difference_type offset_;
    +
    233 };
    +
    234
    +
    235 // Do not copy
    +
    236 // We need a move constructor for the implementation of reduce algorithm
    +
    237 distributed_vector(const distributed_vector &) = delete;
    +
    238 distributed_vector &operator=(const distributed_vector &) = delete;
    +
    239 distributed_vector(distributed_vector &&) { assert(false); }
    +
    240
    + +
    243 init(size, dist);
    +
    244 }
    +
    245
    +
    247 distributed_vector(std::size_t size, value_type fill_value,
    +
    248 distribution dist = distribution()) {
    +
    249 init(size, dist);
    +
    250 mp::fill(*this, fill_value);
    +
    251 }
    +
    252
    + +
    254 if (!finalized()) {
    +
    255 fence();
    +
    256 if (data_ != nullptr) {
    +
    257 backend.deallocate(data_, data_size_ * sizeof(value_type));
    +
    258 }
    +
    259
    +
    260 delete halo_;
    +
    261 }
    +
    262 }
    +
    263
    +
    265 auto begin() const { return iterator(this, 0); }
    +
    267 auto end() const { return begin() + size_; }
    +
    268
    +
    270 auto size() const { return size_; }
    +
    272 auto operator[](difference_type n) const { return *(begin() + n); }
    +
    273 auto &halo() const { return *halo_; }
    +
    274
    +
    275 auto segments() const { return rng::views::all(segments_); }
    +
    276
    +
    277 void fence() { backend.fence(); }
    +
    278
    +
    279private:
    +
    280 void init(auto size, auto dist) {
    +
    281 size_ = size;
    +
    282 distribution_ = dist;
    +
    283
    +
    284 // determine the distribution of data
    +
    285 auto comm_size = default_comm().size(); // dr-style ignore
    +
    286 auto hb = dist.halo();
    +
    287 std::size_t gran = dist.granularity();
    +
    288 // TODO: make this an error that is reported back to user
    +
    289 assert(size % gran == 0 && "size must be a multiple of the granularity");
    +
    290 assert(hb.prev % gran == 0 && "size must be a multiple of the granularity");
    +
    291 assert(hb.next % gran == 0 && "size must be a multiple of the granularity");
    +
    292 segment_size_ = gran * std::max({(size / gran + comm_size - 1) / comm_size,
    +
    293 hb.prev / gran, hb.next / gran});
    +
    294
    +
    295 data_size_ = segment_size_ + hb.prev + hb.next;
    +
    296
    +
    297 if (size_ > 0) {
    +
    298 data_ = static_cast<T *>(backend.allocate(data_size_ * sizeof(T)));
    +
    299 }
    +
    300
    +
    301 halo_ = new span_halo<T>(default_comm(), data_, data_size_, hb);
    +
    302
    +
    303 std::size_t segment_index = 0;
    +
    304 for (std::size_t i = 0; i < size; i += segment_size_) {
    +
    305 segments_.emplace_back(this, segment_index++,
    +
    306 std::min(segment_size_, size - i), data_size_);
    +
    307 }
    +
    308
    +
    309 fence();
    +
    310 }
    +
    311
    +
    312 friend dv_segment_iterator<distributed_vector>;
    +
    313
    +
    314 std::size_t segment_size_ = 0;
    +
    315 std::size_t data_size_ = 0; // size + halo
    +
    316 T *data_ = nullptr;
    +
    317 span_halo<T> *halo_;
    +
    318
    +
    319 distribution distribution_;
    +
    320 std::size_t size_;
    +
    321 std::vector<dv_segment<distributed_vector>> segments_;
    +
    322 BackendT backend;
    +
    323};
    +
    324
    +
    325template <typename T, typename B>
    +
    326auto &halo(const distributed_vector<T, B> &dv) {
    +
    327 return dv.halo();
    +
    328}
    +
    329
    +
    330} // namespace dr::mp
    +
    Definition: distributed_vector.hpp:14
    +
    Definition: allocator.hpp:11
    +
    Definition: distributed_vector.hpp:146
    +
    distributed vector
    Definition: distributed_vector.hpp:138
    +
    auto size() const
    Returns size.
    Definition: distributed_vector.hpp:270
    +
    auto operator[](difference_type n) const
    Returns reference using index.
    Definition: distributed_vector.hpp:272
    +
    distributed_vector(std::size_t size, value_type fill_value, distribution dist=distribution())
    Constructor.
    Definition: distributed_vector.hpp:247
    +
    auto end() const
    Returns iterator to end.
    Definition: distributed_vector.hpp:267
    +
    auto begin() const
    Returns iterator to beginning.
    Definition: distributed_vector.hpp:265
    +
    distributed_vector(std::size_t size=0, distribution dist=distribution())
    Constructor.
    Definition: distributed_vector.hpp:242
    +
    Definition: communicator.hpp:230
    +
    Definition: distribution.hpp:11
    +
    + + + + diff --git a/doxygen/mp_2views_2enumerate_8hpp_source.html b/doxygen/mp_2views_2enumerate_8hpp_source.html new file mode 100644 index 0000000000..58141e3444 --- /dev/null +++ b/doxygen/mp_2views_2enumerate_8hpp_source.html @@ -0,0 +1,144 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views/enumerate.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    enumerate.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/mp/views/zip.hpp>
    +
    8
    +
    9namespace dr::mp {
    +
    10
    +
    11namespace views {
    +
    12
    +
    13namespace __detail {
    +
    14
    +
    15template <rng::range R> struct range_size {
    +
    16 using type = std::size_t;
    +
    17};
    +
    18
    +
    19template <rng::sized_range R> struct range_size<R> {
    +
    20 using type = rng::range_size_t<R>;
    +
    21};
    +
    22
    +
    23template <rng::range R> using range_size_t = typename range_size<R>::type;
    +
    24
    +
    25} // namespace __detail
    +
    26
    + +
    28public:
    +
    29 template <rng::viewable_range R>
    +
    30 requires(rng::sized_range<R>)
    +
    31 auto operator()(R &&r) const {
    +
    32 using W = std::uint32_t;
    +
    33 return mp::views::zip(mp::views::iota(W(0), W(rng::distance(r))),
    +
    34 std::forward<R>(r));
    +
    35 }
    +
    36
    +
    37 template <rng::viewable_range R>
    +
    38 friend auto operator|(R &&r, const enumerate_adapter_closure &closure) {
    +
    39 return closure(std::forward<R>(r));
    +
    40 }
    +
    41};
    +
    42
    + +
    44public:
    +
    45 template <rng::viewable_range R> constexpr auto operator()(R &&r) const {
    +
    46 return enumerate_adapter_closure{}(std::forward<R>(r));
    +
    47 }
    +
    48
    +
    49 inline auto enumerate() const { return enumerate_adapter_closure{}; }
    +
    50};
    +
    51
    +
    52inline constexpr auto enumerate = enumerate_fn_{};
    +
    53
    +
    54} // namespace views
    +
    55
    +
    56} // namespace dr::mp
    +
    Definition: enumerate.hpp:27
    +
    Definition: enumerate.hpp:43
    +
    Definition: enumerate.hpp:15
    +
    + + + + diff --git a/doxygen/mp_2views_2views_8hpp_source.html b/doxygen/mp_2views_2views_8hpp_source.html new file mode 100644 index 0000000000..83e11843e5 --- /dev/null +++ b/doxygen/mp_2views_2views_8hpp_source.html @@ -0,0 +1,173 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views/views.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    views.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/detail/ranges_shim.hpp>
    +
    8#include <dr/views/iota.hpp>
    +
    9#include <dr/views/transform.hpp>
    +
    10
    +
    11namespace dr::mp {
    +
    12
    +
    13// Select segments local to this rank and convert the iterators in the
    +
    14// segment to local
    +
    15template <typename R> auto local_segments(R &&dr) {
    +
    16 auto is_local = [](const auto &segment) {
    +
    17 return dr::ranges::rank(segment) == default_comm().rank();
    +
    18 };
    +
    19 // Convert from remote iter to local iter
    +
    20 auto local_iter = [](const auto &segment) {
    +
    21 auto b = dr::ranges::local(rng::begin(segment));
    +
    22 return rng::subrange(b, b + rng::distance(segment));
    +
    23 };
    +
    24 return dr::ranges::segments(std::forward<R>(dr)) |
    +
    25 rng::views::filter(is_local) | rng::views::transform(local_iter);
    +
    26}
    +
    27
    +
    28template <typename R> auto local_segments_with_idx(R &&dr) {
    +
    29 auto is_local = [](const auto &segment_with_idx) {
    +
    30 return dr::ranges::rank(std::get<1>(segment_with_idx)) ==
    +
    31 default_comm().rank();
    +
    32 };
    +
    33 // Convert from remote iter to local iter
    +
    34 auto local_iter = [](const auto &segment_with_idx) {
    +
    35 auto &&[idx, segment] = segment_with_idx;
    +
    36 auto b = dr::ranges::local(rng::begin(segment));
    +
    37 return std::tuple(idx, rng::subrange(b, b + rng::distance(segment)));
    +
    38 };
    +
    39 return dr::ranges::segments(std::forward<R>(dr)) | rng::views::enumerate |
    +
    40 rng::views::filter(is_local) | rng::views::transform(local_iter);
    +
    41}
    +
    42
    +
    43template <dr::distributed_contiguous_range R> auto local_segment(R &&r) {
    +
    44 auto segments = dr::mp::local_segments(std::forward<R>(r));
    +
    45
    +
    46 if (rng::empty(segments)) {
    +
    47 return rng::range_value_t<decltype(segments)>{};
    +
    48 }
    +
    49
    +
    50 // Should be error, not assert. Or we could join all the segments
    +
    51 assert(rng::distance(segments) == 1);
    +
    52 return *rng::begin(segments);
    +
    53}
    +
    54
    +
    55template <typename R> auto local_mdspans(R &&dr) {
    +
    56 return dr::ranges::segments(std::forward<R>(dr))
    +
    57 // Select the local segments
    +
    58 | rng::views::filter([](auto s) {
    +
    59 return dr::ranges::rank(s) == default_comm().rank();
    +
    60 })
    +
    61 // Extract the mdspan
    +
    62 | rng::views::transform([](auto s) { return s.mdspan(); });
    +
    63}
    +
    64
    +
    65template <dr::distributed_contiguous_range R> auto local_mdspan(R &&r) {
    +
    66 auto mdspans = dr::mp::local_mdspans(std::forward<R>(r));
    +
    67
    +
    68 if (rng::empty(mdspans)) {
    +
    69 return rng::range_value_t<decltype(mdspans)>{};
    +
    70 }
    +
    71
    +
    72 // Should be error, not assert. Or we could join all the segments
    +
    73 assert(rng::distance(mdspans) == 1);
    +
    74 return *rng::begin(mdspans);
    +
    75}
    +
    76
    +
    77} // namespace dr::mp
    +
    78
    +
    79namespace dr::mp::views {
    +
    80
    +
    81inline constexpr auto all = rng::views::all;
    +
    82inline constexpr auto counted = rng::views::counted;
    +
    83inline constexpr auto drop = rng::views::drop;
    +
    84inline constexpr auto iota = dr::views::iota;
    +
    85inline constexpr auto take = rng::views::take;
    +
    86inline constexpr auto transform = dr::views::transform;
    +
    87
    +
    88} // namespace dr::mp::views
    +
    + + + + diff --git a/doxygen/mp_8hpp_source.html b/doxygen/mp_8hpp_source.html new file mode 100644 index 0000000000..dc5f125b8e --- /dev/null +++ b/doxygen/mp_8hpp_source.html @@ -0,0 +1,166 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    mp.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#ifdef SYCL_LANGUAGE_VERSION
    +
    8#include <oneapi/dpl/algorithm>
    +
    9#include <oneapi/dpl/execution>
    +
    10#include <oneapi/dpl/numeric>
    +
    11#endif
    +
    12
    +
    13#ifdef DRISHMEM
    +
    14#include <ishmem.h>
    +
    15#endif
    +
    16
    +
    17#include <cassert>
    +
    18#include <concepts>
    +
    19#include <execution>
    +
    20#include <fstream>
    +
    21#include <iostream>
    +
    22#include <iterator>
    +
    23#include <memory>
    +
    24#include <optional>
    +
    25#include <set>
    +
    26#include <span>
    +
    27#include <string>
    +
    28#include <utility>
    +
    29#include <vector>
    +
    30
    +
    31#include <vendor/source_location/source_location.hpp>
    +
    32
    +
    33// MPI should be optional
    +
    34#include <mkl.h>
    +
    35#include <mpi.h>
    +
    36
    +
    37#include <dr/detail/format_shim.hpp>
    +
    38#include <dr/detail/ranges_shim.hpp>
    +
    39
    +
    40// clang-format off
    +
    41#include <dr/concepts/concepts.hpp>
    +
    42
    +
    43#include <dr/detail/logger.hpp>
    +
    44#include <dr/detail/view_detectors.hpp>
    +
    45#include <dr/detail/segments_tools.hpp>
    +
    46#include <dr/detail/iterator_adaptor.hpp>
    +
    47#include <dr/detail/normal_distributed_iterator.hpp>
    +
    48#include <dr/detail/memory.hpp>
    +
    49#include <dr/detail/communicator.hpp>
    +
    50#include <dr/detail/index.hpp>
    +
    51
    +
    52#include <dr/views/views.hpp>
    +
    53#include <dr/views/transform.hpp>
    +
    54
    +
    55#include <dr/mp/halo.hpp>
    +
    56#include <dr/mp/global.hpp>
    +
    57#include <dr/mp/sycl_support.hpp>
    +
    58#include <dr/mp/common_support.hpp>
    +
    59#include <dr/mp/alignment.hpp>
    +
    60#include <dr/mp/allocator.hpp>
    +
    61#include <dr/mp/views/views.hpp>
    +
    62#include <dr/mp/views/zip.hpp>
    +
    63#include <dr/mp/views/enumerate.hpp>
    +
    64#include <dr/mp/views/sliding.hpp>
    +
    65#include <dr/mp/views/mdspan_view.hpp>
    +
    66#include <dr/mp/views/submdspan_view.hpp>
    +
    67#include <dr/mp/algorithms/copy.hpp>
    +
    68#include <dr/mp/algorithms/count.hpp>
    +
    69#include <dr/mp/algorithms/equal.hpp>
    +
    70#include <dr/mp/algorithms/fill.hpp>
    +
    71#include <dr/mp/algorithms/for_each.hpp>
    +
    72#include <dr/mp/algorithms/exclusive_scan.hpp>
    +
    73#include <dr/mp/algorithms/inclusive_scan.hpp>
    +
    74#include <dr/mp/algorithms/iota.hpp>
    +
    75#include <dr/mp/algorithms/reduce.hpp>
    +
    76#include <dr/mp/algorithms/sort.hpp>
    +
    77#include <dr/mp/algorithms/md_for_each.hpp>
    +
    78#include <dr/mp/algorithms/transform.hpp>
    +
    79#include <dr/mp/algorithms/transpose.hpp>
    +
    80#include <dr/mp/containers/distributed_vector.hpp>
    +
    81#include <dr/mp/containers/distributed_mdarray.hpp>
    +
    + + + + diff --git a/doxygen/nav_f.png b/doxygen/nav_f.png new file mode 100644 index 0000000000..72a58a529e Binary files /dev/null and b/doxygen/nav_f.png differ diff --git a/doxygen/nav_fd.png b/doxygen/nav_fd.png new file mode 100644 index 0000000000..032fbdd4c5 Binary files /dev/null and b/doxygen/nav_fd.png differ diff --git a/doxygen/nav_g.png b/doxygen/nav_g.png new file mode 100644 index 0000000000..2093a237a9 Binary files /dev/null and b/doxygen/nav_g.png differ diff --git a/doxygen/nav_h.png b/doxygen/nav_h.png new file mode 100644 index 0000000000..33389b101d Binary files /dev/null and b/doxygen/nav_h.png differ diff --git a/doxygen/nav_hd.png b/doxygen/nav_hd.png new file mode 100644 index 0000000000..de80f18ad6 Binary files /dev/null and b/doxygen/nav_hd.png differ diff --git a/doxygen/normal__distributed__iterator_8hpp_source.html b/doxygen/normal__distributed__iterator_8hpp_source.html new file mode 100644 index 0000000000..4d76ba4774 --- /dev/null +++ b/doxygen/normal__distributed__iterator_8hpp_source.html @@ -0,0 +1,210 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/normal_distributed_iterator.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    normal_distributed_iterator.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4#pragma once
    +
    5
    +
    6#include <dr/detail/segments_tools.hpp>
    +
    7
    +
    8namespace dr {
    +
    9
    +
    10template <rng::viewable_range V>
    +
    11/*
    +
    12requires(dr::remote_range<rng::range_reference_t<V>> &&
    +
    13 rng::random_access_range<rng::range_reference_t<V>>)
    +
    14 */
    + +
    16public:
    +
    17 using value_type = rng::range_value_t<rng::range_reference_t<V>>;
    +
    18
    +
    19 using segment_type = rng::range_value_t<V>;
    +
    20
    +
    21 using size_type = rng::range_size_t<segment_type>;
    +
    22 using difference_type = rng::range_difference_t<segment_type>;
    +
    23
    +
    24 using reference = rng::range_reference_t<segment_type>;
    +
    25
    +
    26 using iterator_category = std::random_access_iterator_tag;
    +
    27
    + + + +
    31
    +
    32 constexpr normal_distributed_iterator_accessor() noexcept = default;
    +
    33 constexpr ~normal_distributed_iterator_accessor() noexcept = default;
    + +
    35 const normal_distributed_iterator_accessor &) noexcept = default;
    + +
    37 operator=(const normal_distributed_iterator_accessor &) noexcept = default;
    +
    38
    +
    39 constexpr normal_distributed_iterator_accessor(V segments,
    +
    40 size_type segment_id,
    +
    41 size_type idx) noexcept
    +
    42 : segments_(segments), segment_id_(segment_id), idx_(idx) {}
    +
    43
    + +
    45 operator+=(difference_type offset) noexcept {
    +
    46
    +
    47 while (offset > 0) {
    +
    48 difference_type current_offset =
    +
    49 std::min(offset, difference_type(segments_[segment_id_].size()) -
    +
    50 difference_type(idx_));
    +
    51 idx_ += current_offset;
    +
    52 offset -= current_offset;
    +
    53
    +
    54 if (idx_ >= segments_[segment_id_].size()) {
    +
    55 segment_id_++;
    +
    56 idx_ = 0;
    +
    57 }
    +
    58 }
    +
    59
    +
    60 while (offset < 0) {
    +
    61 difference_type current_offset =
    +
    62 std::min(-offset, difference_type(idx_) + 1);
    +
    63
    +
    64 difference_type new_idx = difference_type(idx_) - current_offset;
    +
    65 offset += current_offset;
    +
    66
    +
    67 if (new_idx < 0) {
    +
    68 segment_id_--;
    +
    69 new_idx = segments_[segment_id_].size() - 1;
    +
    70 }
    +
    71
    +
    72 idx_ = new_idx;
    +
    73 }
    +
    74
    +
    75 return *this;
    +
    76 }
    +
    77
    +
    78 constexpr bool operator==(const iterator_accessor &other) const noexcept {
    +
    79 return segment_id_ == other.segment_id_ && idx_ == other.idx_;
    +
    80 }
    +
    81
    +
    82 constexpr difference_type
    +
    83 operator-(const iterator_accessor &other) const noexcept {
    +
    84 return difference_type(get_global_idx()) - other.get_global_idx();
    +
    85 }
    +
    86
    +
    87 constexpr bool operator<(const iterator_accessor &other) const noexcept {
    +
    88 if (segment_id_ < other.segment_id_) {
    +
    89 return true;
    +
    90 } else if (segment_id_ == other.segment_id_) {
    +
    91 return idx_ < other.idx_;
    +
    92 } else {
    +
    93 return false;
    +
    94 }
    +
    95 }
    +
    96
    +
    97 constexpr reference operator*() const noexcept {
    +
    98 return segments_[segment_id_][idx_];
    +
    99 }
    +
    100
    +
    101 auto segments() const noexcept {
    +
    102 return dr::__detail::drop_segments(segments_, segment_id_, idx_);
    +
    103 }
    +
    104
    +
    105private:
    +
    106 size_type get_global_idx() const noexcept {
    +
    107 size_type cumulative_size = 0;
    +
    108 for (std::size_t i = 0; i < segment_id_; i++) {
    +
    109 cumulative_size += segments_[i].size();
    +
    110 }
    +
    111 return cumulative_size + idx_;
    +
    112 }
    +
    113
    +
    114 rng::views::all_t<V> segments_;
    +
    115 size_type segment_id_ = 0;
    +
    116 size_type idx_ = 0;
    +
    117};
    +
    118
    +
    119template <rng::viewable_range T>
    + + +
    122
    +
    123} // namespace dr
    +
    Definition: iterator_adaptor.hpp:23
    +
    Definition: normal_distributed_iterator.hpp:15
    +
    + + + + diff --git a/doxygen/onedpl__direct__iterator_8hpp_source.html b/doxygen/onedpl__direct__iterator_8hpp_source.html new file mode 100644 index 0000000000..d8e41ecd94 --- /dev/null +++ b/doxygen/onedpl__direct__iterator_8hpp_source.html @@ -0,0 +1,197 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/onedpl_direct_iterator.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    onedpl_direct_iterator.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <iterator>
    +
    8
    +
    9#include <dr/detail/iterator_adaptor.hpp>
    +
    10
    +
    11namespace dr {
    +
    12
    +
    13namespace __detail {
    +
    14
    +
    15template <std::random_access_iterator Iter> class direct_iterator {
    +
    16public:
    +
    17 using value_type = std::iter_value_t<Iter>;
    +
    18 using difference_type = std::iter_difference_t<Iter>;
    +
    19 using reference = std::iter_reference_t<Iter>;
    + +
    21
    +
    22 using pointer = iterator;
    +
    23
    +
    24 using iterator_category = std::random_access_iterator_tag;
    +
    25
    +
    26 using is_passed_directly = ::std::true_type;
    +
    27
    +
    28 direct_iterator(Iter iter) noexcept : iter_(iter) {}
    +
    29 direct_iterator() noexcept = default;
    +
    30 ~direct_iterator() noexcept = default;
    +
    31 direct_iterator(const direct_iterator &) noexcept = default;
    +
    32 direct_iterator &operator=(const direct_iterator &) noexcept = default;
    +
    33
    +
    34 bool operator==(const direct_iterator &) const noexcept = default;
    +
    35 bool operator!=(const direct_iterator &) const noexcept = default;
    +
    36
    +
    37 iterator operator+(difference_type offset) const noexcept {
    +
    38 return iterator(iter_ + offset);
    +
    39 }
    +
    40
    +
    41 iterator operator-(difference_type offset) const noexcept {
    +
    42 return iterator(iter_ - offset);
    +
    43 }
    +
    44
    +
    45 difference_type operator-(iterator other) const noexcept {
    +
    46 return iter_ - other.iter_;
    +
    47 }
    +
    48
    +
    49 bool operator<(iterator other) const noexcept { return iter_ < other.iter_; }
    +
    50
    +
    51 bool operator>(iterator other) const noexcept { return iter_ > iter_; }
    +
    52
    +
    53 bool operator<=(iterator other) const noexcept {
    +
    54 return iter_ <= other.iter_;
    +
    55 }
    +
    56
    +
    57 bool operator>=(iterator other) const noexcept {
    +
    58 return iter_ >= other.iter_;
    +
    59 }
    +
    60
    +
    61 iterator &operator++() noexcept {
    +
    62 ++iter_;
    +
    63 return *this;
    +
    64 }
    +
    65
    +
    66 iterator operator++(int) noexcept {
    +
    67 iterator other = *this;
    +
    68 ++(*this);
    +
    69 return other;
    +
    70 }
    +
    71
    +
    72 iterator &operator--() noexcept {
    +
    73 --iter_;
    +
    74 return *this;
    +
    75 }
    +
    76
    +
    77 iterator operator--(int) noexcept {
    +
    78 iterator other = *this;
    +
    79 --(*this);
    +
    80 return other;
    +
    81 }
    +
    82
    +
    83 iterator &operator+=(difference_type offset) noexcept {
    +
    84 iter_ += offset;
    +
    85 return *this;
    +
    86 }
    +
    87
    +
    88 iterator &operator-=(difference_type offset) noexcept {
    +
    89 iter_ -= offset;
    +
    90 return *this;
    +
    91 }
    +
    92
    +
    93 reference operator*() const noexcept { return *iter_; }
    +
    94
    +
    95 reference operator[](difference_type offset) const noexcept {
    +
    96 return reference(*(*this + offset));
    +
    97 }
    +
    98
    +
    99 friend iterator operator+(difference_type n, iterator iter) {
    +
    100 return iter.iter_ + n;
    +
    101 }
    +
    102
    +
    103 Iter base() const noexcept { return iter_; }
    +
    104
    +
    105private:
    +
    106 Iter iter_;
    +
    107};
    +
    108
    +
    109} // namespace __detail
    +
    110
    +
    111} // namespace dr
    +
    Definition: onedpl_direct_iterator.hpp:15
    +
    + + + + diff --git a/doxygen/open.png b/doxygen/open.png new file mode 100644 index 0000000000..30f75c7efe Binary files /dev/null and b/doxygen/open.png differ diff --git a/doxygen/owning__view_8hpp_source.html b/doxygen/owning__view_8hpp_source.html new file mode 100644 index 0000000000..c0bee3e3ef --- /dev/null +++ b/doxygen/owning__view_8hpp_source.html @@ -0,0 +1,155 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/owning_view.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    owning_view.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/detail/ranges_shim.hpp>
    +
    8
    +
    9namespace dr {
    +
    10
    +
    11namespace __detail {
    +
    12
    +
    13// TODO: this `owning_view` is needed because range-v3 does not have an
    +
    14// `owning_view`. Ideally we would submit a PR to range-v3 /or
    +
    15// switch to solely using libstdc++13.
    +
    16
    +
    17template <rng::range R>
    +
    18class owning_view : public rng::view_interface<owning_view<R>> {
    +
    19public:
    +
    20 owning_view(R &&range) : range_(std::move(range)) {}
    +
    21
    + +
    23 requires std::default_initializable<R>
    +
    24 = default;
    +
    25 owning_view(owning_view &&other) = default;
    +
    26 owning_view(const owning_view &other) = default;
    +
    27
    +
    28 owning_view &operator=(owning_view &&other) = default;
    +
    29 owning_view &operator=(const owning_view &other) = default;
    +
    30
    +
    31 auto size() const
    +
    32 requires(rng::sized_range<R>)
    +
    33 {
    +
    34 return rng::size(range_);
    +
    35 }
    +
    36
    +
    37 auto empty() const
    +
    38 requires(rng::sized_range<R>)
    +
    39 {
    +
    40 return size() == 0;
    +
    41 }
    +
    42
    +
    43 auto begin() { return rng::begin(range_); }
    +
    44
    +
    45 auto begin() const
    +
    46 requires(rng::range<const R>)
    +
    47 {
    +
    48 return rng::begin(range_);
    +
    49 }
    +
    50
    +
    51 auto end() { return rng::end(range_); }
    +
    52
    +
    53 auto end() const
    +
    54 requires(rng::range<const R>)
    +
    55 {
    +
    56 return rng::end(range_);
    +
    57 }
    +
    58
    +
    59 decltype(auto) base() { return range_; }
    +
    60
    +
    61 decltype(auto) base() const { return range_; }
    +
    62
    +
    63private:
    +
    64 R range_;
    +
    65};
    +
    66
    +
    67} // namespace __detail
    +
    68
    +
    69} // namespace dr
    +
    Definition: owning_view.hpp:18
    +
    + + + + diff --git a/doxygen/range_8hpp_source.html b/doxygen/range_8hpp_source.html new file mode 100644 index 0000000000..9eaaeefb4f --- /dev/null +++ b/doxygen/range_8hpp_source.html @@ -0,0 +1,241 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/range.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    range.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/concepts/concepts.hpp>
    +
    8#include <dr/sp/distributed_span.hpp>
    +
    9
    +
    10namespace dr::sp {
    +
    11
    +
    12template <int dimensions = 1> class id {
    +
    13public:
    +
    14 static_assert(dimensions == 1);
    +
    15
    +
    16 id() noexcept = default;
    +
    17
    +
    18 id(std::size_t segment_id, std::size_t local_id, std::size_t global_id)
    +
    19 : segment_id_(segment_id), local_id_(local_id), global_id_(global_id) {}
    +
    20
    +
    21 std::size_t get(int dimension) const { return global_id_; }
    +
    22
    +
    23 operator std::size_t() const { return global_id_; }
    +
    24
    +
    25 std::size_t segment() const { return segment_id_; }
    +
    26
    +
    27 std::size_t local_id() const { return local_id_; }
    +
    28
    +
    29private:
    +
    30 std::size_t segment_id_ = 0;
    +
    31 std::size_t local_id_ = 0;
    +
    32 std::size_t global_id_ = 0;
    +
    33};
    +
    34
    + +
    36public:
    +
    37 using element_type = id<1>;
    + +
    39
    +
    40 using size_type = std::size_t;
    +
    41 using difference_type = std::ptrdiff_t;
    +
    42
    +
    43 // using pointer = typename segment_type::pointer;
    +
    44 using reference = value_type;
    +
    45
    +
    46 using iterator_category = std::random_access_iterator_tag;
    +
    47
    + + + +
    51
    +
    52 constexpr segment_range_accessor() noexcept = default;
    +
    53 constexpr ~segment_range_accessor() noexcept = default;
    +
    54 constexpr segment_range_accessor(const segment_range_accessor &) noexcept =
    +
    55 default;
    +
    56 constexpr segment_range_accessor &
    +
    57 operator=(const segment_range_accessor &) noexcept = default;
    +
    58
    +
    59 constexpr segment_range_accessor(size_type segment_id, size_type idx,
    +
    60 size_type global_offset) noexcept
    +
    61 : global_offset_(global_offset), segment_id_(segment_id), idx_(idx) {}
    +
    62
    +
    63 constexpr segment_range_accessor &
    +
    64 operator+=(difference_type offset) noexcept {
    +
    65 idx_ += offset;
    +
    66 return *this;
    +
    67 }
    +
    68
    +
    69 constexpr bool operator==(const iterator_accessor &other) const noexcept {
    +
    70 return segment_id_ == other.segment_id_ && idx_ == other.idx_;
    +
    71 }
    +
    72
    +
    73 constexpr difference_type
    +
    74 operator-(const iterator_accessor &other) const noexcept {
    +
    75 return difference_type(idx_) - difference_type(other.idx_);
    +
    76 }
    +
    77
    +
    78 // Comparing iterators from different segments is undefined
    +
    79 constexpr bool operator<(const iterator_accessor &other) const noexcept {
    +
    80 return idx_ < other.idx_;
    +
    81 }
    +
    82
    +
    83 reference operator*() const noexcept {
    +
    84 return value_type(segment_id_, idx_, get_global_idx());
    +
    85 }
    +
    86
    +
    87private:
    +
    88 size_type get_global_idx() const noexcept { return global_offset_ + idx_; }
    +
    89
    +
    90 size_type global_offset_ = 0;
    +
    91 size_type segment_id_ = 0;
    +
    92 size_type idx_ = 0;
    +
    93};
    +
    94
    + +
    96
    +
    97template <int dimensions = 1> class segment_range {
    +
    98public:
    +
    99 static_assert(dimensions == 1);
    +
    100
    + +
    102 using size_type = std::size_t;
    +
    103 using different_type = std::ptrdiff_t;
    +
    104
    +
    105 using reference = value_type;
    +
    106
    + +
    108
    +
    109 segment_range(std::size_t segment_id, std::size_t segment_size,
    +
    110 std::size_t global_offset)
    +
    111 : segment_id_(segment_id), segment_size_(segment_size),
    +
    112 global_offset_(global_offset) {}
    +
    113
    +
    114 iterator begin() const { return iterator(segment_id_, 0, global_offset_); }
    +
    115
    +
    116 iterator end() const {
    +
    117 return iterator(segment_id_, segment_size_, global_offset_);
    +
    118 }
    +
    119
    +
    120 size_type size() const noexcept { return segment_size_; }
    +
    121
    +
    122 value_type operator[](std::size_t idx) { return *(begin() + idx); }
    +
    123
    +
    124 size_type rank() const noexcept { return 0; }
    +
    125
    +
    126private:
    +
    127 std::size_t segment_size_;
    +
    128 std::size_t segment_id_;
    +
    129 std::size_t global_offset_;
    +
    130};
    +
    131
    +
    132/*
    +
    133template <rng::forward_range R> auto distributed_iota_view(R &&r) {
    +
    134 static_assert(dr::distributed_contiguous_range<R>);
    +
    135 if constexpr (dr::distributed_contiguous_range<R>) {
    +
    136 std::vector<segment_range<>> iota_segments;
    +
    137 std::size_t global_offset = 0;
    +
    138 std::size_t segment_id = 0;
    +
    139 for (auto &&segment : r.segments()) {
    +
    140 iota_segments.push_back(
    +
    141 segment_range(segment_id, segment.size(), global_offset));
    +
    142 global_offset += segment.size();
    +
    143 segment_id++;
    +
    144 }
    +
    145 return dr::sp::distributed_span(iota_segments);
    +
    146 } else {
    +
    147 return segment_range(0, rng::size(r), 0);
    +
    148 }
    +
    149}
    +
    150*/
    +
    151
    +
    152} // namespace dr::sp
    +
    Definition: iterator_adaptor.hpp:23
    +
    Definition: range.hpp:12
    +
    Definition: range.hpp:35
    +
    Definition: range.hpp:97
    +
    + + + + diff --git a/doxygen/range__adaptors_8hpp_source.html b/doxygen/range__adaptors_8hpp_source.html new file mode 100644 index 0000000000..3a1cfe67f7 --- /dev/null +++ b/doxygen/range__adaptors_8hpp_source.html @@ -0,0 +1,103 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/range_adaptors.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    range_adaptors.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/sp/views/standard_views.hpp>
    +
    8#include <dr/sp/zip_view.hpp>
    +
    9
    +
    10namespace dr::sp {
    +
    11
    +
    12template <rng::range R> auto enumerate(R &&r) {
    +
    13 auto i = rng::views::iota(uint32_t(0), uint32_t(rng::size(r)));
    +
    14 return dr::sp::zip_view(i, r);
    +
    15}
    +
    16
    +
    17} // namespace dr::sp
    +
    zip
    Definition: zip_view.hpp:108
    +
    + + + + diff --git a/doxygen/ranges_8hpp_source.html b/doxygen/ranges_8hpp_source.html new file mode 100644 index 0000000000..823e2efc84 --- /dev/null +++ b/doxygen/ranges_8hpp_source.html @@ -0,0 +1,360 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/ranges.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    ranges.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <any>
    +
    8#include <iterator>
    +
    9#include <type_traits>
    +
    10
    +
    11#include <dr/detail/ranges_shim.hpp>
    +
    12
    +
    13namespace dr {
    +
    14
    +
    15namespace ranges {
    +
    16
    +
    17template <typename> inline constexpr bool disable_rank = false;
    +
    18
    +
    19namespace {
    +
    20
    +
    21template <typename T>
    +
    22concept has_rank_method = requires(T t) {
    +
    23 { t.rank() } -> std::weakly_incrementable;
    +
    24};
    +
    25
    +
    26template <typename R>
    +
    27concept has_rank_adl = requires(R &r) {
    +
    28 { rank_(r) } -> std::weakly_incrementable;
    +
    29};
    +
    30
    +
    31template <typename Iter>
    + +
    33 std::forward_iterator<Iter> && has_rank_method<Iter> &&
    +
    34 !disable_rank<std::remove_cv_t<Iter>>;
    +
    35
    +
    36} // namespace
    +
    37
    +
    38namespace {
    +
    39
    +
    40struct rank_fn_ {
    +
    41
    +
    42 // Return the rank associated with a remote range.
    +
    43 // This is either:
    +
    44 // 1) r.rank(), if the remote range has a `rank()` method
    +
    45 // OR, if not available,
    +
    46 // 2) r.begin().rank(), if iterator is `remote_iterator`
    +
    47 template <rng::forward_range R>
    +
    48 requires((has_rank_method<R> && !disable_rank<std::remove_cv_t<R>>) ||
    +
    49 (has_rank_adl<R> && !disable_rank<std::remove_cv_t<R>>) ||
    + +
    51 constexpr auto operator()(R &&r) const {
    +
    52 if constexpr (has_rank_method<R> && !disable_rank<std::remove_cv_t<R>>) {
    +
    53 return std::forward<R>(r).rank();
    + +
    55 // rng::begin needs an lvalue or borrowed_range. We only need
    +
    56 // the rank from the rng::begin so creating a local lvalue is ok.
    +
    57 auto t = r;
    +
    58 return operator()(rng::begin(t));
    +
    59 } else if constexpr (has_rank_adl<R> &&
    +
    60 !disable_rank<std::remove_cv_t<R>>) {
    +
    61 return rank_(std::forward<R>(r));
    +
    62 }
    +
    63 }
    +
    64
    +
    65 template <std::forward_iterator Iter>
    +
    66 requires(has_rank_method<Iter> && !disable_rank<std::remove_cv_t<Iter>>)
    +
    67 auto operator()(Iter iter) const {
    +
    68 if constexpr (has_rank_method<Iter> &&
    +
    69 !disable_rank<std::remove_cv_t<Iter>>) {
    +
    70 return std::forward<Iter>(iter).rank();
    +
    71 }
    +
    72 }
    +
    73};
    +
    74
    +
    75} // namespace
    +
    76
    +
    77inline constexpr auto rank = rank_fn_{};
    +
    78
    +
    79namespace {
    +
    80
    +
    81template <typename R>
    + +
    83 rng::forward_range<R> && requires(R &r) { dr::ranges::rank(r); };
    +
    84
    +
    85template <typename R>
    + + +
    88
    +
    89template <typename R>
    +
    90concept has_segments_method = requires(R r) {
    +
    91 { r.segments() } -> segments_range;
    +
    92};
    +
    93
    +
    94template <typename R>
    +
    95concept has_segments_adl = requires(R &r) {
    +
    96 { segments_(r) } -> segments_range;
    +
    97};
    +
    98
    +
    99struct segments_fn_ {
    +
    100 template <rng::forward_range R>
    + +
    102 constexpr decltype(auto) operator()(R &&r) const {
    +
    103 if constexpr (has_segments_method<R>) {
    +
    104 return std::forward<R>(r).segments();
    +
    105 } else if constexpr (has_segments_adl<R>) {
    +
    106 return segments_(std::forward<R>(r));
    +
    107 }
    +
    108 }
    +
    109
    +
    110 template <std::forward_iterator I>
    +
    111 requires(has_segments_method<I> || has_segments_adl<I>)
    +
    112 constexpr decltype(auto) operator()(I iter) const {
    +
    113 if constexpr (has_segments_method<I>) {
    +
    114 return std::forward<I>(iter).segments();
    +
    115 } else if constexpr (has_segments_adl<I>) {
    +
    116 return segments_(std::forward<I>(iter));
    +
    117 }
    +
    118 }
    +
    119};
    +
    120
    +
    121} // namespace
    +
    122
    +
    123inline constexpr auto segments = segments_fn_{};
    +
    124
    +
    125namespace {
    +
    126
    +
    127template <typename Iter>
    +
    128concept has_local_adl = requires(Iter &iter) {
    +
    129 { local_(iter) } -> std::forward_iterator;
    +
    130};
    +
    131
    +
    132template <typename Iter>
    + +
    134 std::forward_iterator<Iter> && requires(Iter iter) {
    +
    135 { iter.local() } -> std::forward_iterator;
    +
    136 };
    +
    137
    +
    138template <typename T> struct is_localizable_helper : std::false_type {};
    +
    139
    +
    140template <has_local_adl T> struct is_localizable_helper<T> : std::true_type {};
    +
    141
    +
    142template <iter_has_local_method T>
    +
    143struct is_localizable_helper<T> : std::true_type {};
    +
    144
    +
    145template <rng::forward_iterator Iter>
    +
    146 requires(not iter_has_local_method<Iter> && not has_local_adl<Iter>) &&
    +
    147 requires() { std::iter_value_t<Iter>(); }
    +
    148struct is_localizable_helper<Iter>
    +
    149 : is_localizable_helper<std::iter_value_t<Iter>> {};
    +
    150
    +
    151template <rng::forward_range R>
    +
    152struct is_localizable_helper<R> : is_localizable_helper<rng::iterator_t<R>> {};
    +
    153
    +
    154template <typename T>
    +
    155concept is_localizable = is_localizable_helper<T>::value;
    +
    156
    +
    157template <typename Segment>
    + +
    159 rng::forward_range<Segment> && requires(Segment segment) {
    +
    160 { segment.local() } -> rng::forward_range;
    +
    161 };
    +
    162
    +
    163struct local_fn_ {
    +
    164
    +
    165 // based on https://ericniebler.github.io/range-v3/#autotoc_md30 "Create
    +
    166 // custom iterators"
    +
    167 // TODO: rewrite using iterator_interface from
    +
    168 // https://github.com/boostorg/stl_interfaces
    +
    169 template <typename Iter>
    +
    170 requires rng::forward_range<typename Iter::value_type>
    +
    171 struct cursor_over_local_ranges {
    +
    172 Iter iter;
    +
    173 auto make_begin_for_counted() const {
    +
    174 if constexpr (iter_has_local_method<
    +
    175 rng::iterator_t<typename Iter::value_type>>)
    +
    176 return rng::begin(*iter).local();
    +
    177 else
    +
    178 return rng::basic_iterator<cursor_over_local_ranges<
    +
    179 rng::iterator_t<typename Iter::value_type>>>(rng::begin(*iter));
    +
    180 }
    +
    181 auto read() const {
    +
    182 return rng::views::counted(make_begin_for_counted(), rng::size(*iter));
    +
    183 }
    +
    184 bool equal(const cursor_over_local_ranges &other) const {
    +
    185 return iter == other.iter;
    +
    186 }
    +
    187 void next() { ++iter; }
    +
    188 void prev() { --iter; }
    +
    189 void advance(std::ptrdiff_t n) { this->iter += n; }
    +
    190 std::ptrdiff_t distance_to(const cursor_over_local_ranges &other) const {
    +
    191 return other.iter - this->iter;
    +
    192 }
    +
    193 cursor_over_local_ranges() = default;
    +
    194 cursor_over_local_ranges(Iter iter) : iter(iter) {}
    +
    195 };
    +
    196
    +
    197 template <std::forward_iterator Iter>
    +
    198 requires(has_local_adl<Iter> || iter_has_local_method<Iter> ||
    +
    199 std::contiguous_iterator<Iter> || is_localizable<Iter>)
    +
    200 auto operator()(Iter iter) const {
    +
    201 if constexpr (iter_has_local_method<Iter>) {
    +
    202 return iter.local();
    +
    203 } else if constexpr (has_local_adl<Iter>) {
    +
    204 return local_(iter);
    +
    205 } else if constexpr (is_localizable<Iter>) {
    +
    206 return rng::basic_iterator<cursor_over_local_ranges<Iter>>(iter);
    +
    207 } else if constexpr (std::contiguous_iterator<Iter>) {
    +
    208 return iter;
    +
    209 }
    +
    210 }
    +
    211
    +
    212 template <rng::forward_range R>
    +
    213 requires(has_local_adl<R> || iter_has_local_method<rng::iterator_t<R>> ||
    +
    214 segment_has_local_method<R> ||
    +
    215 std::contiguous_iterator<rng::iterator_t<R>> ||
    +
    216 is_localizable<R> || rng::contiguous_range<R>)
    +
    217 auto operator()(R &&r) const {
    +
    218 if constexpr (segment_has_local_method<R>) {
    +
    219 return r.local();
    +
    220 } else if constexpr (iter_has_local_method<rng::iterator_t<R>>) {
    +
    221 return rng::views::counted(rng::begin(r).local(), rng::size(r));
    +
    222 } else if constexpr (has_local_adl<R>) {
    +
    223 return local_(std::forward<R>(r));
    +
    224 } else if constexpr (is_localizable<R>) {
    +
    225 return rng::views::counted(
    +
    226 rng::basic_iterator<cursor_over_local_ranges<rng::iterator_t<R>>>(
    +
    227 rng::begin(r)),
    +
    228 rng::size(r));
    +
    229 } else if constexpr (std::contiguous_iterator<rng::iterator_t<R>>) {
    +
    230 return std::span(rng::begin(r), rng::size(r));
    +
    231 }
    +
    232 }
    +
    233};
    +
    234
    +
    235} // namespace
    +
    236
    +
    237inline constexpr auto local = local_fn_{};
    +
    238
    +
    239namespace __detail {
    +
    240
    +
    241template <typename T>
    +
    242concept has_local = requires(T &t) {
    +
    243 { dr::ranges::local(t) } -> std::convertible_to<std::any>;
    +
    244};
    +
    245
    +
    246struct local_fn_ {
    +
    247 template <typename T>
    +
    248 requires(has_local<T>)
    +
    249 auto operator()(T &&t) const {
    +
    250 return dr::ranges::local(t);
    +
    251 }
    +
    252
    +
    253 template <typename T> decltype(auto) operator()(T &&t) const { return t; }
    +
    254};
    +
    255
    +
    256inline constexpr auto local = local_fn_{};
    +
    257
    +
    258} // namespace __detail
    +
    259
    +
    260} // namespace ranges
    +
    261
    +
    262} // namespace dr
    +
    Definition: ranges.hpp:128
    +
    Definition: ranges.hpp:27
    +
    Definition: ranges.hpp:22
    +
    Definition: ranges.hpp:95
    +
    Definition: ranges.hpp:90
    +
    Definition: ranges.hpp:155
    + +
    Definition: ranges.hpp:133
    + + +
    Definition: ranges.hpp:86
    +
    Definition: ranges.hpp:242
    +
    Definition: ranges.hpp:246
    +
    + + + + diff --git a/doxygen/ranges__shim_8hpp_source.html b/doxygen/ranges__shim_8hpp_source.html new file mode 100644 index 0000000000..2d2884eec5 --- /dev/null +++ b/doxygen/ranges__shim_8hpp_source.html @@ -0,0 +1,112 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/ranges_shim.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    ranges_shim.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7// TODO: use libstdc++ 13.0 or greater if available.
    +
    8
    +
    9// #define DR_USE_STD_RANGES
    +
    10
    +
    11#ifdef DR_USE_STD_RANGES
    +
    12
    +
    13#include <ranges>
    +
    14
    +
    15namespace rng = ::std::ranges;
    +
    16
    +
    17#define DR_RANGES_NAMESPACE std::ranges
    +
    18
    +
    19#else
    +
    20
    +
    21#include <range/v3/all.hpp>
    +
    22
    +
    23namespace rng = ::ranges;
    +
    24
    +
    25#define DR_RANGES_NAMESPACE ranges
    +
    26
    +
    27#endif
    +
    + + + + diff --git a/doxygen/ranges__utils_8hpp_source.html b/doxygen/ranges__utils_8hpp_source.html new file mode 100644 index 0000000000..5c8186e641 --- /dev/null +++ b/doxygen/ranges__utils_8hpp_source.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/ranges_utils.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    ranges_utils.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7namespace dr::__detail {
    +
    8
    +
    9//
    +
    10// std::ranges::enumerate handles unbounded ranges and returns a range
    +
    11// where end() is a different type than begin(). Most of our code
    +
    12// assumes std::ranges::common_range. bounded_enumerate requires a
    +
    13// bounded range and returns a common_range.
    +
    14//
    +
    15template <typename R> auto bounded_enumerate(R &&r) {
    +
    16 auto size = rng::distance(r);
    +
    17 using W = std::uint32_t;
    +
    18 return rng::views::zip(rng::views::iota(W(0), W(size)), r);
    +
    19}
    +
    20
    +
    21} // namespace dr::__detail
    +
    + + + + diff --git a/doxygen/remote__subrange_8hpp_source.html b/doxygen/remote__subrange_8hpp_source.html new file mode 100644 index 0000000000..d1e61cce00 --- /dev/null +++ b/doxygen/remote__subrange_8hpp_source.html @@ -0,0 +1,140 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/remote_subrange.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    remote_subrange.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <iterator>
    +
    8
    +
    9#include <dr/concepts/concepts.hpp>
    +
    10#include <dr/detail/ranges_shim.hpp>
    +
    11
    +
    12namespace dr {
    +
    13
    +
    14template <std::forward_iterator I>
    +
    15class remote_subrange : public rng::subrange<I, I> {
    +
    16 using base = rng::subrange<I, I>;
    +
    17
    +
    18public:
    + +
    20 requires std::default_initializable<I>
    +
    21 = default;
    +
    22
    +
    23 constexpr remote_subrange(I first, I last, std::size_t rank)
    +
    24 : base(first, last), rank_(rank) {}
    +
    25
    +
    26 template <rng::forward_range R>
    +
    27 constexpr remote_subrange(R &&r, std::size_t rank)
    +
    28 : base(rng::begin(r), rng::end(r)), rank_(rank) {}
    +
    29
    +
    30 template <dr::remote_range R>
    +
    31 constexpr remote_subrange(R &&r)
    +
    32 : base(rng::begin(r), rng::end(r)), rank_(dr::ranges::rank(r)) {}
    +
    33
    +
    34 constexpr std::size_t rank() const noexcept { return rank_; }
    +
    35
    +
    36private:
    +
    37 std::size_t rank_;
    +
    38};
    +
    39
    +
    40template <rng::forward_range R>
    + +
    42
    +
    43template <dr::remote_range R>
    + +
    45
    +
    46} // namespace dr
    +
    47
    +
    48#if !defined(DR_SPEC)
    +
    49
    +
    50// Needed to satisfy concepts for rng::begin
    +
    51template <typename R>
    +
    52inline constexpr bool rng::enable_borrowed_range<dr::remote_subrange<R>> = true;
    +
    53
    +
    54#endif
    +
    Definition: remote_subrange.hpp:15
    +
    + + + + diff --git a/doxygen/search/all_0.js b/doxygen/search/all_0.js new file mode 100644 index 0000000000..1ee809260e --- /dev/null +++ b/doxygen/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['allocator_0',['allocator',['../classdr_1_1mp_1_1____detail_1_1allocator.html',1,'dr::mp::__detail']]], + ['any_1',['any',['../structdr_1_1mp_1_1____detail_1_1any.html',1,'dr::mp::__detail']]] +]; diff --git a/doxygen/search/all_1.js b/doxygen/search/all_1.js new file mode 100644 index 0000000000..0fc367ad5a --- /dev/null +++ b/doxygen/search/all_1.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['begin_0',['begin',['../classdr_1_1mp_1_1distributed__vector.html#a7d99e72c2d282903d8d3c8c10a72d347',1,'dr::mp::distributed_vector']]], + ['block_5fcyclic_1',['block_cyclic',['../classdr_1_1sp_1_1block__cyclic.html',1,'dr::sp']]], + ['buffer_2',['buffer',['../classdr_1_1mp_1_1____detail_1_1buffer.html',1,'dr::mp::__detail']]], + ['buffered_5fallocator_3',['buffered_allocator',['../classdr_1_1sp_1_1buffered__allocator.html',1,'dr::sp']]] +]; diff --git a/doxygen/search/all_10.js b/doxygen/search/all_10.js new file mode 100644 index 0000000000..ec69469c72 --- /dev/null +++ b/doxygen/search/all_10.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['timer_0',['timer',['../classdr_1_1timer.html',1,'dr']]], + ['tmp_5fbuffer_1',['tmp_buffer',['../classdr_1_1mp_1_1____detail_1_1tmp__buffer.html',1,'dr::mp::__detail']]], + ['transform_5fadapter_5fclosure_2',['transform_adapter_closure',['../classdr_1_1views_1_1transform__adapter__closure.html',1,'dr::views']]], + ['transform_5ffn_5f_3',['transform_fn_',['../classdr_1_1views_1_1transform__fn__.html',1,'dr::views']]], + ['transform_5fiterator_4',['transform_iterator',['../classdr_1_1transform__iterator.html',1,'dr']]], + ['transform_5fview_5',['transform_view',['../classdr_1_1transform__view.html',1,'dr']]], + ['tuple_5felement_3c_20index_2c_20dr_3a_3aindex_3c_20i_20_3e_20_3e_6',['tuple_element< Index, dr::index< I > >',['../structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4.html',1,'std']]], + ['tuple_5felement_3c_20index_2c_20dr_3a_3asp_3a_3amatrix_5fentry_3c_20t_2c_20i_20_3e_20_3e_7',['tuple_element< Index, dr::sp::matrix_entry< T, I > >',['../structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html',1,'std']]], + ['tuple_5felement_3c_20index_2c_20dr_3a_3asp_3a_3amatrix_5fref_3c_20t_2c_20i_2c_20tref_20_3e_20_3e_8',['tuple_element< Index, dr::sp::matrix_ref< T, I, TRef > >',['../structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html',1,'std']]], + ['tuple_5for_5fpair_9',['tuple_or_pair',['../structdr_1_1sp_1_1____detail_1_1tuple__or__pair.html',1,'dr::sp::__detail']]], + ['tuple_5for_5fpair_3c_20t_2c_20u_20_3e_10',['tuple_or_pair< T, U >',['../structdr_1_1sp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4.html',1,'dr::sp::__detail']]], + ['tuple_5fsize_3c_20dr_3a_3aindex_3c_20i_20_3e_20_3e_11',['tuple_size< dr::index< I > >',['../structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4.html',1,'std']]], + ['tuple_5fsize_3c_20dr_3a_3asp_3a_3amatrix_5fentry_3c_20t_2c_20i_20_3e_20_3e_12',['tuple_size< dr::sp::matrix_entry< T, I > >',['../structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html',1,'std']]], + ['tuple_5fsize_3c_20dr_3a_3asp_3a_3amatrix_5fref_3c_20t_2c_20i_2c_20tref_20_3e_20_3e_13',['tuple_size< dr::sp::matrix_ref< T, I, TRef > >',['../structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html',1,'std']]] +]; diff --git a/doxygen/search/all_11.js b/doxygen/search/all_11.js new file mode 100644 index 0000000000..3af9cb755d --- /dev/null +++ b/doxygen/search/all_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['unstructured_5fhalo_0',['unstructured_halo',['../classdr_1_1mp_1_1unstructured__halo.html',1,'dr::mp::unstructured_halo< T, Memory >'],['../classdr_1_1mp_1_1unstructured__halo.html#a34175a58141ffb9b5d97f6f7d4e68469',1,'dr::mp::unstructured_halo::unstructured_halo()']]] +]; diff --git a/doxygen/search/all_12.js b/doxygen/search/all_12.js new file mode 100644 index 0000000000..d1fa734f0b --- /dev/null +++ b/doxygen/search/all_12.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['vector_0',['vector',['../classdr_1_1sp_1_1vector.html',1,'dr::sp']]], + ['vector_3c_20t_2c_20allocator_20_3e_1',['vector< T, Allocator >',['../classdr_1_1sp_1_1vector.html',1,'dr::sp']]] +]; diff --git a/doxygen/search/all_13.js b/doxygen/search/all_13.js new file mode 100644 index 0000000000..09d2aa8c81 --- /dev/null +++ b/doxygen/search/all_13.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['zip_5faccessor_0',['zip_accessor',['../classdr_1_1sp_1_1zip__accessor.html',1,'dr::sp']]], + ['zip_5fiterator_1',['zip_iterator',['../classdr_1_1mp_1_1zip__iterator.html',1,'dr::mp']]], + ['zip_5fview_2',['zip_view',['../classdr_1_1mp_1_1zip__view.html',1,'dr::mp::zip_view< Rs >'],['../classdr_1_1sp_1_1zip__view.html',1,'dr::sp::zip_view< Rs >']]] +]; diff --git a/doxygen/search/all_2.js b/doxygen/search/all_2.js new file mode 100644 index 0000000000..85d6db51a0 --- /dev/null +++ b/doxygen/search/all_2.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['communicator_0',['communicator',['../classdr_1_1communicator.html',1,'dr']]], + ['coo_5fmatrix_1',['coo_matrix',['../classdr_1_1sp_1_1____detail_1_1coo__matrix.html',1,'dr::sp::__detail']]], + ['count_5ffn_5f_2',['count_fn_',['../classdr_1_1mp_1_1count__fn__.html',1,'dr::mp']]], + ['count_5fif_5ffn_5f_3',['count_if_fn_',['../classdr_1_1mp_1_1count__if__fn__.html',1,'dr::mp']]], + ['csr_5fmatrix_5fview_4',['csr_matrix_view',['../classdr_1_1sp_1_1csr__matrix__view.html',1,'dr::sp']]], + ['csr_5fmatrix_5fview_5faccessor_5',['csr_matrix_view_accessor',['../classdr_1_1sp_1_1csr__matrix__view__accessor.html',1,'dr::sp']]] +]; diff --git a/doxygen/search/all_3.js b/doxygen/search/all_3.js new file mode 100644 index 0000000000..274a48ab5f --- /dev/null +++ b/doxygen/search/all_3.js @@ -0,0 +1,66 @@ +var searchData= +[ + ['default_5fmemory_0',['default_memory',['../structdr_1_1default__memory.html',1,'dr']]], + ['dense_5fmatrix_1',['dense_matrix',['../classdr_1_1sp_1_1dense__matrix.html',1,'dr::sp']]], + ['dense_5fmatrix_5faccessor_2',['dense_matrix_accessor',['../classdr_1_1sp_1_1dense__matrix__accessor.html',1,'dr::sp']]], + ['dense_5fmatrix_5fcolumn_5faccessor_3',['dense_matrix_column_accessor',['../classdr_1_1sp_1_1dense__matrix__column__accessor.html',1,'dr::sp']]], + ['dense_5fmatrix_5fcolumn_5fview_4',['dense_matrix_column_view',['../classdr_1_1sp_1_1dense__matrix__column__view.html',1,'dr::sp']]], + ['dense_5fmatrix_5frow_5faccessor_5',['dense_matrix_row_accessor',['../classdr_1_1sp_1_1dense__matrix__row__accessor.html',1,'dr::sp']]], + ['dense_5fmatrix_5frow_5fview_6',['dense_matrix_row_view',['../classdr_1_1sp_1_1dense__matrix__row__view.html',1,'dr::sp']]], + ['dense_5fmatrix_5fview_7',['dense_matrix_view',['../classdr_1_1sp_1_1dense__matrix__view.html',1,'dr::sp']]], + ['device_5fallocator_8',['device_allocator',['../classdr_1_1sp_1_1device__allocator.html',1,'dr::sp']]], + ['device_5fpolicy_9',['device_policy',['../structdr_1_1mp_1_1device__policy.html',1,'dr::mp::device_policy'],['../structdr_1_1sp_1_1device__policy.html',1,'dr::sp::device_policy']]], + ['device_5fptr_10',['device_ptr',['../classdr_1_1sp_1_1device__ptr.html',1,'dr::sp']]], + ['device_5fref_11',['device_ref',['../classdr_1_1sp_1_1device__ref.html',1,'dr::sp']]], + ['device_5fspan_12',['device_span',['../classdr_1_1sp_1_1device__span.html',1,'dr::sp']]], + ['device_5fvector_13',['device_vector',['../classdr_1_1sp_1_1device__vector.html',1,'dr::sp']]], + ['direct_5fiterator_14',['direct_iterator',['../classdr_1_1____detail_1_1direct__iterator.html',1,'dr::__detail']]], + ['distributed_5fcontiguous_5fiterator_15',['distributed_contiguous_iterator',['../conceptdr_1_1distributed__contiguous__iterator.html',1,'dr']]], + ['distributed_5fcontiguous_5frange_16',['distributed_contiguous_range',['../conceptdr_1_1distributed__contiguous__range.html',1,'dr']]], + ['distributed_5fdense_5fmatrix_17',['distributed_dense_matrix',['../classdr_1_1sp_1_1distributed__dense__matrix.html',1,'dr::sp']]], + ['distributed_5fdense_5fmatrix_5faccessor_18',['distributed_dense_matrix_accessor',['../classdr_1_1sp_1_1distributed__dense__matrix__accessor.html',1,'dr::sp']]], + ['distributed_5fiterator_19',['distributed_iterator',['../conceptdr_1_1distributed__iterator.html',1,'dr']]], + ['distributed_5fmdarray_20',['distributed_mdarray',['../classdr_1_1mp_1_1distributed__mdarray.html',1,'dr::mp']]], + ['distributed_5fmdspan_5frange_21',['distributed_mdspan_range',['../conceptdr_1_1distributed__mdspan__range.html',1,'dr']]], + ['distributed_5frange_22',['distributed_range',['../conceptdr_1_1distributed__range.html',1,'dr']]], + ['distributed_5frange_5faccessor_23',['distributed_range_accessor',['../classdr_1_1sp_1_1distributed__range__accessor.html',1,'dr::sp']]], + ['distributed_5fspan_24',['distributed_span',['../classdr_1_1sp_1_1distributed__span.html',1,'dr::sp']]], + ['distributed_5fspan_5faccessor_25',['distributed_span_accessor',['../classdr_1_1sp_1_1distributed__span__accessor.html',1,'dr::sp']]], + ['distributed_5fvector_26',['distributed_vector',['../classdr_1_1mp_1_1distributed__vector.html#a3b5aa7f2ec47c0ba482d19edd80166d7',1,'dr::mp::distributed_vector::distributed_vector(std::size_t size, value_type fill_value, distribution dist=distribution())'],['../classdr_1_1mp_1_1distributed__vector.html#ab92ce20fbb29588e0f68e073fecbfff8',1,'dr::mp::distributed_vector::distributed_vector(std::size_t size=0, distribution dist=distribution())'],['../classdr_1_1mp_1_1distributed__vector.html',1,'dr::mp::distributed_vector< T, BackendT >'],['../structdr_1_1sp_1_1distributed__vector.html',1,'dr::sp::distributed_vector< T, Allocator >']]], + ['distributed_5fvector_5faccessor_27',['distributed_vector_accessor',['../classdr_1_1sp_1_1distributed__vector__accessor.html',1,'dr::sp']]], + ['distribution_28',['distribution',['../structdr_1_1mp_1_1distribution.html',1,'dr::mp']]], + ['duplicated_5fvector_29',['duplicated_vector',['../classdr_1_1sp_1_1duplicated__vector.html',1,'dr::sp']]], + ['dv_5fsegment_30',['dv_segment',['../classdr_1_1mp_1_1dv__segment.html',1,'dr::mp']]], + ['dv_5fsegment_5fiterator_31',['dv_segment_iterator',['../classdr_1_1mp_1_1dv__segment__iterator.html',1,'dr::mp']]], + ['dv_5fsegment_5freference_32',['dv_segment_reference',['../classdr_1_1mp_1_1dv__segment__reference.html',1,'dr::mp']]], + ['has_5fhalo_5fmethod_33',['has_halo_method',['../conceptdr_1_1mp_1_1has__halo__method.html',1,'dr::mp']]], + ['has_5flocal_34',['has_local',['../conceptdr_1_1ranges_1_1____detail_1_1has__local.html',1,'dr::ranges::__detail']]], + ['has_5flocal_5fadl_35',['has_local_adl',['../conceptdr_1_1ranges_1_1_0d14_1_1has__local__adl.html',1,'dr::ranges::@14']]], + ['has_5frank_5fadl_36',['has_rank_adl',['../conceptdr_1_1ranges_1_1_0d14_1_1has__rank__adl.html',1,'dr::ranges::@14']]], + ['has_5frank_5fmethod_37',['has_rank_method',['../conceptdr_1_1ranges_1_1_0d14_1_1has__rank__method.html',1,'dr::ranges::@14']]], + ['has_5fsegments_38',['has_segments',['../conceptdr_1_1mp_1_1has__segments.html',1,'dr::mp']]], + ['has_5fsegments_5fadl_39',['has_segments_adl',['../conceptdr_1_1ranges_1_1_0d14_1_1has__segments__adl.html',1,'dr::ranges::@14']]], + ['has_5fsegments_5fmethod_40',['has_segments_method',['../conceptdr_1_1_0d5_1_1has__segments__method.html',1,'dr::@5'],['../conceptdr_1_1ranges_1_1_0d14_1_1has__segments__method.html',1,'dr::ranges::@14']]], + ['is_5fdistributed_41',['is_distributed',['../conceptdr_1_1mp_1_1____detail_1_1is__distributed.html',1,'dr::mp::__detail']]], + ['is_5flocalizable_42',['is_localizable',['../conceptdr_1_1ranges_1_1_0d14_1_1is__localizable.html',1,'dr::ranges::@14']]], + ['is_5fmdspan_5fview_43',['is_mdspan_view',['../conceptdr_1_1mp_1_1is__mdspan__view.html',1,'dr::mp']]], + ['is_5fremote_5fiterator_5fshadow_5fimpl_5f_44',['is_remote_iterator_shadow_impl_',['../conceptdr_1_1ranges_1_1_0d14_1_1is__remote__iterator__shadow__impl__.html',1,'dr::ranges::@14']]], + ['is_5fsyclmemcopyable_45',['is_syclmemcopyable',['../conceptdr_1_1sp_1_1____detail_1_1is__syclmemcopyable.html',1,'dr::sp::__detail']]], + ['iter_5fhas_5flocal_5fmethod_46',['iter_has_local_method',['../conceptdr_1_1ranges_1_1_0d14_1_1iter__has__local__method.html',1,'dr::ranges::@14']]], + ['mdarray_5flike_47',['mdarray_like',['../conceptdr_1_1____detail_1_1mdarray__like.html',1,'dr::__detail']]], + ['mdspan_5flike_48',['mdspan_like',['../conceptdr_1_1____detail_1_1mdspan__like.html',1,'dr::__detail']]], + ['no_5fsegments_49',['no_segments',['../conceptdr_1_1mp_1_1no__segments.html',1,'dr::mp']]], + ['one_5fargument_50',['one_argument',['../conceptdr_1_1mp_1_1____detail_1_1one__argument.html',1,'dr::mp::__detail']]], + ['remote_5fcontiguous_5fiterator_51',['remote_contiguous_iterator',['../conceptdr_1_1remote__contiguous__iterator.html',1,'dr']]], + ['remote_5fcontiguous_5frange_52',['remote_contiguous_range',['../conceptdr_1_1remote__contiguous__range.html',1,'dr']]], + ['remote_5fiterator_53',['remote_iterator',['../conceptdr_1_1remote__iterator.html',1,'dr']]], + ['remote_5frange_54',['remote_range',['../conceptdr_1_1remote__range.html',1,'dr']]], + ['remote_5frange_5fshadow_5fimpl_5f_55',['remote_range_shadow_impl_',['../conceptdr_1_1ranges_1_1_0d14_1_1remote__range__shadow__impl__.html',1,'dr::ranges::@14']]], + ['segment_5fhas_5flocal_5fmethod_56',['segment_has_local_method',['../conceptdr_1_1ranges_1_1_0d14_1_1segment__has__local__method.html',1,'dr::ranges::@14']]], + ['segments_5frange_57',['segments_range',['../conceptdr_1_1ranges_1_1_0d14_1_1segments__range.html',1,'dr::ranges::@14']]], + ['sycl_5fdevice_5fselector_58',['sycl_device_selector',['../conceptdr_1_1sp_1_1____detail_1_1sycl__device__selector.html',1,'dr::sp::__detail']]], + ['tupleelementgettable_59',['TupleElementGettable',['../conceptdr_1_1_0d4_1_1TupleElementGettable.html',1,'dr::@4']]], + ['tuplelike_60',['TupleLike',['../conceptdr_1_1TupleLike.html',1,'dr']]], + ['two_5farguments_61',['two_arguments',['../conceptdr_1_1mp_1_1____detail_1_1two__arguments.html',1,'dr::mp::__detail']]], + ['zipable_62',['zipable',['../conceptdr_1_1mp_1_1____detail_1_1zipable.html',1,'dr::mp::__detail']]] +]; diff --git a/doxygen/search/all_4.js b/doxygen/search/all_4.js new file mode 100644 index 0000000000..7969d96d88 --- /dev/null +++ b/doxygen/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['end_0',['end',['../classdr_1_1mp_1_1distributed__vector.html#a3c00d38e1b8a9bf657fe51f53b9c1184',1,'dr::mp::distributed_vector']]], + ['enumerate_5fadapter_5fclosure_1',['enumerate_adapter_closure',['../classdr_1_1____detail_1_1enumerate__adapter__closure.html',1,'dr::__detail::enumerate_adapter_closure'],['../classdr_1_1mp_1_1views_1_1enumerate__adapter__closure.html',1,'dr::mp::views::enumerate_adapter_closure'],['../classdr_1_1sp_1_1views_1_1enumerate__adapter__closure.html',1,'dr::sp::views::enumerate_adapter_closure']]], + ['enumerate_5ffn_5f_2',['enumerate_fn_',['../classdr_1_1____detail_1_1enumerate__fn__.html',1,'dr::__detail::enumerate_fn_'],['../classdr_1_1mp_1_1views_1_1enumerate__fn__.html',1,'dr::mp::views::enumerate_fn_'],['../classdr_1_1sp_1_1views_1_1enumerate__fn__.html',1,'dr::sp::views::enumerate_fn_']]], + ['event_3',['event',['../classdr_1_1____detail_1_1event.html',1,'dr::__detail']]], + ['exchange_5fbegin_4',['exchange_begin',['../classdr_1_1mp_1_1halo__impl.html#a494233caba6ea66bb8553bfa16e86662',1,'dr::mp::halo_impl']]], + ['exchange_5ffinalize_5',['exchange_finalize',['../classdr_1_1mp_1_1halo__impl.html#afdfab35f826a7591c82dcde73e6dee22',1,'dr::mp::halo_impl']]] +]; diff --git a/doxygen/search/all_5.js b/doxygen/search/all_5.js new file mode 100644 index 0000000000..6b73686053 --- /dev/null +++ b/doxygen/search/all_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['formatter_3c_20mdspan_2c_20char_20_3e_0',['formatter< Mdspan, char >',['../structfmt_1_1formatter_3_01Mdspan_00_01char_01_4.html',1,'fmt']]], + ['future_1',['future',['../classdr_1_1sp_1_1future.html',1,'dr::sp']]] +]; diff --git a/doxygen/search/all_6.js b/doxygen/search/all_6.js new file mode 100644 index 0000000000..f207657cac --- /dev/null +++ b/doxygen/search/all_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['global_5fcontext_0',['global_context',['../structdr_1_1mp_1_1____detail_1_1global__context.html',1,'dr::mp::__detail']]] +]; diff --git a/doxygen/search/all_7.js b/doxygen/search/all_7.js new file mode 100644 index 0000000000..cd89d0d6b2 --- /dev/null +++ b/doxygen/search/all_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['halo_5fbounds_0',['halo_bounds',['../structdr_1_1mp_1_1halo__bounds.html',1,'dr::mp']]], + ['halo_5fimpl_1',['halo_impl',['../classdr_1_1mp_1_1halo__impl.html',1,'dr::mp::halo_impl< Group >'],['../classdr_1_1mp_1_1halo__impl.html#ac2cb7a4821925599ff4405bd3c94e953',1,'dr::mp::halo_impl::halo_impl()']]] +]; diff --git a/doxygen/search/all_8.js b/doxygen/search/all_8.js new file mode 100644 index 0000000000..bac4ce3d70 --- /dev/null +++ b/doxygen/search/all_8.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['id_0',['id',['../classdr_1_1sp_1_1id.html',1,'dr::sp']]], + ['index_1',['index',['../classdr_1_1index.html',1,'dr']]], + ['index_3c_20i_20_3e_2',['index< I >',['../classdr_1_1index.html',1,'dr']]], + ['index_3c_20std_3a_3aint64_5ft_20_3e_3',['index< std::int64_t >',['../classdr_1_1index.html',1,'dr']]], + ['index_3c_20std_3a_3asize_5ft_20_3e_4',['index< std::size_t >',['../classdr_1_1index.html',1,'dr']]], + ['index_5fgroup_5',['index_group',['../classdr_1_1mp_1_1index__group.html',1,'dr::mp::index_group< T, Memory >'],['../classdr_1_1mp_1_1index__group.html#a240920b56371d37fe7c79904faab4d23',1,'dr::mp::index_group::index_group()']]], + ['iota_5ffn_5f_6',['iota_fn_',['../structdr_1_1views_1_1iota__fn__.html',1,'dr::views']]], + ['is_5fdrop_5fview_7',['is_drop_view',['../structdr_1_1is__drop__view.html',1,'dr']]], + ['is_5fdrop_5fview_3c_20rng_3a_3adrop_5fview_3c_20t_20_3e_20_3e_8',['is_drop_view< rng::drop_view< T > >',['../structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4.html',1,'dr']]], + ['is_5fiota_5fview_9',['is_iota_view',['../structdr_1_1is__iota__view.html',1,'dr']]], + ['is_5fiota_5fview_3c_20rng_3a_3aiota_5fview_3c_20w_20_3e_20_3e_10',['is_iota_view< rng::iota_view< W > >',['../structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4.html',1,'dr']]], + ['is_5fowning_5fview_11',['is_owning_view',['../structdr_1_1is__owning__view.html',1,'dr']]], + ['is_5fref_5fview_12',['is_ref_view',['../structdr_1_1is__ref__view.html',1,'dr']]], + ['is_5fref_5fview_3c_20rng_3a_3aref_5fview_3c_20r_20_3e_20_3e_13',['is_ref_view< rng::ref_view< R > >',['../structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4.html',1,'dr']]], + ['is_5fsliding_5fview_14',['is_sliding_view',['../structdr_1_1is__sliding__view.html',1,'dr']]], + ['is_5fsliding_5fview_3c_20rng_3a_3asliding_5fview_3c_20t_20_3e_20_3e_15',['is_sliding_view< rng::sliding_view< T > >',['../structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4.html',1,'dr']]], + ['is_5fsubrange_5fview_16',['is_subrange_view',['../structdr_1_1is__subrange__view.html',1,'dr']]], + ['is_5fsubrange_5fview_3c_20rng_3a_3asubrange_3c_20t_20_3e_20_3e_17',['is_subrange_view< rng::subrange< T > >',['../structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4.html',1,'dr']]], + ['is_5ftake_5fview_18',['is_take_view',['../structdr_1_1is__take__view.html',1,'dr']]], + ['is_5ftake_5fview_3c_20rng_3a_3atake_5fview_3c_20t_20_3e_20_3e_19',['is_take_view< rng::take_view< T > >',['../structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4.html',1,'dr']]], + ['is_5fzip_5fview_20',['is_zip_view',['../structdr_1_1is__zip__view.html',1,'dr']]], + ['is_5fzip_5fview_3c_20rng_3a_3azip_5fview_3c_20views_2e_2e_2e_20_3e_20_3e_21',['is_zip_view< rng::zip_view< Views... > >',['../structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4.html',1,'dr']]], + ['iterator_22',['iterator',['../classdr_1_1mp_1_1distributed__vector_1_1iterator.html',1,'dr::mp::distributed_vector']]], + ['iterator_5fadaptor_23',['iterator_adaptor',['../classdr_1_1iterator__adaptor.html',1,'dr']]] +]; diff --git a/doxygen/search/all_9.js b/doxygen/search/all_9.js new file mode 100644 index 0000000000..6f4ccf4735 --- /dev/null +++ b/doxygen/search/all_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['local_5ffn_5f_0',['local_fn_',['../structdr_1_1ranges_1_1____detail_1_1local__fn__.html',1,'dr::ranges::__detail']]], + ['logger_1',['logger',['../classdr_1_1logger.html',1,'dr']]] +]; diff --git a/doxygen/search/all_a.js b/doxygen/search/all_a.js new file mode 100644 index 0000000000..c288cfcb2b --- /dev/null +++ b/doxygen/search/all_a.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['matrix_5fentry_0',['matrix_entry',['../classdr_1_1sp_1_1matrix__entry.html',1,'dr::sp']]], + ['matrix_5fpartition_1',['matrix_partition',['../classdr_1_1sp_1_1matrix__partition.html',1,'dr::sp']]], + ['matrix_5fref_2',['matrix_ref',['../classdr_1_1sp_1_1matrix__ref.html',1,'dr::sp']]], + ['max_5fop_3',['max_op',['../structdr_1_1mp_1_1halo__impl_1_1max__op.html',1,'dr::mp::halo_impl']]], + ['md_5fsegment_4',['md_segment',['../classdr_1_1mp_1_1____detail_1_1md__segment.html',1,'dr::mp::__detail']]], + ['mdspan_5fadapter_5fclosure_5',['mdspan_adapter_closure',['../classdr_1_1mp_1_1views_1_1mdspan__adapter__closure.html',1,'dr::mp::views']]], + ['mdspan_5ffn_5f_6',['mdspan_fn_',['../classdr_1_1mp_1_1views_1_1mdspan__fn__.html',1,'dr::mp::views']]], + ['mdspan_5fiter_5faccessor_7',['mdspan_iter_accessor',['../classdr_1_1____detail_1_1mdspan__iter__accessor.html',1,'dr::__detail']]], + ['mdspan_5fview_8',['mdspan_view',['../structdr_1_1mp_1_1mdspan__view.html',1,'dr::mp']]], + ['mdsub_5fsegment_9',['mdsub_segment',['../classdr_1_1mp_1_1____detail_1_1mdsub__segment.html',1,'dr::mp::__detail']]], + ['mdtranspose_10',['mdtranspose',['../classdr_1_1____detail_1_1mdtranspose.html',1,'dr::__detail']]], + ['min_5fop_11',['min_op',['../structdr_1_1mp_1_1halo__impl_1_1min__op.html',1,'dr::mp::halo_impl']]], + ['mpibackend_12',['MpiBackend',['../classdr_1_1mp_1_1MpiBackend.html',1,'dr::mp']]], + ['multiplies_5fop_13',['multiplies_op',['../structdr_1_1mp_1_1halo__impl_1_1multiplies__op.html',1,'dr::mp::halo_impl']]] +]; diff --git a/doxygen/search/all_b.js b/doxygen/search/all_b.js new file mode 100644 index 0000000000..c0669e1f27 --- /dev/null +++ b/doxygen/search/all_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['normal_5fdistributed_5fiterator_5faccessor_0',['normal_distributed_iterator_accessor',['../classdr_1_1normal__distributed__iterator__accessor.html',1,'dr']]] +]; diff --git a/doxygen/search/all_c.js b/doxygen/search/all_c.js new file mode 100644 index 0000000000..338caa687c --- /dev/null +++ b/doxygen/search/all_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['operator_5b_5d_0',['operator[]',['../classdr_1_1mp_1_1distributed__vector.html#a2ab3fddcdfedddc8258740f0b1eaa126',1,'dr::mp::distributed_vector']]], + ['owning_5fview_1',['owning_view',['../classdr_1_1____detail_1_1owning__view.html',1,'dr::__detail']]] +]; diff --git a/doxygen/search/all_d.js b/doxygen/search/all_d.js new file mode 100644 index 0000000000..14f6619ec6 --- /dev/null +++ b/doxygen/search/all_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['plus_5fop_0',['plus_op',['../structdr_1_1mp_1_1halo__impl_1_1plus__op.html',1,'dr::mp::halo_impl']]] +]; diff --git a/doxygen/search/all_e.js b/doxygen/search/all_e.js new file mode 100644 index 0000000000..24836c25e5 --- /dev/null +++ b/doxygen/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['range_5fsize_0',['range_size',['../structdr_1_1mp_1_1views_1_1____detail_1_1range__size.html',1,'dr::mp::views::__detail']]], + ['range_5fsize_3c_20r_20_3e_1',['range_size< R >',['../structdr_1_1mp_1_1views_1_1____detail_1_1range__size_3_01R_01_4.html',1,'dr::mp::views::__detail']]], + ['rebind_2',['rebind',['../structdr_1_1sp_1_1device__allocator_1_1rebind.html',1,'dr::sp::device_allocator']]], + ['reduce_5fbegin_3',['reduce_begin',['../classdr_1_1mp_1_1halo__impl.html#a3b2c11e0a016c768c65baf063f7ed8b5',1,'dr::mp::halo_impl']]], + ['reduce_5ffinalize_4',['reduce_finalize',['../classdr_1_1mp_1_1halo__impl.html#a16abfcd5cdbcfed8c8b81b19a77d4223',1,'dr::mp::halo_impl::reduce_finalize(const auto &op)'],['../classdr_1_1mp_1_1halo__impl.html#a3e5cec61ea29da0b960b906f686cea9a',1,'dr::mp::halo_impl::reduce_finalize()']]], + ['remote_5fsubrange_5',['remote_subrange',['../classdr_1_1remote__subrange.html',1,'dr']]], + ['rma_5fwindow_6',['rma_window',['../classdr_1_1rma__window.html',1,'dr']]] +]; diff --git a/doxygen/search/all_f.js b/doxygen/search/all_f.js new file mode 100644 index 0000000000..c5b5ab70c1 --- /dev/null +++ b/doxygen/search/all_f.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['second_5fop_0',['second_op',['../structdr_1_1mp_1_1halo__impl_1_1second__op.html',1,'dr::mp::halo_impl']]], + ['segment_5frange_1',['segment_range',['../classdr_1_1sp_1_1segment__range.html',1,'dr::sp']]], + ['segment_5frange_5faccessor_2',['segment_range_accessor',['../classdr_1_1sp_1_1segment__range__accessor.html',1,'dr::sp']]], + ['segmented_5fview_3',['segmented_view',['../classdr_1_1mp_1_1segmented__view.html',1,'dr::mp']]], + ['segmented_5fview_5fiterator_4',['segmented_view_iterator',['../classdr_1_1mp_1_1segmented__view__iterator.html',1,'dr::mp']]], + ['size_5',['size',['../classdr_1_1mp_1_1distributed__vector.html#a080457af224429dbae0ccf586e2da206',1,'dr::mp::distributed_vector']]], + ['slice_5fadaptor_5fclosure_6',['slice_adaptor_closure',['../classdr_1_1sp_1_1views_1_1slice__adaptor__closure.html',1,'dr::sp::views']]], + ['sliding_5ffn_7',['sliding_fn',['../structdr_1_1mp_1_1views_1_1____detail_1_1sliding__fn.html',1,'dr::mp::views::__detail']]], + ['source_5flocation_8',['source_location',['../structnostd_1_1source__location.html',1,'nostd']]], + ['span_9',['span',['../classdr_1_1sp_1_1span.html',1,'dr::sp']]], + ['span_3c_20t_2c_20t_20_2a_20_3e_10',['span< T, T * >',['../classdr_1_1sp_1_1span.html',1,'dr::sp']]], + ['span_5fgroup_11',['span_group',['../classdr_1_1mp_1_1span__group.html',1,'dr::mp']]], + ['span_5fhalo_12',['span_halo',['../classdr_1_1mp_1_1span__halo.html',1,'dr::mp']]], + ['sparse_5fmatrix_13',['sparse_matrix',['../classdr_1_1sp_1_1sparse__matrix.html',1,'dr::sp']]], + ['submdspan_5fadapter_5fclosure_14',['submdspan_adapter_closure',['../classdr_1_1mp_1_1views_1_1submdspan__adapter__closure.html',1,'dr::mp::views']]], + ['submdspan_5ffn_5f_15',['submdspan_fn_',['../classdr_1_1mp_1_1views_1_1submdspan__fn__.html',1,'dr::mp::views']]], + ['submdspan_5fview_16',['submdspan_view',['../structdr_1_1mp_1_1submdspan__view.html',1,'dr::mp']]], + ['subrange_17',['subrange',['../classdr_1_1mp_1_1subrange.html',1,'dr::mp']]], + ['subrange_5fiterator_18',['subrange_iterator',['../classdr_1_1mp_1_1subrange__iterator.html',1,'dr::mp']]] +]; diff --git a/doxygen/search/classes_0.js b/doxygen/search/classes_0.js new file mode 100644 index 0000000000..1ee809260e --- /dev/null +++ b/doxygen/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['allocator_0',['allocator',['../classdr_1_1mp_1_1____detail_1_1allocator.html',1,'dr::mp::__detail']]], + ['any_1',['any',['../structdr_1_1mp_1_1____detail_1_1any.html',1,'dr::mp::__detail']]] +]; diff --git a/doxygen/search/classes_1.js b/doxygen/search/classes_1.js new file mode 100644 index 0000000000..4218e2575c --- /dev/null +++ b/doxygen/search/classes_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['block_5fcyclic_0',['block_cyclic',['../classdr_1_1sp_1_1block__cyclic.html',1,'dr::sp']]], + ['buffer_1',['buffer',['../classdr_1_1mp_1_1____detail_1_1buffer.html',1,'dr::mp::__detail']]], + ['buffered_5fallocator_2',['buffered_allocator',['../classdr_1_1sp_1_1buffered__allocator.html',1,'dr::sp']]] +]; diff --git a/doxygen/search/classes_10.js b/doxygen/search/classes_10.js new file mode 100644 index 0000000000..ec69469c72 --- /dev/null +++ b/doxygen/search/classes_10.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['timer_0',['timer',['../classdr_1_1timer.html',1,'dr']]], + ['tmp_5fbuffer_1',['tmp_buffer',['../classdr_1_1mp_1_1____detail_1_1tmp__buffer.html',1,'dr::mp::__detail']]], + ['transform_5fadapter_5fclosure_2',['transform_adapter_closure',['../classdr_1_1views_1_1transform__adapter__closure.html',1,'dr::views']]], + ['transform_5ffn_5f_3',['transform_fn_',['../classdr_1_1views_1_1transform__fn__.html',1,'dr::views']]], + ['transform_5fiterator_4',['transform_iterator',['../classdr_1_1transform__iterator.html',1,'dr']]], + ['transform_5fview_5',['transform_view',['../classdr_1_1transform__view.html',1,'dr']]], + ['tuple_5felement_3c_20index_2c_20dr_3a_3aindex_3c_20i_20_3e_20_3e_6',['tuple_element< Index, dr::index< I > >',['../structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4.html',1,'std']]], + ['tuple_5felement_3c_20index_2c_20dr_3a_3asp_3a_3amatrix_5fentry_3c_20t_2c_20i_20_3e_20_3e_7',['tuple_element< Index, dr::sp::matrix_entry< T, I > >',['../structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html',1,'std']]], + ['tuple_5felement_3c_20index_2c_20dr_3a_3asp_3a_3amatrix_5fref_3c_20t_2c_20i_2c_20tref_20_3e_20_3e_8',['tuple_element< Index, dr::sp::matrix_ref< T, I, TRef > >',['../structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html',1,'std']]], + ['tuple_5for_5fpair_9',['tuple_or_pair',['../structdr_1_1sp_1_1____detail_1_1tuple__or__pair.html',1,'dr::sp::__detail']]], + ['tuple_5for_5fpair_3c_20t_2c_20u_20_3e_10',['tuple_or_pair< T, U >',['../structdr_1_1sp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4.html',1,'dr::sp::__detail']]], + ['tuple_5fsize_3c_20dr_3a_3aindex_3c_20i_20_3e_20_3e_11',['tuple_size< dr::index< I > >',['../structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4.html',1,'std']]], + ['tuple_5fsize_3c_20dr_3a_3asp_3a_3amatrix_5fentry_3c_20t_2c_20i_20_3e_20_3e_12',['tuple_size< dr::sp::matrix_entry< T, I > >',['../structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html',1,'std']]], + ['tuple_5fsize_3c_20dr_3a_3asp_3a_3amatrix_5fref_3c_20t_2c_20i_2c_20tref_20_3e_20_3e_13',['tuple_size< dr::sp::matrix_ref< T, I, TRef > >',['../structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html',1,'std']]] +]; diff --git a/doxygen/search/classes_11.js b/doxygen/search/classes_11.js new file mode 100644 index 0000000000..0ef35474f0 --- /dev/null +++ b/doxygen/search/classes_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['unstructured_5fhalo_0',['unstructured_halo',['../classdr_1_1mp_1_1unstructured__halo.html',1,'dr::mp']]] +]; diff --git a/doxygen/search/classes_12.js b/doxygen/search/classes_12.js new file mode 100644 index 0000000000..d1fa734f0b --- /dev/null +++ b/doxygen/search/classes_12.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['vector_0',['vector',['../classdr_1_1sp_1_1vector.html',1,'dr::sp']]], + ['vector_3c_20t_2c_20allocator_20_3e_1',['vector< T, Allocator >',['../classdr_1_1sp_1_1vector.html',1,'dr::sp']]] +]; diff --git a/doxygen/search/classes_13.js b/doxygen/search/classes_13.js new file mode 100644 index 0000000000..09d2aa8c81 --- /dev/null +++ b/doxygen/search/classes_13.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['zip_5faccessor_0',['zip_accessor',['../classdr_1_1sp_1_1zip__accessor.html',1,'dr::sp']]], + ['zip_5fiterator_1',['zip_iterator',['../classdr_1_1mp_1_1zip__iterator.html',1,'dr::mp']]], + ['zip_5fview_2',['zip_view',['../classdr_1_1mp_1_1zip__view.html',1,'dr::mp::zip_view< Rs >'],['../classdr_1_1sp_1_1zip__view.html',1,'dr::sp::zip_view< Rs >']]] +]; diff --git a/doxygen/search/classes_2.js b/doxygen/search/classes_2.js new file mode 100644 index 0000000000..85d6db51a0 --- /dev/null +++ b/doxygen/search/classes_2.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['communicator_0',['communicator',['../classdr_1_1communicator.html',1,'dr']]], + ['coo_5fmatrix_1',['coo_matrix',['../classdr_1_1sp_1_1____detail_1_1coo__matrix.html',1,'dr::sp::__detail']]], + ['count_5ffn_5f_2',['count_fn_',['../classdr_1_1mp_1_1count__fn__.html',1,'dr::mp']]], + ['count_5fif_5ffn_5f_3',['count_if_fn_',['../classdr_1_1mp_1_1count__if__fn__.html',1,'dr::mp']]], + ['csr_5fmatrix_5fview_4',['csr_matrix_view',['../classdr_1_1sp_1_1csr__matrix__view.html',1,'dr::sp']]], + ['csr_5fmatrix_5fview_5faccessor_5',['csr_matrix_view_accessor',['../classdr_1_1sp_1_1csr__matrix__view__accessor.html',1,'dr::sp']]] +]; diff --git a/doxygen/search/classes_3.js b/doxygen/search/classes_3.js new file mode 100644 index 0000000000..ca54e4e29c --- /dev/null +++ b/doxygen/search/classes_3.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['default_5fmemory_0',['default_memory',['../structdr_1_1default__memory.html',1,'dr']]], + ['dense_5fmatrix_1',['dense_matrix',['../classdr_1_1sp_1_1dense__matrix.html',1,'dr::sp']]], + ['dense_5fmatrix_5faccessor_2',['dense_matrix_accessor',['../classdr_1_1sp_1_1dense__matrix__accessor.html',1,'dr::sp']]], + ['dense_5fmatrix_5fcolumn_5faccessor_3',['dense_matrix_column_accessor',['../classdr_1_1sp_1_1dense__matrix__column__accessor.html',1,'dr::sp']]], + ['dense_5fmatrix_5fcolumn_5fview_4',['dense_matrix_column_view',['../classdr_1_1sp_1_1dense__matrix__column__view.html',1,'dr::sp']]], + ['dense_5fmatrix_5frow_5faccessor_5',['dense_matrix_row_accessor',['../classdr_1_1sp_1_1dense__matrix__row__accessor.html',1,'dr::sp']]], + ['dense_5fmatrix_5frow_5fview_6',['dense_matrix_row_view',['../classdr_1_1sp_1_1dense__matrix__row__view.html',1,'dr::sp']]], + ['dense_5fmatrix_5fview_7',['dense_matrix_view',['../classdr_1_1sp_1_1dense__matrix__view.html',1,'dr::sp']]], + ['device_5fallocator_8',['device_allocator',['../classdr_1_1sp_1_1device__allocator.html',1,'dr::sp']]], + ['device_5fpolicy_9',['device_policy',['../structdr_1_1mp_1_1device__policy.html',1,'dr::mp::device_policy'],['../structdr_1_1sp_1_1device__policy.html',1,'dr::sp::device_policy']]], + ['device_5fptr_10',['device_ptr',['../classdr_1_1sp_1_1device__ptr.html',1,'dr::sp']]], + ['device_5fref_11',['device_ref',['../classdr_1_1sp_1_1device__ref.html',1,'dr::sp']]], + ['device_5fspan_12',['device_span',['../classdr_1_1sp_1_1device__span.html',1,'dr::sp']]], + ['device_5fvector_13',['device_vector',['../classdr_1_1sp_1_1device__vector.html',1,'dr::sp']]], + ['direct_5fiterator_14',['direct_iterator',['../classdr_1_1____detail_1_1direct__iterator.html',1,'dr::__detail']]], + ['distributed_5fdense_5fmatrix_15',['distributed_dense_matrix',['../classdr_1_1sp_1_1distributed__dense__matrix.html',1,'dr::sp']]], + ['distributed_5fdense_5fmatrix_5faccessor_16',['distributed_dense_matrix_accessor',['../classdr_1_1sp_1_1distributed__dense__matrix__accessor.html',1,'dr::sp']]], + ['distributed_5fmdarray_17',['distributed_mdarray',['../classdr_1_1mp_1_1distributed__mdarray.html',1,'dr::mp']]], + ['distributed_5frange_5faccessor_18',['distributed_range_accessor',['../classdr_1_1sp_1_1distributed__range__accessor.html',1,'dr::sp']]], + ['distributed_5fspan_19',['distributed_span',['../classdr_1_1sp_1_1distributed__span.html',1,'dr::sp']]], + ['distributed_5fspan_5faccessor_20',['distributed_span_accessor',['../classdr_1_1sp_1_1distributed__span__accessor.html',1,'dr::sp']]], + ['distributed_5fvector_21',['distributed_vector',['../classdr_1_1mp_1_1distributed__vector.html',1,'dr::mp::distributed_vector< T, BackendT >'],['../structdr_1_1sp_1_1distributed__vector.html',1,'dr::sp::distributed_vector< T, Allocator >']]], + ['distributed_5fvector_5faccessor_22',['distributed_vector_accessor',['../classdr_1_1sp_1_1distributed__vector__accessor.html',1,'dr::sp']]], + ['distribution_23',['distribution',['../structdr_1_1mp_1_1distribution.html',1,'dr::mp']]], + ['duplicated_5fvector_24',['duplicated_vector',['../classdr_1_1sp_1_1duplicated__vector.html',1,'dr::sp']]], + ['dv_5fsegment_25',['dv_segment',['../classdr_1_1mp_1_1dv__segment.html',1,'dr::mp']]], + ['dv_5fsegment_5fiterator_26',['dv_segment_iterator',['../classdr_1_1mp_1_1dv__segment__iterator.html',1,'dr::mp']]], + ['dv_5fsegment_5freference_27',['dv_segment_reference',['../classdr_1_1mp_1_1dv__segment__reference.html',1,'dr::mp']]] +]; diff --git a/doxygen/search/classes_4.js b/doxygen/search/classes_4.js new file mode 100644 index 0000000000..4167d591fa --- /dev/null +++ b/doxygen/search/classes_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['enumerate_5fadapter_5fclosure_0',['enumerate_adapter_closure',['../classdr_1_1____detail_1_1enumerate__adapter__closure.html',1,'dr::__detail::enumerate_adapter_closure'],['../classdr_1_1mp_1_1views_1_1enumerate__adapter__closure.html',1,'dr::mp::views::enumerate_adapter_closure'],['../classdr_1_1sp_1_1views_1_1enumerate__adapter__closure.html',1,'dr::sp::views::enumerate_adapter_closure']]], + ['enumerate_5ffn_5f_1',['enumerate_fn_',['../classdr_1_1____detail_1_1enumerate__fn__.html',1,'dr::__detail::enumerate_fn_'],['../classdr_1_1mp_1_1views_1_1enumerate__fn__.html',1,'dr::mp::views::enumerate_fn_'],['../classdr_1_1sp_1_1views_1_1enumerate__fn__.html',1,'dr::sp::views::enumerate_fn_']]], + ['event_2',['event',['../classdr_1_1____detail_1_1event.html',1,'dr::__detail']]] +]; diff --git a/doxygen/search/classes_5.js b/doxygen/search/classes_5.js new file mode 100644 index 0000000000..6b73686053 --- /dev/null +++ b/doxygen/search/classes_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['formatter_3c_20mdspan_2c_20char_20_3e_0',['formatter< Mdspan, char >',['../structfmt_1_1formatter_3_01Mdspan_00_01char_01_4.html',1,'fmt']]], + ['future_1',['future',['../classdr_1_1sp_1_1future.html',1,'dr::sp']]] +]; diff --git a/doxygen/search/classes_6.js b/doxygen/search/classes_6.js new file mode 100644 index 0000000000..f207657cac --- /dev/null +++ b/doxygen/search/classes_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['global_5fcontext_0',['global_context',['../structdr_1_1mp_1_1____detail_1_1global__context.html',1,'dr::mp::__detail']]] +]; diff --git a/doxygen/search/classes_7.js b/doxygen/search/classes_7.js new file mode 100644 index 0000000000..b60e87c507 --- /dev/null +++ b/doxygen/search/classes_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['halo_5fbounds_0',['halo_bounds',['../structdr_1_1mp_1_1halo__bounds.html',1,'dr::mp']]], + ['halo_5fimpl_1',['halo_impl',['../classdr_1_1mp_1_1halo__impl.html',1,'dr::mp']]] +]; diff --git a/doxygen/search/classes_8.js b/doxygen/search/classes_8.js new file mode 100644 index 0000000000..053d430e21 --- /dev/null +++ b/doxygen/search/classes_8.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['id_0',['id',['../classdr_1_1sp_1_1id.html',1,'dr::sp']]], + ['index_1',['index',['../classdr_1_1index.html',1,'dr']]], + ['index_3c_20i_20_3e_2',['index< I >',['../classdr_1_1index.html',1,'dr']]], + ['index_3c_20std_3a_3aint64_5ft_20_3e_3',['index< std::int64_t >',['../classdr_1_1index.html',1,'dr']]], + ['index_3c_20std_3a_3asize_5ft_20_3e_4',['index< std::size_t >',['../classdr_1_1index.html',1,'dr']]], + ['index_5fgroup_5',['index_group',['../classdr_1_1mp_1_1index__group.html',1,'dr::mp']]], + ['iota_5ffn_5f_6',['iota_fn_',['../structdr_1_1views_1_1iota__fn__.html',1,'dr::views']]], + ['is_5fdrop_5fview_7',['is_drop_view',['../structdr_1_1is__drop__view.html',1,'dr']]], + ['is_5fdrop_5fview_3c_20rng_3a_3adrop_5fview_3c_20t_20_3e_20_3e_8',['is_drop_view< rng::drop_view< T > >',['../structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4.html',1,'dr']]], + ['is_5fiota_5fview_9',['is_iota_view',['../structdr_1_1is__iota__view.html',1,'dr']]], + ['is_5fiota_5fview_3c_20rng_3a_3aiota_5fview_3c_20w_20_3e_20_3e_10',['is_iota_view< rng::iota_view< W > >',['../structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4.html',1,'dr']]], + ['is_5fowning_5fview_11',['is_owning_view',['../structdr_1_1is__owning__view.html',1,'dr']]], + ['is_5fref_5fview_12',['is_ref_view',['../structdr_1_1is__ref__view.html',1,'dr']]], + ['is_5fref_5fview_3c_20rng_3a_3aref_5fview_3c_20r_20_3e_20_3e_13',['is_ref_view< rng::ref_view< R > >',['../structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4.html',1,'dr']]], + ['is_5fsliding_5fview_14',['is_sliding_view',['../structdr_1_1is__sliding__view.html',1,'dr']]], + ['is_5fsliding_5fview_3c_20rng_3a_3asliding_5fview_3c_20t_20_3e_20_3e_15',['is_sliding_view< rng::sliding_view< T > >',['../structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4.html',1,'dr']]], + ['is_5fsubrange_5fview_16',['is_subrange_view',['../structdr_1_1is__subrange__view.html',1,'dr']]], + ['is_5fsubrange_5fview_3c_20rng_3a_3asubrange_3c_20t_20_3e_20_3e_17',['is_subrange_view< rng::subrange< T > >',['../structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4.html',1,'dr']]], + ['is_5ftake_5fview_18',['is_take_view',['../structdr_1_1is__take__view.html',1,'dr']]], + ['is_5ftake_5fview_3c_20rng_3a_3atake_5fview_3c_20t_20_3e_20_3e_19',['is_take_view< rng::take_view< T > >',['../structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4.html',1,'dr']]], + ['is_5fzip_5fview_20',['is_zip_view',['../structdr_1_1is__zip__view.html',1,'dr']]], + ['is_5fzip_5fview_3c_20rng_3a_3azip_5fview_3c_20views_2e_2e_2e_20_3e_20_3e_21',['is_zip_view< rng::zip_view< Views... > >',['../structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4.html',1,'dr']]], + ['iterator_22',['iterator',['../classdr_1_1mp_1_1distributed__vector_1_1iterator.html',1,'dr::mp::distributed_vector']]], + ['iterator_5fadaptor_23',['iterator_adaptor',['../classdr_1_1iterator__adaptor.html',1,'dr']]] +]; diff --git a/doxygen/search/classes_9.js b/doxygen/search/classes_9.js new file mode 100644 index 0000000000..6f4ccf4735 --- /dev/null +++ b/doxygen/search/classes_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['local_5ffn_5f_0',['local_fn_',['../structdr_1_1ranges_1_1____detail_1_1local__fn__.html',1,'dr::ranges::__detail']]], + ['logger_1',['logger',['../classdr_1_1logger.html',1,'dr']]] +]; diff --git a/doxygen/search/classes_a.js b/doxygen/search/classes_a.js new file mode 100644 index 0000000000..c288cfcb2b --- /dev/null +++ b/doxygen/search/classes_a.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['matrix_5fentry_0',['matrix_entry',['../classdr_1_1sp_1_1matrix__entry.html',1,'dr::sp']]], + ['matrix_5fpartition_1',['matrix_partition',['../classdr_1_1sp_1_1matrix__partition.html',1,'dr::sp']]], + ['matrix_5fref_2',['matrix_ref',['../classdr_1_1sp_1_1matrix__ref.html',1,'dr::sp']]], + ['max_5fop_3',['max_op',['../structdr_1_1mp_1_1halo__impl_1_1max__op.html',1,'dr::mp::halo_impl']]], + ['md_5fsegment_4',['md_segment',['../classdr_1_1mp_1_1____detail_1_1md__segment.html',1,'dr::mp::__detail']]], + ['mdspan_5fadapter_5fclosure_5',['mdspan_adapter_closure',['../classdr_1_1mp_1_1views_1_1mdspan__adapter__closure.html',1,'dr::mp::views']]], + ['mdspan_5ffn_5f_6',['mdspan_fn_',['../classdr_1_1mp_1_1views_1_1mdspan__fn__.html',1,'dr::mp::views']]], + ['mdspan_5fiter_5faccessor_7',['mdspan_iter_accessor',['../classdr_1_1____detail_1_1mdspan__iter__accessor.html',1,'dr::__detail']]], + ['mdspan_5fview_8',['mdspan_view',['../structdr_1_1mp_1_1mdspan__view.html',1,'dr::mp']]], + ['mdsub_5fsegment_9',['mdsub_segment',['../classdr_1_1mp_1_1____detail_1_1mdsub__segment.html',1,'dr::mp::__detail']]], + ['mdtranspose_10',['mdtranspose',['../classdr_1_1____detail_1_1mdtranspose.html',1,'dr::__detail']]], + ['min_5fop_11',['min_op',['../structdr_1_1mp_1_1halo__impl_1_1min__op.html',1,'dr::mp::halo_impl']]], + ['mpibackend_12',['MpiBackend',['../classdr_1_1mp_1_1MpiBackend.html',1,'dr::mp']]], + ['multiplies_5fop_13',['multiplies_op',['../structdr_1_1mp_1_1halo__impl_1_1multiplies__op.html',1,'dr::mp::halo_impl']]] +]; diff --git a/doxygen/search/classes_b.js b/doxygen/search/classes_b.js new file mode 100644 index 0000000000..c0669e1f27 --- /dev/null +++ b/doxygen/search/classes_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['normal_5fdistributed_5fiterator_5faccessor_0',['normal_distributed_iterator_accessor',['../classdr_1_1normal__distributed__iterator__accessor.html',1,'dr']]] +]; diff --git a/doxygen/search/classes_c.js b/doxygen/search/classes_c.js new file mode 100644 index 0000000000..a87c20ce48 --- /dev/null +++ b/doxygen/search/classes_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['owning_5fview_0',['owning_view',['../classdr_1_1____detail_1_1owning__view.html',1,'dr::__detail']]] +]; diff --git a/doxygen/search/classes_d.js b/doxygen/search/classes_d.js new file mode 100644 index 0000000000..14f6619ec6 --- /dev/null +++ b/doxygen/search/classes_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['plus_5fop_0',['plus_op',['../structdr_1_1mp_1_1halo__impl_1_1plus__op.html',1,'dr::mp::halo_impl']]] +]; diff --git a/doxygen/search/classes_e.js b/doxygen/search/classes_e.js new file mode 100644 index 0000000000..5efe31c735 --- /dev/null +++ b/doxygen/search/classes_e.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['range_5fsize_0',['range_size',['../structdr_1_1mp_1_1views_1_1____detail_1_1range__size.html',1,'dr::mp::views::__detail']]], + ['range_5fsize_3c_20r_20_3e_1',['range_size< R >',['../structdr_1_1mp_1_1views_1_1____detail_1_1range__size_3_01R_01_4.html',1,'dr::mp::views::__detail']]], + ['rebind_2',['rebind',['../structdr_1_1sp_1_1device__allocator_1_1rebind.html',1,'dr::sp::device_allocator']]], + ['remote_5fsubrange_3',['remote_subrange',['../classdr_1_1remote__subrange.html',1,'dr']]], + ['rma_5fwindow_4',['rma_window',['../classdr_1_1rma__window.html',1,'dr']]] +]; diff --git a/doxygen/search/classes_f.js b/doxygen/search/classes_f.js new file mode 100644 index 0000000000..dc0e015c67 --- /dev/null +++ b/doxygen/search/classes_f.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['second_5fop_0',['second_op',['../structdr_1_1mp_1_1halo__impl_1_1second__op.html',1,'dr::mp::halo_impl']]], + ['segment_5frange_1',['segment_range',['../classdr_1_1sp_1_1segment__range.html',1,'dr::sp']]], + ['segment_5frange_5faccessor_2',['segment_range_accessor',['../classdr_1_1sp_1_1segment__range__accessor.html',1,'dr::sp']]], + ['segmented_5fview_3',['segmented_view',['../classdr_1_1mp_1_1segmented__view.html',1,'dr::mp']]], + ['segmented_5fview_5fiterator_4',['segmented_view_iterator',['../classdr_1_1mp_1_1segmented__view__iterator.html',1,'dr::mp']]], + ['slice_5fadaptor_5fclosure_5',['slice_adaptor_closure',['../classdr_1_1sp_1_1views_1_1slice__adaptor__closure.html',1,'dr::sp::views']]], + ['sliding_5ffn_6',['sliding_fn',['../structdr_1_1mp_1_1views_1_1____detail_1_1sliding__fn.html',1,'dr::mp::views::__detail']]], + ['source_5flocation_7',['source_location',['../structnostd_1_1source__location.html',1,'nostd']]], + ['span_8',['span',['../classdr_1_1sp_1_1span.html',1,'dr::sp']]], + ['span_3c_20t_2c_20t_20_2a_20_3e_9',['span< T, T * >',['../classdr_1_1sp_1_1span.html',1,'dr::sp']]], + ['span_5fgroup_10',['span_group',['../classdr_1_1mp_1_1span__group.html',1,'dr::mp']]], + ['span_5fhalo_11',['span_halo',['../classdr_1_1mp_1_1span__halo.html',1,'dr::mp']]], + ['sparse_5fmatrix_12',['sparse_matrix',['../classdr_1_1sp_1_1sparse__matrix.html',1,'dr::sp']]], + ['submdspan_5fadapter_5fclosure_13',['submdspan_adapter_closure',['../classdr_1_1mp_1_1views_1_1submdspan__adapter__closure.html',1,'dr::mp::views']]], + ['submdspan_5ffn_5f_14',['submdspan_fn_',['../classdr_1_1mp_1_1views_1_1submdspan__fn__.html',1,'dr::mp::views']]], + ['submdspan_5fview_15',['submdspan_view',['../structdr_1_1mp_1_1submdspan__view.html',1,'dr::mp']]], + ['subrange_16',['subrange',['../classdr_1_1mp_1_1subrange.html',1,'dr::mp']]], + ['subrange_5fiterator_17',['subrange_iterator',['../classdr_1_1mp_1_1subrange__iterator.html',1,'dr::mp']]] +]; diff --git a/doxygen/search/close.svg b/doxygen/search/close.svg new file mode 100644 index 0000000000..a933eea1a2 --- /dev/null +++ b/doxygen/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doxygen/search/concepts_0.js b/doxygen/search/concepts_0.js new file mode 100644 index 0000000000..8a6a31af1c --- /dev/null +++ b/doxygen/search/concepts_0.js @@ -0,0 +1,38 @@ +var searchData= +[ + ['distributed_5fcontiguous_5fiterator_0',['distributed_contiguous_iterator',['../conceptdr_1_1distributed__contiguous__iterator.html',1,'dr']]], + ['distributed_5fcontiguous_5frange_1',['distributed_contiguous_range',['../conceptdr_1_1distributed__contiguous__range.html',1,'dr']]], + ['distributed_5fiterator_2',['distributed_iterator',['../conceptdr_1_1distributed__iterator.html',1,'dr']]], + ['distributed_5fmdspan_5frange_3',['distributed_mdspan_range',['../conceptdr_1_1distributed__mdspan__range.html',1,'dr']]], + ['distributed_5frange_4',['distributed_range',['../conceptdr_1_1distributed__range.html',1,'dr']]], + ['has_5fhalo_5fmethod_5',['has_halo_method',['../conceptdr_1_1mp_1_1has__halo__method.html',1,'dr::mp']]], + ['has_5flocal_6',['has_local',['../conceptdr_1_1ranges_1_1____detail_1_1has__local.html',1,'dr::ranges::__detail']]], + ['has_5flocal_5fadl_7',['has_local_adl',['../conceptdr_1_1ranges_1_1_0d14_1_1has__local__adl.html',1,'dr::ranges::@14']]], + ['has_5frank_5fadl_8',['has_rank_adl',['../conceptdr_1_1ranges_1_1_0d14_1_1has__rank__adl.html',1,'dr::ranges::@14']]], + ['has_5frank_5fmethod_9',['has_rank_method',['../conceptdr_1_1ranges_1_1_0d14_1_1has__rank__method.html',1,'dr::ranges::@14']]], + ['has_5fsegments_10',['has_segments',['../conceptdr_1_1mp_1_1has__segments.html',1,'dr::mp']]], + ['has_5fsegments_5fadl_11',['has_segments_adl',['../conceptdr_1_1ranges_1_1_0d14_1_1has__segments__adl.html',1,'dr::ranges::@14']]], + ['has_5fsegments_5fmethod_12',['has_segments_method',['../conceptdr_1_1_0d5_1_1has__segments__method.html',1,'dr::@5'],['../conceptdr_1_1ranges_1_1_0d14_1_1has__segments__method.html',1,'dr::ranges::@14']]], + ['is_5fdistributed_13',['is_distributed',['../conceptdr_1_1mp_1_1____detail_1_1is__distributed.html',1,'dr::mp::__detail']]], + ['is_5flocalizable_14',['is_localizable',['../conceptdr_1_1ranges_1_1_0d14_1_1is__localizable.html',1,'dr::ranges::@14']]], + ['is_5fmdspan_5fview_15',['is_mdspan_view',['../conceptdr_1_1mp_1_1is__mdspan__view.html',1,'dr::mp']]], + ['is_5fremote_5fiterator_5fshadow_5fimpl_5f_16',['is_remote_iterator_shadow_impl_',['../conceptdr_1_1ranges_1_1_0d14_1_1is__remote__iterator__shadow__impl__.html',1,'dr::ranges::@14']]], + ['is_5fsyclmemcopyable_17',['is_syclmemcopyable',['../conceptdr_1_1sp_1_1____detail_1_1is__syclmemcopyable.html',1,'dr::sp::__detail']]], + ['iter_5fhas_5flocal_5fmethod_18',['iter_has_local_method',['../conceptdr_1_1ranges_1_1_0d14_1_1iter__has__local__method.html',1,'dr::ranges::@14']]], + ['mdarray_5flike_19',['mdarray_like',['../conceptdr_1_1____detail_1_1mdarray__like.html',1,'dr::__detail']]], + ['mdspan_5flike_20',['mdspan_like',['../conceptdr_1_1____detail_1_1mdspan__like.html',1,'dr::__detail']]], + ['no_5fsegments_21',['no_segments',['../conceptdr_1_1mp_1_1no__segments.html',1,'dr::mp']]], + ['one_5fargument_22',['one_argument',['../conceptdr_1_1mp_1_1____detail_1_1one__argument.html',1,'dr::mp::__detail']]], + ['remote_5fcontiguous_5fiterator_23',['remote_contiguous_iterator',['../conceptdr_1_1remote__contiguous__iterator.html',1,'dr']]], + ['remote_5fcontiguous_5frange_24',['remote_contiguous_range',['../conceptdr_1_1remote__contiguous__range.html',1,'dr']]], + ['remote_5fiterator_25',['remote_iterator',['../conceptdr_1_1remote__iterator.html',1,'dr']]], + ['remote_5frange_26',['remote_range',['../conceptdr_1_1remote__range.html',1,'dr']]], + ['remote_5frange_5fshadow_5fimpl_5f_27',['remote_range_shadow_impl_',['../conceptdr_1_1ranges_1_1_0d14_1_1remote__range__shadow__impl__.html',1,'dr::ranges::@14']]], + ['segment_5fhas_5flocal_5fmethod_28',['segment_has_local_method',['../conceptdr_1_1ranges_1_1_0d14_1_1segment__has__local__method.html',1,'dr::ranges::@14']]], + ['segments_5frange_29',['segments_range',['../conceptdr_1_1ranges_1_1_0d14_1_1segments__range.html',1,'dr::ranges::@14']]], + ['sycl_5fdevice_5fselector_30',['sycl_device_selector',['../conceptdr_1_1sp_1_1____detail_1_1sycl__device__selector.html',1,'dr::sp::__detail']]], + ['tupleelementgettable_31',['TupleElementGettable',['../conceptdr_1_1_0d4_1_1TupleElementGettable.html',1,'dr::@4']]], + ['tuplelike_32',['TupleLike',['../conceptdr_1_1TupleLike.html',1,'dr']]], + ['two_5farguments_33',['two_arguments',['../conceptdr_1_1mp_1_1____detail_1_1two__arguments.html',1,'dr::mp::__detail']]], + ['zipable_34',['zipable',['../conceptdr_1_1mp_1_1____detail_1_1zipable.html',1,'dr::mp::__detail']]] +]; diff --git a/doxygen/search/functions_0.js b/doxygen/search/functions_0.js new file mode 100644 index 0000000000..f9e012ea7b --- /dev/null +++ b/doxygen/search/functions_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['begin_0',['begin',['../classdr_1_1mp_1_1distributed__vector.html#a7d99e72c2d282903d8d3c8c10a72d347',1,'dr::mp::distributed_vector']]] +]; diff --git a/doxygen/search/functions_1.js b/doxygen/search/functions_1.js new file mode 100644 index 0000000000..f9db84d3bf --- /dev/null +++ b/doxygen/search/functions_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['distributed_5fvector_0',['distributed_vector',['../classdr_1_1mp_1_1distributed__vector.html#ab92ce20fbb29588e0f68e073fecbfff8',1,'dr::mp::distributed_vector::distributed_vector(std::size_t size=0, distribution dist=distribution())'],['../classdr_1_1mp_1_1distributed__vector.html#a3b5aa7f2ec47c0ba482d19edd80166d7',1,'dr::mp::distributed_vector::distributed_vector(std::size_t size, value_type fill_value, distribution dist=distribution())']]] +]; diff --git a/doxygen/search/functions_2.js b/doxygen/search/functions_2.js new file mode 100644 index 0000000000..4577079043 --- /dev/null +++ b/doxygen/search/functions_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['end_0',['end',['../classdr_1_1mp_1_1distributed__vector.html#a3c00d38e1b8a9bf657fe51f53b9c1184',1,'dr::mp::distributed_vector']]], + ['exchange_5fbegin_1',['exchange_begin',['../classdr_1_1mp_1_1halo__impl.html#a494233caba6ea66bb8553bfa16e86662',1,'dr::mp::halo_impl']]], + ['exchange_5ffinalize_2',['exchange_finalize',['../classdr_1_1mp_1_1halo__impl.html#afdfab35f826a7591c82dcde73e6dee22',1,'dr::mp::halo_impl']]] +]; diff --git a/doxygen/search/functions_3.js b/doxygen/search/functions_3.js new file mode 100644 index 0000000000..c603219033 --- /dev/null +++ b/doxygen/search/functions_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['halo_5fimpl_0',['halo_impl',['../classdr_1_1mp_1_1halo__impl.html#ac2cb7a4821925599ff4405bd3c94e953',1,'dr::mp::halo_impl']]] +]; diff --git a/doxygen/search/functions_4.js b/doxygen/search/functions_4.js new file mode 100644 index 0000000000..8a7d34f519 --- /dev/null +++ b/doxygen/search/functions_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['index_5fgroup_0',['index_group',['../classdr_1_1mp_1_1index__group.html#a240920b56371d37fe7c79904faab4d23',1,'dr::mp::index_group']]] +]; diff --git a/doxygen/search/functions_5.js b/doxygen/search/functions_5.js new file mode 100644 index 0000000000..fe0cd03ac3 --- /dev/null +++ b/doxygen/search/functions_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['operator_5b_5d_0',['operator[]',['../classdr_1_1mp_1_1distributed__vector.html#a2ab3fddcdfedddc8258740f0b1eaa126',1,'dr::mp::distributed_vector']]] +]; diff --git a/doxygen/search/functions_6.js b/doxygen/search/functions_6.js new file mode 100644 index 0000000000..ca6e7059c3 --- /dev/null +++ b/doxygen/search/functions_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['reduce_5fbegin_0',['reduce_begin',['../classdr_1_1mp_1_1halo__impl.html#a3b2c11e0a016c768c65baf063f7ed8b5',1,'dr::mp::halo_impl']]], + ['reduce_5ffinalize_1',['reduce_finalize',['../classdr_1_1mp_1_1halo__impl.html#a16abfcd5cdbcfed8c8b81b19a77d4223',1,'dr::mp::halo_impl::reduce_finalize(const auto &op)'],['../classdr_1_1mp_1_1halo__impl.html#a3e5cec61ea29da0b960b906f686cea9a',1,'dr::mp::halo_impl::reduce_finalize()']]] +]; diff --git a/doxygen/search/functions_7.js b/doxygen/search/functions_7.js new file mode 100644 index 0000000000..92c0790ba9 --- /dev/null +++ b/doxygen/search/functions_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['size_0',['size',['../classdr_1_1mp_1_1distributed__vector.html#a080457af224429dbae0ccf586e2da206',1,'dr::mp::distributed_vector']]] +]; diff --git a/doxygen/search/functions_8.js b/doxygen/search/functions_8.js new file mode 100644 index 0000000000..5f2b0f9a0c --- /dev/null +++ b/doxygen/search/functions_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['unstructured_5fhalo_0',['unstructured_halo',['../classdr_1_1mp_1_1unstructured__halo.html#a34175a58141ffb9b5d97f6f7d4e68469',1,'dr::mp::unstructured_halo']]] +]; diff --git a/doxygen/search/mag.svg b/doxygen/search/mag.svg new file mode 100644 index 0000000000..9f46b301eb --- /dev/null +++ b/doxygen/search/mag.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/doxygen/search/mag_d.svg b/doxygen/search/mag_d.svg new file mode 100644 index 0000000000..b9a814c78d --- /dev/null +++ b/doxygen/search/mag_d.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/doxygen/search/mag_sel.svg b/doxygen/search/mag_sel.svg new file mode 100644 index 0000000000..03626f64a0 --- /dev/null +++ b/doxygen/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doxygen/search/mag_seld.svg b/doxygen/search/mag_seld.svg new file mode 100644 index 0000000000..6e720dcc91 --- /dev/null +++ b/doxygen/search/mag_seld.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doxygen/search/search.css b/doxygen/search/search.css new file mode 100644 index 0000000000..19f76f9d5b --- /dev/null +++ b/doxygen/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doxygen/search/search.js b/doxygen/search/search.js new file mode 100644 index 0000000000..e103a26217 --- /dev/null +++ b/doxygen/search/search.js @@ -0,0 +1,816 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + searchResults.Search(searchValue); + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/containers/segment.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    segment.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7namespace dr::mp {
    +
    8
    +
    9template <typename DV> class dv_segment_iterator;
    +
    10
    +
    11template <typename DV> class dv_segment_reference {
    + +
    13
    +
    14public:
    +
    15 using value_type = typename DV::value_type;
    +
    16
    +
    17 dv_segment_reference(const iterator it) : iterator_(it) {}
    +
    18
    +
    19 operator value_type() const { return iterator_.get(); }
    +
    20 auto operator=(const value_type &value) const {
    +
    21 iterator_.put(value);
    +
    22 return *this;
    +
    23 }
    +
    24 auto operator=(const dv_segment_reference &other) const {
    +
    25 *this = value_type(other);
    +
    26 return *this;
    +
    27 }
    +
    28 auto operator&() const { return iterator_; }
    +
    29
    +
    30private:
    +
    31 const iterator iterator_;
    +
    32}; // dv_segment_reference
    +
    33
    +
    34template <typename DV> class dv_segment_iterator {
    +
    35public:
    +
    36 using value_type = typename DV::value_type;
    +
    37 using size_type = typename DV::size_type;
    +
    38 using difference_type = typename DV::difference_type;
    +
    39
    +
    40 dv_segment_iterator() = default;
    +
    41 dv_segment_iterator(DV *dv, std::size_t segment_index, std::size_t index) {
    +
    42 dv_ = dv;
    +
    43 segment_index_ = segment_index;
    +
    44 index_ = index;
    +
    45 }
    +
    46
    +
    47 auto operator<=>(const dv_segment_iterator &other) const noexcept {
    +
    48 // assertion below checks against compare dereferenceable iterator to a
    +
    49 // singular iterator and against attempt to compare iterators from different
    +
    50 // sequences like _Safe_iterator<gnu_cxx::normal_iterator> does
    +
    51 assert(dv_ == other.dv_);
    +
    52 return segment_index_ == other.segment_index_
    +
    53 ? index_ <=> other.index_
    +
    54 : segment_index_ <=> other.segment_index_;
    +
    55 }
    +
    56
    +
    57 // Comparison
    +
    58 bool operator==(const dv_segment_iterator &other) const noexcept {
    +
    59 return (*this <=> other) == 0;
    +
    60 }
    +
    61
    +
    62 // Only this arithmetic manipulate internal state
    +
    63 auto &operator+=(difference_type n) {
    +
    64 assert(dv_ != nullptr);
    +
    65 assert(n >= 0 || static_cast<difference_type>(index_) >= -n);
    +
    66 index_ += n;
    +
    67 return *this;
    +
    68 }
    +
    69
    +
    70 auto &operator-=(difference_type n) { return *this += (-n); }
    +
    71
    +
    72 difference_type operator-(const dv_segment_iterator &other) const noexcept {
    +
    73 assert(dv_ != nullptr && dv_ == other.dv_);
    +
    74 assert(index_ >= other.index_);
    +
    75 return index_ - other.index_;
    +
    76 }
    +
    77
    +
    78 // prefix
    +
    79 auto &operator++() {
    +
    80 *this += 1;
    +
    81 return *this;
    +
    82 }
    +
    83 auto &operator--() {
    +
    84 *this -= 1;
    +
    85 return *this;
    +
    86 }
    +
    87
    +
    88 // postfix
    +
    89 auto operator++(int) {
    +
    90 auto prev = *this;
    +
    91 *this += 1;
    +
    92 return prev;
    +
    93 }
    +
    94 auto operator--(int) {
    +
    95 auto prev = *this;
    +
    96 *this -= 1;
    +
    97 return prev;
    +
    98 }
    +
    99
    +
    100 auto operator+(difference_type n) const {
    +
    101 auto p = *this;
    +
    102 p += n;
    +
    103 return p;
    +
    104 }
    +
    105 auto operator-(difference_type n) const {
    +
    106 auto p = *this;
    +
    107 p -= n;
    +
    108 return p;
    +
    109 }
    +
    110
    +
    111 // When *this is not first in the expression
    +
    112 friend auto operator+(difference_type n, const dv_segment_iterator &other) {
    +
    113 return other + n;
    +
    114 }
    +
    115
    +
    116 // dereference
    +
    117 auto operator*() const {
    +
    118 assert(dv_ != nullptr);
    +
    119 return dv_segment_reference<DV>{*this};
    +
    120 }
    +
    121 auto operator[](difference_type n) const {
    +
    122 assert(dv_ != nullptr);
    +
    123 return *(*this + n);
    +
    124 }
    +
    125
    +
    126 void get(value_type *dst, std::size_t size) const {
    +
    127 assert(dv_ != nullptr);
    +
    128 assert(segment_index_ * dv_->segment_size_ + index_ < dv_->size());
    +
    129 auto segment_offset = index_ + dv_->distribution_.halo().prev;
    +
    130 dv_->backend.getmem(dst, segment_offset * sizeof(value_type),
    +
    131 size * sizeof(value_type), segment_index_);
    +
    132 }
    +
    133
    +
    134 value_type get() const {
    +
    135 value_type val;
    +
    136 get(&val, 1);
    +
    137 return val;
    +
    138 }
    +
    139
    +
    140 void put(const value_type *dst, std::size_t size) const {
    +
    141 assert(dv_ != nullptr);
    +
    142 assert(segment_index_ * dv_->segment_size_ + index_ < dv_->size());
    +
    143 auto segment_offset = index_ + dv_->distribution_.halo().prev;
    +
    144 dr::drlog.debug("dv put:: ({}:{}:{})\n", segment_index_, segment_offset,
    +
    145 size);
    +
    146 dv_->backend.putmem(dst, segment_offset * sizeof(value_type),
    +
    147 size * sizeof(value_type), segment_index_);
    +
    148 }
    +
    149
    +
    150 void put(const value_type &value) const { put(&value, 1); }
    +
    151
    +
    152 auto rank() const {
    +
    153 assert(dv_ != nullptr);
    +
    154 return segment_index_;
    +
    155 }
    +
    156
    +
    157 auto local() const {
    +
    158#ifndef SYCL_LANGUAGE_VERSION
    +
    159 assert(dv_ != nullptr);
    +
    160#endif
    +
    161 const auto my_process_segment_index = dv_->backend.getrank();
    +
    162
    +
    163 if (my_process_segment_index == segment_index_)
    +
    164 return dv_->data_ + index_ + dv_->distribution_.halo().prev;
    +
    165#ifndef SYCL_LANGUAGE_VERSION
    +
    166 assert(!dv_->distribution_.halo().periodic); // not implemented
    +
    167#endif
    +
    168 // sliding view needs local iterators that point to the halo
    +
    169 if (my_process_segment_index + 1 == segment_index_) {
    +
    170#ifndef SYCL_LANGUAGE_VERSION
    +
    171 assert(index_ <= dv_->distribution_.halo()
    +
    172 .next); // <= instead of < to cover end() case
    +
    173#endif
    +
    174 return dv_->data_ + dv_->distribution_.halo().prev + index_ +
    +
    175 dv_->segment_size_;
    +
    176 }
    +
    177
    +
    178 if (my_process_segment_index == segment_index_ + 1) {
    +
    179#ifndef SYCL_LANGUAGE_VERSION
    +
    180 assert(dv_->segment_size_ - index_ <= dv_->distribution_.halo().prev);
    +
    181#endif
    +
    182 return dv_->data_ + dv_->distribution_.halo().prev + index_ -
    +
    183 dv_->segment_size_;
    +
    184 }
    +
    185
    +
    186#ifndef SYCL_LANGUAGE_VERSION
    +
    187 assert(false); // trying to read non-owned memory
    +
    188#endif
    +
    189 return static_cast<decltype(dv_->data_)>(nullptr);
    +
    190 }
    +
    191
    +
    192 auto segments() const {
    +
    193 assert(dv_ != nullptr);
    +
    194 return dr::__detail::drop_segments(dv_->segments(), segment_index_, index_);
    +
    195 }
    +
    196
    +
    197 auto &halo() const {
    +
    198 assert(dv_ != nullptr);
    +
    199 return dv_->halo();
    +
    200 }
    +
    201 auto halo_bounds() const {
    +
    202 assert(dv_ != nullptr);
    +
    203 return dv_->distribution_.halo();
    +
    204 }
    +
    205
    +
    206private:
    +
    207 // all fields need to be initialized by default ctor so every default
    +
    208 // constructed iter is equal to any other default constructed iter
    +
    209 DV *dv_ = nullptr;
    +
    210 std::size_t segment_index_ = 0;
    +
    211 std::size_t index_ = 0;
    +
    212}; // dv_segment_iterator
    +
    213
    +
    214template <typename DV> class dv_segment {
    +
    215private:
    + +
    217
    +
    218public:
    +
    219 using difference_type = std::ptrdiff_t;
    +
    220 dv_segment() = default;
    +
    221 dv_segment(DV *dv, std::size_t segment_index, std::size_t size,
    +
    222 std::size_t reserved) {
    +
    223 dv_ = dv;
    +
    224 segment_index_ = segment_index;
    +
    225 size_ = size;
    +
    226 reserved_ = reserved;
    +
    227 assert(dv_ != nullptr);
    +
    228 }
    +
    229
    +
    230 auto size() const {
    +
    231 assert(dv_ != nullptr);
    +
    232 return size_;
    +
    233 }
    +
    234
    +
    235 auto begin() const { return iterator(dv_, segment_index_, 0); }
    +
    236 auto end() const { return begin() + size(); }
    +
    237 auto reserved() const { return reserved_; }
    +
    238
    +
    239 auto operator[](difference_type n) const { return *(begin() + n); }
    +
    240
    +
    241 bool is_local() const { return segment_index_ == default_comm().rank(); }
    +
    242
    +
    243private:
    +
    244 DV *dv_ = nullptr;
    +
    245 std::size_t segment_index_;
    +
    246 std::size_t size_;
    +
    247 std::size_t reserved_;
    +
    248}; // dv_segment
    +
    249
    +
    250//
    +
    251// Many views preserve the distributed_vector segments iterator, which
    +
    252// can supply halo
    +
    253//
    +
    254template <typename DR>
    +
    255concept has_halo_method = dr::distributed_range<DR> && requires(DR &&dr) {
    +
    256 { rng::begin(dr::ranges::segments(dr)[0]).halo() };
    +
    257};
    +
    258
    +
    259auto &halo(has_halo_method auto &&dr) {
    +
    260 return rng::begin(dr::ranges::segments(dr)[0]).halo();
    +
    261}
    +
    262
    +
    263} // namespace dr::mp
    +
    Definition: index.hpp:34
    +
    Definition: segment.hpp:34
    +
    Definition: segment.hpp:11
    +
    Definition: segment.hpp:214
    +
    Definition: concepts.hpp:20
    +
    Definition: segment.hpp:255
    +
    Definition: halo.hpp:362
    +
    + + + + diff --git a/doxygen/segmented_8hpp_source.html b/doxygen/segmented_8hpp_source.html new file mode 100644 index 0000000000..c0ecd57f43 --- /dev/null +++ b/doxygen/segmented_8hpp_source.html @@ -0,0 +1,182 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views/segmented.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    segmented.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/detail/remote_subrange.hpp>
    +
    8
    +
    9namespace dr::mp {
    +
    10
    +
    11template <typename BaseIter, typename SegTplIter, typename SegTplSentinel>
    + +
    13public:
    +
    14 using iterator_category = std::forward_iterator_tag;
    +
    15 using difference_type = rng::iter_difference_t<SegTplIter>;
    + +
    17
    + +
    19 segmented_view_iterator(BaseIter base_begin, SegTplIter tpl_begin,
    +
    20 SegTplSentinel tpl_end)
    +
    21 : base_cur_(base_begin), tpl_cur_(tpl_begin), tpl_end_(tpl_end) {}
    +
    22
    +
    23 auto operator==(segmented_view_iterator other) const {
    +
    24 return tpl_cur_ == other.tpl_cur_;
    +
    25 }
    +
    26 auto &operator++() {
    +
    27 base_cur_ += rng::size(*tpl_cur_);
    +
    28 tpl_cur_++;
    +
    29 return *this;
    +
    30 }
    +
    31 auto operator++(int) {
    +
    32 auto iter(*this);
    +
    33 base_cur_ += rng::size(*tpl_cur_);
    +
    34 tpl_cur_++;
    +
    35 return iter;
    +
    36 }
    +
    37 auto operator*() const {
    +
    38 return dr::remote_subrange(base_cur_, base_cur_ + rng::size(*tpl_cur_),
    +
    39 dr::ranges::rank(*tpl_cur_));
    +
    40 }
    +
    41
    +
    42private:
    +
    43 BaseIter base_cur_;
    +
    44 SegTplIter tpl_cur_;
    +
    45 SegTplSentinel tpl_end_;
    +
    46};
    +
    47
    +
    48//
    +
    49// Some distributed algorithms need an iota_view as an operand. An
    +
    50// iota_view does not depend on external data and can be segmented as
    +
    51// needed. The segmented_view creates segments for a range using the
    +
    52// segments of another range. It can be used to create segments for an
    +
    53// iota_view, using the segments of a distributed_range.
    +
    54//
    +
    55// It should be usable if you have a range that is local and
    +
    56// replicated across all processes, but that is not tested.
    +
    57//
    +
    58template <rng::random_access_range R, rng::common_range SegTpl>
    +
    59class segmented_view : public rng::view_interface<segmented_view<R, SegTpl>> {
    +
    60public:
    +
    61 template <typename V1, typename V2>
    +
    62 segmented_view(V1 &&r, V2 &&tpl)
    +
    63 : base_(rng::views::all(std::forward<V1>(r))),
    +
    64 segments_tpl_(rng::views::all(std::forward<V2>(tpl))) {}
    +
    65
    +
    66 auto begin() const {
    +
    67 return segmented_view_iterator(rng::begin(base_), rng::begin(segments_tpl_),
    +
    68 rng::end(segments_tpl_));
    +
    69 }
    +
    70 auto end() const {
    +
    71 return segmented_view_iterator(rng::begin(base_), rng::end(segments_tpl_),
    +
    72 rng::end(segments_tpl_));
    +
    73 }
    +
    74
    +
    75 auto size() const { return rng::size(segments_tpl_); }
    +
    76
    +
    77private:
    +
    78 rng::views::all_t<R> base_;
    +
    79 rng::views::all_t<SegTpl> segments_tpl_;
    +
    80};
    +
    81
    +
    82template <typename R, typename Seg>
    +
    83segmented_view(R &&r, Seg &&seg)
    +
    84 -> segmented_view<rng::views::all_t<R>, rng::views::all_t<Seg>>;
    +
    85
    +
    86namespace views {
    +
    87
    +
    89template <typename R, typename Seg> auto segmented(R &&r, Seg &&seg) {
    +
    90 return segmented_view(std::forward<R>(r), std::forward<Seg>(seg));
    +
    91}
    +
    92
    +
    93} // namespace views
    +
    94
    +
    95} // namespace dr::mp
    +
    Definition: segmented.hpp:12
    +
    Definition: segmented.hpp:59
    +
    Definition: remote_subrange.hpp:15
    +
    + + + + diff --git a/doxygen/segments__tools_8hpp_source.html b/doxygen/segments__tools_8hpp_source.html new file mode 100644 index 0000000000..50f0258091 --- /dev/null +++ b/doxygen/segments__tools_8hpp_source.html @@ -0,0 +1,228 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/segments_tools.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    segments_tools.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/concepts/concepts.hpp>
    +
    8#include <dr/detail/enumerate.hpp>
    +
    9#include <dr/detail/ranges_shim.hpp>
    +
    10#include <dr/detail/remote_subrange.hpp>
    +
    11#include <dr/detail/view_detectors.hpp>
    +
    12
    +
    13namespace dr {
    +
    14
    +
    15namespace __detail {
    +
    16
    +
    17// Take all elements up to and including segment `segment_id` at index
    +
    18// `local_id`
    +
    19template <typename R>
    +
    20auto take_segments(R &&segments, std::size_t last_seg, std::size_t local_id) {
    +
    21 auto remainder = local_id;
    +
    22
    +
    23 auto take_partial = [=](auto &&v) {
    +
    24 auto &&[i, segment] = v;
    +
    25 if (i == last_seg) {
    +
    26 auto first = rng::begin(segment);
    +
    27 auto last = rng::begin(segment);
    +
    28 rng::advance(last, remainder);
    +
    29 return dr::remote_subrange(first, last, dr::ranges::rank(segment));
    +
    30 } else {
    +
    31 return dr::remote_subrange(segment);
    +
    32 }
    +
    33 };
    +
    34
    +
    35 return enumerate(segments) | rng::views::take(last_seg + 1) |
    +
    36 rng::views::transform(std::move(take_partial));
    +
    37}
    +
    38
    +
    39// Take the first n elements
    +
    40template <typename R> auto take_segments(R &&segments, std::size_t n) {
    +
    41 std::size_t last_seg = 0;
    +
    42 std::size_t remainder = n;
    +
    43
    +
    44 for (auto &&seg : segments) {
    +
    45 if (seg.size() >= remainder) {
    +
    46 break;
    +
    47 }
    +
    48 remainder -= seg.size();
    +
    49 last_seg++;
    +
    50 }
    +
    51
    +
    52 return take_segments(std::forward<R>(segments), last_seg, remainder);
    +
    53}
    +
    54
    +
    55// Drop all elements up to segment `segment_id` and index `local_id`
    +
    56template <typename R>
    +
    57auto drop_segments(R &&segments, std::size_t first_seg, std::size_t local_id) {
    +
    58 auto remainder = local_id;
    +
    59
    +
    60 auto drop_partial = [=](auto &&v) {
    +
    61 auto &&[i, segment] = v;
    +
    62 if (i == first_seg) {
    +
    63 auto first = rng::begin(segment);
    +
    64 rng::advance(first, remainder);
    +
    65 auto last = rng::end(segment);
    +
    66 return dr::remote_subrange(first, last, dr::ranges::rank(segment));
    +
    67 } else {
    +
    68 return dr::remote_subrange(segment);
    +
    69 }
    +
    70 };
    +
    71
    +
    72 return enumerate(segments) | rng::views::drop(first_seg) |
    +
    73 rng::views::transform(std::move(drop_partial));
    +
    74}
    +
    75
    +
    76// Drop the first n elements
    +
    77template <typename R> auto drop_segments(R &&segments, std::size_t n) {
    +
    78 std::size_t first_seg = 0;
    +
    79 std::size_t remainder = n;
    +
    80
    +
    81 for (auto &&seg : segments) {
    +
    82 if (seg.size() > remainder) {
    +
    83 break;
    +
    84 }
    +
    85 remainder -= seg.size();
    +
    86 first_seg++;
    +
    87 }
    +
    88
    +
    89 return drop_segments(std::forward<R>(segments), first_seg, remainder);
    +
    90}
    +
    91
    +
    92} // namespace __detail
    +
    93
    +
    94} // namespace dr
    +
    95
    +
    96namespace DR_RANGES_NAMESPACE {
    +
    97
    +
    98// A standard library range adaptor does not change the rank of a
    +
    99// remote range, so we can simply return the rank of the base view.
    +
    100template <rng::range V>
    + +
    102auto rank_(V &&v) {
    +
    103 return dr::ranges::rank(std::forward<V>(v).base());
    +
    104}
    +
    105
    +
    106template <rng::range V>
    +
    107 requires(dr::is_ref_view_v<std::remove_cvref_t<V>> &&
    + +
    109auto segments_(V &&v) {
    +
    110 return dr::ranges::segments(v.base());
    +
    111}
    +
    112
    +
    113template <rng::range V>
    +
    114 requires(dr::is_take_view_v<std::remove_cvref_t<V>> &&
    + +
    116auto segments_(V &&v) {
    +
    117 return dr::__detail::take_segments(dr::ranges::segments(v.base()), v.size());
    +
    118}
    +
    119
    +
    120template <rng::range V>
    +
    121 requires(dr::is_drop_view_v<std::remove_cvref_t<V>> &&
    + +
    123auto segments_(V &&v) {
    +
    124 return dr::__detail::drop_segments(dr::ranges::segments(v.base()),
    +
    125 v.base().size() - v.size());
    +
    126}
    +
    127
    +
    128template <rng::range V>
    +
    129 requires(dr::is_subrange_view_v<std::remove_cvref_t<V>> &&
    + +
    131auto segments_(V &&v) {
    +
    132 auto first = rng::begin(v);
    +
    133 auto last = rng::end(v);
    +
    134 auto size = rng::distance(first, last);
    +
    135
    +
    136 return dr::__detail::take_segments(dr::ranges::segments(first), size);
    +
    137}
    +
    138
    +
    139} // namespace DR_RANGES_NAMESPACE
    +
    Definition: remote_subrange.hpp:15
    +
    Definition: concepts.hpp:31
    +
    Definition: concepts.hpp:20
    +
    Definition: concepts.hpp:16
    +
    + + + + diff --git a/doxygen/sliding_8hpp_source.html b/doxygen/sliding_8hpp_source.html new file mode 100644 index 0000000000..01c2af65ff --- /dev/null +++ b/doxygen/sliding_8hpp_source.html @@ -0,0 +1,148 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views/sliding.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    sliding.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/detail/ranges.hpp>
    +
    8#include <dr/detail/segments_tools.hpp>
    +
    9#include <dr/mp/views/segmented.hpp>
    +
    10
    +
    11namespace dr::mp {
    +
    12namespace views {
    +
    13namespace __detail {
    +
    14
    +
    15struct sliding_fn {
    +
    16
    +
    17 // one can not use local algorithms if n is not equal to halo_bounds.prev + 1
    +
    18 // + halo_bounds.next
    +
    19 template <typename Rng, typename Int>
    +
    20 requires rng::viewable_range<Rng> && rng::forward_range<Rng> &&
    +
    21 rng::detail::integer_like_<Int>
    +
    22 auto operator()(Rng &&r, Int n) const {
    +
    23 return rng::views::sliding(static_cast<Rng &&>(r), n);
    +
    24 }
    +
    25};
    +
    26
    +
    27} // namespace __detail
    +
    28
    +
    29inline constexpr __detail::sliding_fn sliding{};
    +
    30
    +
    31} // namespace views
    +
    32} // namespace dr::mp
    +
    33
    +
    34namespace DR_RANGES_NAMESPACE {
    +
    35
    +
    36template <rng::range V>
    +
    37 requires(dr::is_sliding_view_v<V>)
    +
    38auto segments_(V &&v) {
    +
    39
    +
    40 auto base_segments = dr::ranges::segments(v.base());
    +
    41 auto elements_to_skip_in_base = rng::size(v.base());
    +
    42 auto elements_to_take = 0;
    +
    43 if (!rng::empty(v)) {
    +
    44 // need to reverse engineer `n` which was passed to sliding_view
    +
    45 elements_to_take = rng::size(v);
    +
    46 const auto slide_size = elements_to_skip_in_base - elements_to_take + 1;
    +
    47 // TODO: this code assumes that halo is symmetric, thus odd (center + 2n)
    +
    48 // note, it is not an assertion preventing all wrong use cases
    +
    49 // other ones are caught by assert during attempt to read outside halo
    +
    50 assert(slide_size % 2 == 1);
    +
    51 elements_to_skip_in_base = slide_size / 2;
    +
    52 }
    +
    53
    +
    54 return dr::mp::views::segmented(
    +
    55 v,
    +
    56 dr::__detail::take_segments(
    +
    57 dr::__detail::drop_segments(base_segments, elements_to_skip_in_base),
    +
    58 elements_to_take));
    +
    59}
    +
    60
    +
    61// TODO: add support for dr::mp::halo(dr::mp::views::sliding(r)).exchange()
    +
    62} // namespace DR_RANGES_NAMESPACE
    +
    Definition: sliding.hpp:15
    +
    + + + + diff --git a/doxygen/source__location_8hpp_source.html b/doxygen/source__location_8hpp_source.html new file mode 100644 index 0000000000..6a9bf19c43 --- /dev/null +++ b/doxygen/source__location_8hpp_source.html @@ -0,0 +1,151 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/vendor/source_location/source_location.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    source_location.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#ifndef NOSTD_SOURCE_LOCATION_HPP
    +
    6#define NOSTD_SOURCE_LOCATION_HPP
    +
    7
    +
    8#pragma once
    +
    9
    +
    10#include <cstdint>
    +
    11
    +
    12namespace nostd {
    + +
    14public:
    +
    15#if not defined(__apple_build_version__) and defined(__clang__) and \
    +
    16 (__clang_major__ >= 9)
    +
    17 static constexpr source_location
    +
    18 current(const char *fileName = __builtin_FILE(),
    +
    19 const char *functionName = __builtin_FUNCTION(),
    +
    20 const uint_least32_t lineNumber = __builtin_LINE(),
    +
    21 const uint_least32_t columnOffset = __builtin_COLUMN()) noexcept
    +
    22#elif defined(__GNUC__) and \
    +
    23 (__GNUC__ > 4 or (__GNUC__ == 4 and __GNUC_MINOR__ >= 8))
    +
    24 static constexpr source_location
    +
    25 current(const char *fileName = __builtin_FILE(),
    +
    26 const char *functionName = __builtin_FUNCTION(),
    +
    27 const uint_least32_t lineNumber = __builtin_LINE(),
    +
    28 const uint_least32_t columnOffset = 0) noexcept
    +
    29#else
    +
    30 static constexpr source_location
    +
    31 current(const char *fileName = "unsupported",
    +
    32 const char *functionName = "unsupported",
    +
    33 const uint_least32_t lineNumber = 0,
    +
    34 const uint_least32_t columnOffset = 0) noexcept
    +
    35#endif
    +
    36 {
    +
    37 return source_location(fileName, functionName, lineNumber, columnOffset);
    +
    38 }
    +
    39
    +
    40 source_location(const source_location &) = default;
    +
    41 source_location(source_location &&) = default;
    +
    42
    +
    43 constexpr const char *file_name() const noexcept { return fileName; }
    +
    44
    +
    45 constexpr const char *function_name() const noexcept { return functionName; }
    +
    46
    +
    47 constexpr uint_least32_t line() const noexcept { return lineNumber; }
    +
    48
    +
    49 constexpr std::uint_least32_t column() const noexcept { return columnOffset; }
    +
    50
    +
    51private:
    +
    52 constexpr source_location(const char *fileName, const char *functionName,
    +
    53 const uint_least32_t lineNumber,
    +
    54 const uint_least32_t columnOffset) noexcept
    +
    55 : fileName(fileName), functionName(functionName), lineNumber(lineNumber),
    +
    56 columnOffset(columnOffset) {}
    +
    57
    +
    58 const char *fileName;
    +
    59 const char *functionName;
    +
    60 const std::uint_least32_t lineNumber;
    +
    61 const std::uint_least32_t columnOffset;
    +
    62};
    +
    63} // namespace nostd
    +
    64
    +
    65#endif
    +
    Definition: source_location.hpp:13
    +
    + + + + diff --git a/doxygen/sp_2algorithms_2copy_8hpp_source.html b/doxygen/sp_2algorithms_2copy_8hpp_source.html new file mode 100644 index 0000000000..bc33514551 --- /dev/null +++ b/doxygen/sp_2algorithms_2copy_8hpp_source.html @@ -0,0 +1,314 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/copy.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    copy.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <memory>
    +
    8#include <type_traits>
    +
    9
    +
    10#include <sycl/sycl.hpp>
    +
    11
    +
    12#include <dr/concepts/concepts.hpp>
    +
    13#include <dr/detail/segments_tools.hpp>
    +
    14#include <dr/sp/detail.hpp>
    +
    15#include <dr/sp/device_ptr.hpp>
    +
    16#include <dr/sp/util.hpp>
    +
    17
    +
    18namespace dr::sp {
    +
    19
    +
    20// Copy between contiguous ranges
    +
    21template <std::contiguous_iterator InputIt, std::contiguous_iterator OutputIt>
    +
    22 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    23 std::iter_value_t<OutputIt>>
    +
    24sycl::event copy_async(InputIt first, InputIt last, OutputIt d_first) {
    +
    25 // auto &&q = dr::sp::__detail::default_queue();
    +
    26 auto &&q = __detail::get_queue_for_pointers(first, d_first);
    +
    27 return q.memcpy(std::to_address(d_first), std::to_address(first),
    +
    28 sizeof(std::iter_value_t<InputIt>) * (last - first));
    +
    29}
    +
    30
    +
    32template <std::contiguous_iterator InputIt, std::contiguous_iterator OutputIt>
    +
    33 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    34 std::iter_value_t<OutputIt>>
    +
    35OutputIt copy(InputIt first, InputIt last, OutputIt d_first) {
    +
    36 copy_async(first, last, d_first).wait();
    +
    37 return d_first + (last - first);
    +
    38}
    +
    39
    +
    40// Copy from contiguous range to device
    +
    41template <std::contiguous_iterator Iter, typename T>
    +
    42 requires __detail::is_syclmemcopyable<std::iter_value_t<Iter>, T>
    +
    43sycl::event copy_async(Iter first, Iter last, device_ptr<T> d_first) {
    +
    44 // auto &&q = dr::sp::__detail::default_queue();
    +
    45 auto &&q = __detail::get_queue_for_pointers(first, d_first);
    +
    46 return q.memcpy(d_first.get_raw_pointer(), std::to_address(first),
    +
    47 sizeof(T) * (last - first));
    +
    48}
    +
    49
    +
    50template <std::contiguous_iterator Iter, typename T>
    +
    51 requires __detail::is_syclmemcopyable<std::iter_value_t<Iter>, T>
    +
    52device_ptr<T> copy(Iter first, Iter last, device_ptr<T> d_first) {
    +
    53 copy_async(first, last, d_first).wait();
    +
    54 return d_first + (last - first);
    +
    55}
    +
    56
    +
    57// Copy from device to contiguous range
    +
    58template <typename T, std::contiguous_iterator Iter>
    +
    59 requires __detail::is_syclmemcopyable<T, std::iter_value_t<Iter>>
    +
    60sycl::event copy_async(device_ptr<T> first, device_ptr<T> last, Iter d_first) {
    +
    61 // auto &&q = dr::sp::__detail::default_queue();
    +
    62 auto &&q = __detail::get_queue_for_pointers(first, d_first);
    +
    63 return q.memcpy(std::to_address(d_first), first.get_raw_pointer(),
    +
    64 sizeof(T) * (last - first));
    +
    65}
    +
    66
    +
    67template <typename T, std::contiguous_iterator Iter>
    +
    68 requires __detail::is_syclmemcopyable<T, std::iter_value_t<Iter>>
    +
    69Iter copy(device_ptr<T> first, device_ptr<T> last, Iter d_first) {
    +
    70 copy_async(first, last, d_first).wait();
    +
    71 return d_first + (last - first);
    +
    72}
    +
    73
    +
    74// Copy from device to device
    +
    75template <typename T>
    +
    76 requires(!std::is_const_v<T> && std::is_trivially_copyable_v<T>)
    +
    77sycl::event copy_async(device_ptr<std::add_const_t<T>> first,
    +
    78 device_ptr<std::add_const_t<T>> last,
    +
    79 device_ptr<T> d_first) {
    +
    80 // auto &&q = dr::sp::__detail::default_queue();
    +
    81 auto &&q = __detail::get_queue_for_pointers(first, d_first);
    +
    82 return q.memcpy(d_first.get_raw_pointer(), first.get_raw_pointer(),
    +
    83 sizeof(T) * (last - first));
    +
    84}
    +
    85
    +
    86template <typename T>
    +
    87 requires(!std::is_const_v<T> && std::is_trivially_copyable_v<T>)
    +
    88sycl::event copy_async(sycl::queue &q, device_ptr<std::add_const_t<T>> first,
    +
    89 device_ptr<std::add_const_t<T>> last,
    +
    90 device_ptr<T> d_first) {
    +
    91 return q.memcpy(d_first.get_raw_pointer(), first.get_raw_pointer(),
    +
    92 sizeof(T) * (last - first));
    +
    93}
    +
    94
    +
    95template <typename T>
    +
    96 requires(!std::is_const_v<T> && std::is_trivially_copyable_v<T>)
    +
    97device_ptr<T> copy(device_ptr<std::add_const_t<T>> first,
    +
    98 device_ptr<std::add_const_t<T>> last,
    +
    99 device_ptr<T> d_first) {
    +
    100 copy_async(first, last, d_first).wait();
    +
    101 return d_first + (last - first);
    +
    102}
    +
    103
    +
    104// Copy from local range to distributed range
    +
    105template <std::forward_iterator InputIt, dr::distributed_iterator OutputIt>
    +
    106 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    107 std::iter_value_t<OutputIt>>
    +
    108sycl::event copy_async(InputIt first, InputIt last, OutputIt d_first) {
    +
    109 auto &&segments = dr::ranges::segments(d_first);
    +
    110 auto segment_iter = rng::begin(segments);
    +
    111
    +
    112 std::vector<sycl::event> events;
    +
    113
    +
    114 while (first != last) {
    +
    115 auto &&segment = *segment_iter;
    +
    116 auto size = rng::distance(segment);
    +
    117
    +
    118 std::size_t n_to_copy = std::min<size_t>(size, rng::distance(first, last));
    +
    119
    +
    120 auto local_last = first;
    +
    121 rng::advance(local_last, n_to_copy);
    +
    122
    +
    123 events.emplace_back(
    +
    124 dr::sp::copy_async(first, local_last, rng::begin(segment)));
    +
    125
    +
    126 ++segment_iter;
    +
    127 rng::advance(first, n_to_copy);
    +
    128 }
    +
    129
    +
    130 return dr::sp::__detail::combine_events(events);
    +
    131}
    +
    132
    +
    133auto copy(rng::contiguous_range auto r, dr::distributed_iterator auto d_first) {
    +
    134 return copy(rng::begin(r), rng::end(r), d_first);
    +
    135}
    +
    136
    +
    137auto copy(dr::distributed_range auto r, std::contiguous_iterator auto d_first) {
    +
    138 return copy(rng::begin(r), rng::end(r), d_first);
    +
    139}
    +
    140
    +
    141template <std::forward_iterator InputIt, dr::distributed_iterator OutputIt>
    +
    142 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    143 std::iter_value_t<OutputIt>>
    +
    144OutputIt copy(InputIt first, InputIt last, OutputIt d_first) {
    +
    145 copy_async(first, last, d_first).wait();
    +
    146 return d_first + (last - first);
    +
    147}
    +
    148
    +
    149// Copy from distributed range to local range
    +
    150template <dr::distributed_iterator InputIt, std::forward_iterator OutputIt>
    +
    151 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    152 std::iter_value_t<OutputIt>>
    +
    153sycl::event copy_async(InputIt first, InputIt last, OutputIt d_first) {
    +
    154 auto dist = rng::distance(first, last);
    +
    155 auto segments =
    +
    156 dr::__detail::take_segments(dr::ranges::segments(first), dist);
    +
    157
    +
    158 std::vector<sycl::event> events;
    +
    159
    +
    160 for (auto &&segment : segments) {
    +
    161 auto size = rng::distance(segment);
    +
    162
    +
    163 events.emplace_back(
    +
    164 dr::sp::copy_async(rng::begin(segment), rng::end(segment), d_first));
    +
    165
    +
    166 rng::advance(d_first, size);
    +
    167 }
    +
    168
    +
    169 return dr::sp::__detail::combine_events(events);
    +
    170}
    +
    171
    +
    172template <dr::distributed_iterator InputIt, std::forward_iterator OutputIt>
    +
    173 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    174 std::iter_value_t<OutputIt>>
    +
    175OutputIt copy(InputIt first, InputIt last, OutputIt d_first) {
    +
    176 copy_async(first, last, d_first).wait();
    +
    177 return d_first + (last - first);
    +
    178}
    +
    179
    +
    180// Copy from distributed range to distributed range
    +
    181template <dr::distributed_iterator InputIt, dr::distributed_iterator OutputIt>
    +
    182 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    183 std::iter_value_t<OutputIt>>
    +
    184sycl::event copy_async(InputIt first, InputIt last, OutputIt d_first) {
    +
    185 auto dist = rng::distance(first, last);
    +
    186 auto segments =
    +
    187 dr::__detail::take_segments(dr::ranges::segments(first), dist);
    +
    188
    +
    189 std::vector<sycl::event> events;
    +
    190
    +
    191 for (auto &&segment : segments) {
    +
    192 auto size = rng::distance(segment);
    +
    193
    +
    194 events.emplace_back(
    +
    195 dr::sp::copy_async(rng::begin(segment), rng::end(segment), d_first));
    +
    196
    +
    197 rng::advance(d_first, size);
    +
    198 }
    +
    199
    +
    200 return dr::sp::__detail::combine_events(events);
    +
    201}
    +
    202
    +
    203template <dr::distributed_iterator InputIt, dr::distributed_iterator OutputIt>
    +
    204 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    205 std::iter_value_t<OutputIt>>
    +
    206OutputIt copy(InputIt first, InputIt last, OutputIt d_first) {
    +
    207 copy_async(first, last, d_first).wait();
    +
    208 return d_first + (last - first);
    +
    209}
    +
    210
    +
    211// Ranges versions
    +
    212
    +
    213// Distributed to distributed
    +
    214template <dr::distributed_range R, dr::distributed_iterator O>
    +
    215 requires __detail::is_syclmemcopyable<rng::range_value_t<R>,
    +
    216 std::iter_value_t<O>>
    +
    217sycl::event copy_async(R &&r, O result) {
    +
    218 return copy_async(rng::begin(r), rng::end(r), result);
    +
    219}
    +
    220
    +
    221template <dr::distributed_range R, dr::distributed_iterator O>
    +
    222 requires __detail::is_syclmemcopyable<rng::range_value_t<R>,
    +
    223 std::iter_value_t<O>>
    +
    224O copy(R &&r, O result) {
    +
    225 return copy(rng::begin(r), rng::end(r), result);
    +
    226}
    +
    227
    +
    228} // namespace dr::sp
    +
    Definition: concepts.hpp:31
    +
    Definition: concepts.hpp:20
    +
    + + + + diff --git a/doxygen/sp_2algorithms_2equal_8hpp_source.html b/doxygen/sp_2algorithms_2equal_8hpp_source.html new file mode 100644 index 0000000000..6f0a8ee52d --- /dev/null +++ b/doxygen/sp_2algorithms_2equal_8hpp_source.html @@ -0,0 +1,130 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/equal.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    equal.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/sp/algorithms/fill.hpp>
    +
    8#include <dr/sp/algorithms/reduce.hpp>
    +
    9#include <dr/sp/detail.hpp>
    +
    10#include <dr/sp/init.hpp>
    +
    11#include <dr/sp/util.hpp>
    +
    12#include <dr/sp/views/views.hpp>
    +
    13#include <dr/sp/zip_view.hpp>
    +
    14
    +
    15namespace dr::sp {
    +
    16
    +
    17template <typename ExecutionPolicy, dr::distributed_range R1,
    + +
    19 requires std::equality_comparable_with<rng::range_value_t<R1>,
    +
    20 rng::range_value_t<R2>>
    +
    21bool equal(ExecutionPolicy &&policy, R1 &&r1, R2 &&r2) {
    +
    22
    +
    23 if (rng::distance(r1) != rng::distance(r2)) {
    +
    24 return false;
    +
    25 }
    +
    26
    +
    27 // we must use ints instead of bools, because distributed ranges do not
    +
    28 // support bools
    +
    29 auto compare = [](auto &&elems) {
    +
    30 return elems.first == elems.second ? 1 : 0;
    +
    31 };
    +
    32
    +
    33 auto zipped_views = views::zip(r1, r2);
    +
    34 auto compared = sp::views::transform(zipped_views, compare);
    +
    35 auto min = [](double x, double y) { return std::min(x, y); };
    +
    36 auto result = sp::reduce(policy, compared, 1, min);
    +
    37 return result == 1;
    +
    38}
    +
    39
    +
    40template <dr::distributed_range R1, dr::distributed_range R2>
    +
    41bool equal(R1 &&r1, R2 &&r2) {
    +
    42 return equal(dr::sp::par_unseq, r1, r2);
    +
    43}
    +
    44} // namespace dr::sp
    +
    Definition: concepts.hpp:20
    +
    + + + + diff --git a/doxygen/sp_2algorithms_2exclusive__scan_8hpp_source.html b/doxygen/sp_2algorithms_2exclusive__scan_8hpp_source.html new file mode 100644 index 0000000000..647aea76bd --- /dev/null +++ b/doxygen/sp_2algorithms_2exclusive__scan_8hpp_source.html @@ -0,0 +1,315 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/exclusive_scan.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    exclusive_scan.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <sycl/sycl.hpp>
    +
    8
    +
    9#include <oneapi/dpl/execution>
    +
    10#include <oneapi/dpl/numeric>
    +
    11
    +
    12#include <oneapi/dpl/async>
    +
    13
    +
    14#include <dr/concepts/concepts.hpp>
    +
    15#include <dr/detail/onedpl_direct_iterator.hpp>
    +
    16#include <dr/sp/algorithms/execution_policy.hpp>
    +
    17#include <dr/sp/allocators.hpp>
    +
    18#include <dr/sp/detail.hpp>
    +
    19#include <dr/sp/init.hpp>
    +
    20#include <dr/sp/vector.hpp>
    +
    21#include <dr/sp/views/views.hpp>
    +
    22
    +
    23namespace dr::sp {
    +
    24
    +
    25template <typename ExecutionPolicy, dr::distributed_contiguous_range R,
    +
    26 dr::distributed_contiguous_range O, typename U, typename BinaryOp>
    +
    27void exclusive_scan_impl_(ExecutionPolicy &&policy, R &&r, O &&o, U init,
    +
    28 BinaryOp &&binary_op) {
    +
    29 using T = rng::range_value_t<O>;
    +
    30
    +
    31 static_assert(
    +
    32 std::is_same_v<std::remove_cvref_t<ExecutionPolicy>, device_policy>);
    +
    33
    +
    34 auto zipped_view = dr::sp::views::zip(r, o);
    +
    35 auto zipped_segments = zipped_view.zipped_segments();
    +
    36
    +
    37 if constexpr (std::is_same_v<std::remove_cvref_t<ExecutionPolicy>,
    +
    38 device_policy>) {
    +
    39
    +
    40 U *d_inits = sycl::malloc_device<U>(rng::size(zipped_segments),
    +
    41 sp::devices()[0], sp::context());
    +
    42
    +
    43 std::vector<sycl::event> events;
    +
    44
    +
    45 std::size_t segment_id = 0;
    +
    46 for (auto &&segs : zipped_segments) {
    +
    47 auto &&[in_segment, out_segment] = segs;
    +
    48
    +
    49 auto last_element = rng::prev(rng::end(__detail::local(in_segment)));
    +
    50 auto dest = d_inits + segment_id;
    +
    51
    +
    52 auto &&q = __detail::queue(dr::ranges::rank(in_segment));
    +
    53
    +
    54 auto e = q.single_task([=] { *dest = *last_element; });
    +
    55 events.push_back(e);
    +
    56 segment_id++;
    +
    57 }
    +
    58
    +
    59 __detail::wait(events);
    +
    60 events.clear();
    +
    61
    +
    62 std::vector<U> inits(rng::size(zipped_segments));
    +
    63
    +
    64 sp::copy(d_inits, d_inits + inits.size(), inits.data() + 1);
    +
    65
    +
    66 sycl::free(d_inits, sp::context());
    +
    67
    +
    68 inits[0] = init;
    +
    69
    +
    70 auto root = dr::sp::devices()[0];
    +
    71 dr::sp::device_allocator<T> allocator(dr::sp::context(), root);
    + +
    73 std::size_t(zipped_segments.size()), allocator);
    +
    74
    +
    75 segment_id = 0;
    +
    76 for (auto &&segs : zipped_segments) {
    +
    77 auto &&[in_segment, out_segment] = segs;
    +
    78
    +
    79 auto &&q = __detail::queue(dr::ranges::rank(in_segment));
    +
    80 auto &&local_policy = __detail::dpl_policy(dr::ranges::rank(in_segment));
    +
    81
    +
    82 auto dist = rng::distance(in_segment);
    +
    83 assert(dist > 0);
    +
    84
    +
    85 auto first = rng::begin(in_segment);
    +
    86 auto last = rng::end(in_segment);
    +
    87 auto d_first = rng::begin(out_segment);
    +
    88
    +
    89 auto init = inits[segment_id];
    +
    90
    +
    91 auto event = oneapi::dpl::experimental::exclusive_scan_async(
    +
    92 local_policy, dr::__detail::direct_iterator(first),
    + +
    94 dr::__detail::direct_iterator(d_first), init, binary_op);
    +
    95
    +
    96 auto dst_iter = dr::ranges::local(partial_sums).data() + segment_id;
    +
    97
    +
    98 auto src_iter = dr::ranges::local(out_segment).data();
    +
    99 rng::advance(src_iter, dist - 1);
    +
    100
    +
    101 auto e = q.submit([&](auto &&h) {
    +
    102 h.depends_on(event);
    +
    103 h.single_task([=]() {
    +
    104 rng::range_value_t<O> value = *src_iter;
    +
    105 *dst_iter = value;
    +
    106 });
    +
    107 });
    +
    108
    +
    109 events.push_back(e);
    +
    110
    +
    111 segment_id++;
    +
    112 }
    +
    113
    +
    114 __detail::wait(events);
    +
    115 events.clear();
    +
    116
    +
    117 auto &&local_policy = __detail::dpl_policy(0);
    +
    118
    +
    119 auto first = dr::ranges::local(partial_sums).data();
    +
    120 auto last = first + partial_sums.size();
    +
    121
    +
    122 oneapi::dpl::experimental::inclusive_scan_async(local_policy, first, last,
    +
    123 first, binary_op)
    +
    124 .wait();
    +
    125
    +
    126 std::size_t idx = 0;
    +
    127 for (auto &&segs : zipped_segments) {
    +
    128 auto &&[in_segment, out_segment] = segs;
    +
    129
    +
    130 if (idx > 0) {
    +
    131 auto &&q = __detail::queue(dr::ranges::rank(out_segment));
    +
    132
    +
    133 auto first = rng::begin(out_segment);
    +
    134 dr::__detail::direct_iterator d_first(first);
    +
    135
    +
    136 auto d_sum =
    +
    137 dr::ranges::__detail::local(partial_sums).begin() + idx - 1;
    +
    138
    +
    139 sycl::event e = dr::__detail::parallel_for(
    +
    140 q, sycl::range<>(rng::distance(out_segment)),
    +
    141 [=](auto idx) { d_first[idx] = binary_op(d_first[idx], *d_sum); });
    +
    142
    +
    143 events.push_back(e);
    +
    144 }
    +
    145 idx++;
    +
    146 }
    +
    147
    +
    148 __detail::wait(events);
    +
    149
    +
    150 } else {
    +
    151 assert(false);
    +
    152 }
    +
    153}
    +
    154
    +
    155// Ranges versions
    +
    156
    +
    157template <typename ExecutionPolicy, dr::distributed_contiguous_range R,
    +
    158 dr::distributed_contiguous_range O, typename T, typename BinaryOp>
    +
    159void exclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o, T init,
    +
    160 BinaryOp &&binary_op) {
    +
    161 exclusive_scan_impl_(std::forward<ExecutionPolicy>(policy),
    +
    162 std::forward<R>(r), std::forward<O>(o), init,
    +
    163 std::forward<BinaryOp>(binary_op));
    +
    164}
    +
    165
    +
    166template <typename ExecutionPolicy, dr::distributed_contiguous_range R,
    + +
    168void exclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o, T init) {
    +
    169 exclusive_scan_impl_(std::forward<ExecutionPolicy>(policy),
    +
    170 std::forward<R>(r), std::forward<O>(o), init,
    +
    171 std::plus<>{});
    +
    172}
    +
    173
    + +
    175 dr::distributed_contiguous_range O, typename T, typename BinaryOp>
    +
    176void exclusive_scan(R &&r, O &&o, T init, BinaryOp &&binary_op) {
    +
    177 exclusive_scan_impl_(dr::sp::par_unseq, std::forward<R>(r),
    +
    178 std::forward<O>(o), init,
    +
    179 std::forward<BinaryOp>(binary_op));
    +
    180}
    +
    181
    + + +
    184void exclusive_scan(R &&r, O &&o, T init) {
    +
    185 exclusive_scan_impl_(dr::sp::par_unseq, std::forward<R>(r),
    +
    186 std::forward<O>(o), init, std::plus<>{});
    +
    187}
    +
    188
    +
    189// Iterator versions
    +
    190
    +
    191template <typename ExecutionPolicy, dr::distributed_iterator Iter,
    +
    192 dr::distributed_iterator OutputIter, typename T, typename BinaryOp>
    +
    193void exclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last,
    +
    194 OutputIter d_first, T init, BinaryOp &&binary_op) {
    +
    195 auto dist = rng::distance(first, last);
    +
    196 auto d_last = d_first;
    +
    197 rng::advance(d_last, dist);
    +
    198 exclusive_scan_impl_(
    +
    199 std::forward<ExecutionPolicy>(policy), rng::subrange(first, last),
    +
    200 rng::subrange(d_first, d_last), init, std::forward<BinaryOp>(binary_op));
    +
    201}
    +
    202
    +
    203template <typename ExecutionPolicy, dr::distributed_iterator Iter,
    +
    204 dr::distributed_iterator OutputIter, typename T>
    +
    205void exclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last,
    +
    206 OutputIter d_first, T init) {
    +
    207 exclusive_scan(std::forward<ExecutionPolicy>(policy), first, last, d_first,
    +
    208 init, std::plus<>{});
    +
    209}
    +
    210
    +
    211template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter,
    +
    212 typename T, typename BinaryOp>
    +
    213void exclusive_scan(Iter first, Iter last, OutputIter d_first, T init,
    +
    214 BinaryOp &&binary_op) {
    +
    215 exclusive_scan(dr::sp::par_unseq, first, last, d_first, init,
    +
    216 std::forward<BinaryOp>(binary_op));
    +
    217}
    +
    218
    +
    219template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter,
    +
    220 typename T>
    +
    221void exclusive_scan(Iter first, Iter last, OutputIter d_first, T init) {
    +
    222 exclusive_scan(dr::sp::par_unseq, first, last, d_first, init);
    +
    223}
    +
    224
    +
    225} // namespace dr::sp
    +
    Definition: onedpl_direct_iterator.hpp:15
    +
    Definition: allocators.hpp:20
    +
    Definition: vector.hpp:14
    +
    Definition: concepts.hpp:42
    +
    Definition: concepts.hpp:31
    +
    + + + + diff --git a/doxygen/sp_2algorithms_2fill_8hpp_source.html b/doxygen/sp_2algorithms_2fill_8hpp_source.html new file mode 100644 index 0000000000..758a090ba8 --- /dev/null +++ b/doxygen/sp_2algorithms_2fill_8hpp_source.html @@ -0,0 +1,179 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/fill.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    fill.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <memory>
    +
    8#include <type_traits>
    +
    9
    +
    10#include <sycl/sycl.hpp>
    +
    11
    +
    12#include <dr/concepts/concepts.hpp>
    +
    13#include <dr/detail/segments_tools.hpp>
    +
    14#include <dr/sp/detail.hpp>
    +
    15#include <dr/sp/device_ptr.hpp>
    +
    16#include <dr/sp/util.hpp>
    +
    17
    +
    18namespace dr::sp {
    +
    19
    +
    20template <std::contiguous_iterator Iter>
    +
    21 requires(!std::is_const_v<std::iter_value_t<Iter>> &&
    +
    22 std::is_trivially_copyable_v<std::iter_value_t<Iter>>)
    +
    23sycl::event fill_async(Iter first, Iter last,
    +
    24 const std::iter_value_t<Iter> &value) {
    +
    25 auto &&q = __detail::get_queue_for_pointer(first);
    +
    26 std::iter_value_t<Iter> *arr = std::to_address(first);
    +
    27 // not using q.fill because of CMPLRLLVM-46438
    +
    28 return dr::__detail::parallel_for(q, sycl::range<>(last - first),
    +
    29 [=](auto idx) { arr[idx] = value; });
    +
    30}
    +
    31
    +
    32template <std::contiguous_iterator Iter>
    +
    33 requires(!std::is_const_v<std::iter_value_t<Iter>>)
    +
    34void fill(Iter first, Iter last, const std::iter_value_t<Iter> &value) {
    +
    35 fill_async(first, last, value).wait();
    +
    36}
    +
    37
    +
    38template <typename T, typename U>
    +
    39 requires(std::indirectly_writable<device_ptr<T>, U>)
    +
    40sycl::event fill_async(device_ptr<T> first, device_ptr<T> last,
    +
    41 const U &value) {
    +
    42 auto &&q = __detail::get_queue_for_pointer(first);
    +
    43 auto *arr = first.get_raw_pointer();
    +
    44 // not using q.fill because of CMPLRLLVM-46438
    +
    45 return dr::__detail::parallel_for(q, sycl::range<>(last - first),
    +
    46 [=](auto idx) { arr[idx] = value; });
    +
    47}
    +
    48
    +
    49template <typename T, typename U>
    +
    50 requires(std::indirectly_writable<device_ptr<T>, U>)
    +
    51void fill(device_ptr<T> first, device_ptr<T> last, const U &value) {
    +
    52 fill_async(first, last, value).wait();
    +
    53}
    +
    54
    +
    55template <typename T, dr::remote_contiguous_range R>
    +
    56sycl::event fill_async(R &&r, const T &value) {
    +
    57 auto &&q = __detail::queue(dr::ranges::rank(r));
    +
    58 auto *arr = std::to_address(rng::begin(dr::ranges::local(r)));
    +
    59 // not using q.fill because of CMPLRLLVM-46438
    +
    60 return dr::__detail::parallel_for(q, sycl::range<>(rng::distance(r)),
    +
    61 [=](auto idx) { arr[idx] = value; });
    +
    62}
    +
    63
    +
    64template <typename T, dr::remote_contiguous_range R>
    +
    65auto fill(R &&r, const T &value) {
    +
    66 fill_async(r, value).wait();
    +
    67 return rng::end(r);
    +
    68}
    +
    69
    +
    70template <typename T, dr::distributed_contiguous_range DR>
    +
    71sycl::event fill_async(DR &&r, const T &value) {
    +
    72 std::vector<sycl::event> events;
    +
    73
    +
    74 for (auto &&segment : dr::ranges::segments(r)) {
    +
    75 auto e = dr::sp::fill_async(segment, value);
    +
    76 events.push_back(e);
    +
    77 }
    +
    78
    +
    79 return dr::sp::__detail::combine_events(events);
    +
    80}
    +
    81
    +
    82template <typename T, dr::distributed_contiguous_range DR>
    +
    83auto fill(DR &&r, const T &value) {
    +
    84 fill_async(r, value).wait();
    +
    85 return rng::end(r);
    +
    86}
    +
    87
    +
    88template <typename T, dr::distributed_iterator Iter>
    +
    89auto fill(Iter first, Iter last, const T &value) {
    +
    90 fill_async(rng::subrange(first, last), value).wait();
    +
    91 return last;
    +
    92}
    +
    93
    +
    94} // namespace dr::sp
    +
    + + + + diff --git a/doxygen/sp_2algorithms_2for__each_8hpp_source.html b/doxygen/sp_2algorithms_2for__each_8hpp_source.html new file mode 100644 index 0000000000..82e2922127 --- /dev/null +++ b/doxygen/sp_2algorithms_2for__each_8hpp_source.html @@ -0,0 +1,158 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/for_each.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    for_each.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <sycl/sycl.hpp>
    +
    8
    +
    9#include <dr/detail/sycl_utils.hpp>
    +
    10#include <dr/sp/algorithms/execution_policy.hpp>
    +
    11#include <dr/sp/detail.hpp>
    +
    12#include <dr/sp/init.hpp>
    +
    13#include <dr/sp/util.hpp>
    +
    14#include <dr/sp/zip_view.hpp>
    +
    15
    +
    16namespace dr::sp {
    +
    17
    +
    18template <typename ExecutionPolicy, dr::distributed_range R, typename Fn>
    +
    19void for_each(ExecutionPolicy &&policy, R &&r, Fn &&fn) {
    +
    20 static_assert( // currently only one policy supported
    +
    21 std::is_same_v<std::remove_cvref_t<ExecutionPolicy>, device_policy>);
    +
    22
    +
    23 std::vector<sycl::event> events;
    +
    24
    +
    25 for (auto &&segment : dr::ranges::segments(r)) {
    +
    26 auto &&q = __detail::queue(dr::ranges::rank(segment));
    +
    27
    +
    28 assert(rng::distance(segment) > 0);
    +
    29
    +
    30 auto local_segment = __detail::local(segment);
    +
    31
    +
    32 auto first = rng::begin(local_segment);
    +
    33
    +
    34 auto event = dr::__detail::parallel_for(
    +
    35 q, sycl::range<>(rng::distance(local_segment)),
    +
    36 [=](auto idx) { fn(*(first + idx)); });
    +
    37 events.emplace_back(event);
    +
    38 }
    +
    39 __detail::wait(events);
    +
    40}
    +
    41
    +
    42template <typename ExecutionPolicy, dr::distributed_iterator Iter, typename Fn>
    +
    43void for_each(ExecutionPolicy &&policy, Iter begin, Iter end, Fn &&fn) {
    +
    44 for_each(std::forward<ExecutionPolicy>(policy), rng::subrange(begin, end),
    +
    45 std::forward<Fn>(fn));
    +
    46}
    +
    47
    +
    48template <dr::distributed_range R, typename Fn> void for_each(R &&r, Fn &&fn) {
    +
    49 for_each(dr::sp::par_unseq, std::forward<R>(r), std::forward<Fn>(fn));
    +
    50}
    +
    51
    +
    52template <dr::distributed_iterator Iter, typename Fn>
    +
    53void for_each(Iter begin, Iter end, Fn &&fn) {
    +
    54 for_each(dr::sp::par_unseq, begin, end, std::forward<Fn>(fn));
    +
    55}
    +
    56
    +
    57template <typename ExecutionPolicy, dr::distributed_iterator Iter,
    +
    58 std::integral I, typename Fn>
    +
    59Iter for_each_n(ExecutionPolicy &&policy, Iter begin, I n, Fn fn) {
    +
    60 auto end = begin;
    +
    61 rng::advance(end, n);
    +
    62 for_each(std::forward<ExecutionPolicy>(policy), begin, end,
    +
    63 std::forward<Fn>(fn));
    +
    64 return end;
    +
    65}
    +
    66
    +
    67template <dr::distributed_iterator Iter, std::integral I, typename Fn>
    +
    68Iter for_each_n(Iter &&r, I n, Fn fn) {
    +
    69 return for_each_n(dr::sp::par_unseq, std::forward<Iter>(r), n, fn);
    +
    70}
    +
    71
    +
    72} // namespace dr::sp
    +
    Definition: concepts.hpp:31
    +
    + + + + diff --git a/doxygen/sp_2algorithms_2inclusive__scan_8hpp_source.html b/doxygen/sp_2algorithms_2inclusive__scan_8hpp_source.html new file mode 100644 index 0000000000..9579bcbc28 --- /dev/null +++ b/doxygen/sp_2algorithms_2inclusive__scan_8hpp_source.html @@ -0,0 +1,342 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/inclusive_scan.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    inclusive_scan.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <optional>
    +
    8
    +
    9#include <sycl/sycl.hpp>
    +
    10
    +
    11#include <oneapi/dpl/execution>
    +
    12#include <oneapi/dpl/numeric>
    +
    13
    +
    14#include <oneapi/dpl/async>
    +
    15
    +
    16#include <dr/concepts/concepts.hpp>
    +
    17#include <dr/detail/onedpl_direct_iterator.hpp>
    +
    18#include <dr/sp/algorithms/execution_policy.hpp>
    +
    19#include <dr/sp/allocators.hpp>
    +
    20#include <dr/sp/detail.hpp>
    +
    21#include <dr/sp/init.hpp>
    +
    22#include <dr/sp/vector.hpp>
    +
    23#include <dr/sp/views/views.hpp>
    +
    24
    +
    25namespace dr::sp {
    +
    26
    +
    27template <typename ExecutionPolicy, dr::distributed_contiguous_range R,
    +
    28 dr::distributed_contiguous_range O, typename BinaryOp,
    +
    29 typename U = rng::range_value_t<R>>
    +
    30void inclusive_scan_impl_(ExecutionPolicy &&policy, R &&r, O &&o,
    +
    31 BinaryOp &&binary_op, std::optional<U> init = {}) {
    +
    32 using T = rng::range_value_t<O>;
    +
    33
    +
    34 static_assert(
    +
    35 std::is_same_v<std::remove_cvref_t<ExecutionPolicy>, device_policy>);
    +
    36
    +
    37 auto zipped_view = dr::sp::views::zip(r, o);
    +
    38 auto zipped_segments = zipped_view.zipped_segments();
    +
    39
    +
    40 if constexpr (std::is_same_v<std::remove_cvref_t<ExecutionPolicy>,
    +
    41 device_policy>) {
    +
    42
    +
    43 std::vector<sycl::event> events;
    +
    44
    +
    45 auto root = dr::sp::devices()[0];
    +
    46 dr::sp::device_allocator<T> allocator(dr::sp::context(), root);
    + +
    48 std::size_t(zipped_segments.size()), allocator);
    +
    49
    +
    50 std::size_t segment_id = 0;
    +
    51 for (auto &&segs : zipped_segments) {
    +
    52 auto &&[in_segment, out_segment] = segs;
    +
    53
    +
    54 auto &&q = __detail::queue(dr::ranges::rank(in_segment));
    +
    55 auto &&local_policy = __detail::dpl_policy(dr::ranges::rank(in_segment));
    +
    56
    +
    57 auto dist = rng::distance(in_segment);
    +
    58 assert(dist > 0);
    +
    59
    +
    60 auto first = rng::begin(in_segment);
    +
    61 auto last = rng::end(in_segment);
    +
    62 auto d_first = rng::begin(out_segment);
    +
    63
    +
    64 sycl::event event;
    +
    65
    +
    66 if (segment_id == 0 && init.has_value()) {
    +
    67 event = oneapi::dpl::experimental::inclusive_scan_async(
    +
    68 local_policy, dr::__detail::direct_iterator(first),
    + +
    70 dr::__detail::direct_iterator(d_first), binary_op, init.value());
    +
    71 } else {
    +
    72 event = oneapi::dpl::experimental::inclusive_scan_async(
    +
    73 local_policy, dr::__detail::direct_iterator(first),
    + +
    75 dr::__detail::direct_iterator(d_first), binary_op);
    +
    76 }
    +
    77
    +
    78 auto dst_iter = dr::ranges::local(partial_sums).data() + segment_id;
    +
    79
    +
    80 auto src_iter = dr::ranges::local(out_segment).data();
    +
    81 rng::advance(src_iter, dist - 1);
    +
    82
    +
    83 auto e = q.submit([&](auto &&h) {
    +
    84 h.depends_on(event);
    +
    85 h.single_task([=]() {
    +
    86 rng::range_value_t<O> value = *src_iter;
    +
    87 *dst_iter = value;
    +
    88 });
    +
    89 });
    +
    90
    +
    91 events.push_back(e);
    +
    92
    +
    93 segment_id++;
    +
    94 }
    +
    95
    +
    96 __detail::wait(events);
    +
    97 events.clear();
    +
    98
    +
    99 auto &&local_policy = __detail::dpl_policy(0);
    +
    100
    +
    101 auto first = dr::ranges::local(partial_sums).data();
    +
    102 auto last = first + partial_sums.size();
    +
    103
    +
    104 oneapi::dpl::experimental::inclusive_scan_async(local_policy, first, last,
    +
    105 first, binary_op)
    +
    106 .wait();
    +
    107
    +
    108 std::size_t idx = 0;
    +
    109 for (auto &&segs : zipped_segments) {
    +
    110 auto &&[in_segment, out_segment] = segs;
    +
    111
    +
    112 if (idx > 0) {
    +
    113 auto &&q = __detail::queue(dr::ranges::rank(out_segment));
    +
    114
    +
    115 auto first = rng::begin(out_segment);
    +
    116 dr::__detail::direct_iterator d_first(first);
    +
    117
    +
    118 auto d_sum =
    +
    119 dr::ranges::__detail::local(partial_sums).begin() + idx - 1;
    +
    120
    +
    121 sycl::event e = dr::__detail::parallel_for(
    +
    122 q, sycl::range<>(rng::distance(out_segment)),
    +
    123 [=](auto idx) { d_first[idx] = binary_op(d_first[idx], *d_sum); });
    +
    124
    +
    125 events.push_back(e);
    +
    126 }
    +
    127 idx++;
    +
    128 }
    +
    129
    +
    130 __detail::wait(events);
    +
    131
    +
    132 } else {
    +
    133 assert(false);
    +
    134 }
    +
    135}
    +
    136
    +
    137template <typename ExecutionPolicy, dr::distributed_contiguous_range R,
    +
    138 dr::distributed_contiguous_range O, typename BinaryOp, typename T>
    +
    139void inclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o,
    +
    140 BinaryOp &&binary_op, T init) {
    +
    141 inclusive_scan_impl_(std::forward<ExecutionPolicy>(policy),
    +
    142 std::forward<R>(r), std::forward<O>(o),
    +
    143 std::forward<BinaryOp>(binary_op), std::optional(init));
    +
    144}
    +
    145
    +
    146template <typename ExecutionPolicy, dr::distributed_contiguous_range R,
    +
    147 dr::distributed_contiguous_range O, typename BinaryOp>
    +
    148void inclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o,
    +
    149 BinaryOp &&binary_op) {
    +
    150 inclusive_scan_impl_(std::forward<ExecutionPolicy>(policy),
    +
    151 std::forward<R>(r), std::forward<O>(o),
    +
    152 std::forward<BinaryOp>(binary_op));
    +
    153}
    +
    154
    +
    155template <typename ExecutionPolicy, dr::distributed_contiguous_range R,
    + +
    157void inclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o) {
    +
    158 inclusive_scan(std::forward<ExecutionPolicy>(policy), std::forward<R>(r),
    +
    159 std::forward<O>(o), std::plus<rng::range_value_t<R>>());
    +
    160}
    +
    161
    +
    162// Distributed iterator versions
    +
    163
    +
    164template <typename ExecutionPolicy, dr::distributed_iterator Iter,
    +
    165 dr::distributed_iterator OutputIter, typename BinaryOp, typename T>
    +
    166OutputIter inclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last,
    +
    167 OutputIter d_first, BinaryOp &&binary_op, T init) {
    +
    168
    +
    169 auto dist = rng::distance(first, last);
    +
    170 auto d_last = d_first;
    +
    171 rng::advance(d_last, dist);
    +
    172 inclusive_scan(std::forward<ExecutionPolicy>(policy),
    +
    173 rng::subrange(first, last), rng::subrange(d_first, d_last),
    +
    174 std::forward<BinaryOp>(binary_op), init);
    +
    175
    +
    176 return d_last;
    +
    177}
    +
    178
    +
    179template <typename ExecutionPolicy, dr::distributed_iterator Iter,
    +
    180 dr::distributed_iterator OutputIter, typename BinaryOp>
    +
    181OutputIter inclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last,
    +
    182 OutputIter d_first, BinaryOp &&binary_op) {
    +
    183
    +
    184 auto dist = rng::distance(first, last);
    +
    185 auto d_last = d_first;
    +
    186 rng::advance(d_last, dist);
    +
    187 inclusive_scan(std::forward<ExecutionPolicy>(policy),
    +
    188 rng::subrange(first, last), rng::subrange(d_first, d_last),
    +
    189 std::forward<BinaryOp>(binary_op));
    +
    190
    +
    191 return d_last;
    +
    192}
    +
    193
    +
    194template <typename ExecutionPolicy, dr::distributed_iterator Iter,
    +
    195 dr::distributed_iterator OutputIter>
    +
    196OutputIter inclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last,
    +
    197 OutputIter d_first) {
    +
    198 auto dist = rng::distance(first, last);
    +
    199 auto d_last = d_first;
    +
    200 rng::advance(d_last, dist);
    +
    201 inclusive_scan(std::forward<ExecutionPolicy>(policy),
    +
    202 rng::subrange(first, last), rng::subrange(d_first, d_last));
    +
    203
    +
    204 return d_last;
    +
    205}
    +
    206
    +
    207// Execution policy-less versions
    +
    208
    + + +
    211void inclusive_scan(R &&r, O &&o) {
    +
    212 inclusive_scan(dr::sp::par_unseq, std::forward<R>(r), std::forward<O>(o));
    +
    213}
    +
    214
    + +
    216 dr::distributed_contiguous_range O, typename BinaryOp>
    +
    217void inclusive_scan(R &&r, O &&o, BinaryOp &&binary_op) {
    +
    218 inclusive_scan(dr::sp::par_unseq, std::forward<R>(r), std::forward<O>(o),
    +
    219 std::forward<BinaryOp>(binary_op));
    +
    220}
    +
    221
    + +
    223 dr::distributed_contiguous_range O, typename BinaryOp, typename T>
    +
    224void inclusive_scan(R &&r, O &&o, BinaryOp &&binary_op, T init) {
    +
    225 inclusive_scan(dr::sp::par_unseq, std::forward<R>(r), std::forward<O>(o),
    +
    226 std::forward<BinaryOp>(binary_op), init);
    +
    227}
    +
    228
    +
    229// Distributed iterator versions
    +
    230
    +
    231template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter>
    +
    232OutputIter inclusive_scan(Iter first, Iter last, OutputIter d_first) {
    +
    233 return inclusive_scan(dr::sp::par_unseq, first, last, d_first);
    +
    234}
    +
    235
    +
    236template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter,
    +
    237 typename BinaryOp>
    +
    238OutputIter inclusive_scan(Iter first, Iter last, OutputIter d_first,
    +
    239 BinaryOp &&binary_op) {
    +
    240 return inclusive_scan(dr::sp::par_unseq, first, last, d_first,
    +
    241 std::forward<BinaryOp>(binary_op));
    +
    242}
    +
    243
    +
    244template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter,
    +
    245 typename BinaryOp, typename T>
    +
    246OutputIter inclusive_scan(Iter first, Iter last, OutputIter d_first,
    +
    247 BinaryOp &&binary_op, T init) {
    +
    248 return inclusive_scan(dr::sp::par_unseq, first, last, d_first,
    +
    249 std::forward<BinaryOp>(binary_op), init);
    +
    250}
    +
    251
    +
    252} // namespace dr::sp
    +
    Definition: onedpl_direct_iterator.hpp:15
    +
    Definition: allocators.hpp:20
    +
    Definition: vector.hpp:14
    +
    Definition: concepts.hpp:42
    +
    Definition: concepts.hpp:31
    +
    + + + + diff --git a/doxygen/sp_2algorithms_2iota_8hpp_source.html b/doxygen/sp_2algorithms_2iota_8hpp_source.html new file mode 100644 index 0000000000..a303dbbb12 --- /dev/null +++ b/doxygen/sp_2algorithms_2iota_8hpp_source.html @@ -0,0 +1,116 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/iota.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    iota.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <limits>
    +
    8
    +
    9#include <dr/concepts/concepts.hpp>
    +
    10#include <dr/detail/ranges_shim.hpp>
    +
    11#include <dr/sp/algorithms/for_each.hpp>
    +
    12#include <dr/views/iota.hpp>
    +
    13
    +
    14namespace dr::sp {
    +
    15
    +
    16template <dr::distributed_range R, std::integral T> void iota(R &&r, T value) {
    +
    17 auto iota_view = rng::views::iota(value, T(value + rng::distance(r)));
    +
    18
    +
    19 for_each(par_unseq, views::zip(iota_view, r), [](auto &&elem) {
    +
    20 auto &&[idx, v] = elem;
    +
    21 v = idx;
    +
    22 });
    +
    23}
    +
    24
    +
    25template <dr::distributed_iterator Iter, std::integral T>
    +
    26void iota(Iter begin, Iter end, T value) {
    +
    27 auto r = rng::subrange(begin, end);
    +
    28 iota(r, value);
    +
    29}
    +
    30
    +
    31} // namespace dr::sp
    +
    + + + + diff --git a/doxygen/sp_2algorithms_2reduce_8hpp_source.html b/doxygen/sp_2algorithms_2reduce_8hpp_source.html new file mode 100644 index 0000000000..5b6461d2ea --- /dev/null +++ b/doxygen/sp_2algorithms_2reduce_8hpp_source.html @@ -0,0 +1,255 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/reduce.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    reduce.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <oneapi/dpl/execution>
    +
    8#include <oneapi/dpl/numeric>
    +
    9
    +
    10#include <oneapi/dpl/async>
    +
    11
    +
    12#include <dr/concepts/concepts.hpp>
    +
    13#include <dr/detail/onedpl_direct_iterator.hpp>
    +
    14#include <dr/sp/algorithms/execution_policy.hpp>
    +
    15#include <dr/sp/init.hpp>
    +
    16#include <sycl/sycl.hpp>
    +
    17
    +
    18namespace {
    +
    19
    +
    20// Precondition: rng::distance(first, last) >= 2
    +
    21// Postcondition: return future to [first, last) reduced with fn
    +
    22template <typename T, typename ExecutionPolicy,
    +
    23 std::bidirectional_iterator Iter, typename Fn>
    +
    24auto reduce_no_init_async(ExecutionPolicy &&policy, Iter first, Iter last,
    +
    25 Fn &&fn) {
    +
    26 Iter new_last = last;
    +
    27 --new_last;
    +
    28
    +
    29 std::iter_value_t<Iter> init = *new_last;
    +
    30
    +
    31 dr::__detail::direct_iterator d_first(first);
    +
    32 dr::__detail::direct_iterator d_last(new_last);
    +
    33
    +
    34 return oneapi::dpl::experimental::reduce_async(
    +
    35 std::forward<ExecutionPolicy>(policy), d_first, d_last,
    +
    36 static_cast<T>(init), std::forward<Fn>(fn));
    +
    37}
    +
    38
    +
    39template <typename T, typename ExecutionPolicy,
    +
    40 std::bidirectional_iterator Iter, typename Fn>
    +
    41 requires(sycl::has_known_identity_v<Fn, T>)
    +
    42auto reduce_no_init_async(ExecutionPolicy &&policy, Iter first, Iter last,
    +
    43 Fn &&fn) {
    +
    44 dr::__detail::direct_iterator d_first(first);
    + +
    46
    +
    47 return oneapi::dpl::experimental::reduce_async(
    +
    48 std::forward<ExecutionPolicy>(policy), d_first, d_last,
    +
    49 sycl::known_identity_v<Fn, T>, std::forward<Fn>(fn));
    +
    50}
    +
    51
    +
    52} // namespace
    +
    53
    +
    54namespace dr::sp {
    +
    55
    +
    56template <typename ExecutionPolicy, dr::distributed_range R, typename T,
    +
    57 typename BinaryOp>
    +
    58T reduce(ExecutionPolicy &&policy, R &&r, T init, BinaryOp &&binary_op) {
    +
    59
    +
    60 static_assert(
    +
    61 std::is_same_v<std::remove_cvref_t<ExecutionPolicy>, device_policy>);
    +
    62
    +
    63 if constexpr (std::is_same_v<std::remove_cvref_t<ExecutionPolicy>,
    +
    64 device_policy>) {
    +
    65 using future_t = decltype(oneapi::dpl::experimental::reduce_async(
    +
    66 __detail::dpl_policy(0), dr::ranges::segments(r)[0].begin(),
    +
    67 dr::ranges::segments(r)[0].end(), init, binary_op));
    +
    68
    +
    69 std::vector<future_t> futures;
    +
    70
    +
    71 for (auto &&segment : dr::ranges::segments(r)) {
    +
    72 auto &&local_policy = __detail::dpl_policy(dr::ranges::rank(segment));
    +
    73
    +
    74 auto dist = rng::distance(segment);
    +
    75 if (dist <= 0) {
    +
    76 continue;
    +
    77 } else if (dist == 1) {
    +
    78 init = binary_op(init, *rng::begin(segment));
    +
    79 continue;
    +
    80 }
    +
    81
    +
    82 auto future = reduce_no_init_async<T>(local_policy, rng::begin(segment),
    +
    83 rng::end(segment), binary_op);
    +
    84
    +
    85 futures.push_back(std::move(future));
    +
    86 }
    +
    87
    +
    88 for (auto &&f : futures) {
    +
    89 init = binary_op(init, f.get());
    +
    90 }
    +
    91
    +
    92 return init;
    +
    93 } else {
    +
    94 assert(false);
    +
    95 }
    +
    96}
    +
    97
    +
    98template <typename ExecutionPolicy, dr::distributed_range R, typename T>
    +
    99T reduce(ExecutionPolicy &&policy, R &&r, T init) {
    +
    100 return reduce(std::forward<ExecutionPolicy>(policy), std::forward<R>(r), init,
    +
    101 std::plus<>());
    +
    102}
    +
    103
    +
    104template <typename ExecutionPolicy, dr::distributed_range R>
    +
    105rng::range_value_t<R> reduce(ExecutionPolicy &&policy, R &&r) {
    +
    106 return reduce(std::forward<ExecutionPolicy>(policy), std::forward<R>(r),
    +
    107 rng::range_value_t<R>{}, std::plus<>());
    +
    108}
    +
    109
    +
    110// Iterator versions
    +
    111
    +
    112template <typename ExecutionPolicy, dr::distributed_iterator Iter>
    +
    113std::iter_value_t<Iter> reduce(ExecutionPolicy &&policy, Iter first,
    +
    114 Iter last) {
    +
    115 return reduce(std::forward<ExecutionPolicy>(policy),
    +
    116 rng::subrange(first, last), std::iter_value_t<Iter>{},
    +
    117 std::plus<>());
    +
    118}
    +
    119
    +
    120template <typename ExecutionPolicy, dr::distributed_iterator Iter, typename T>
    +
    121T reduce(ExecutionPolicy &&policy, Iter first, Iter last, T init) {
    +
    122 return reduce(std::forward<ExecutionPolicy>(policy),
    +
    123 rng::subrange(first, last), init, std::plus<>());
    +
    124}
    +
    125
    +
    126template <typename ExecutionPolicy, dr::distributed_iterator Iter, typename T,
    +
    127 typename BinaryOp>
    +
    128T reduce(ExecutionPolicy &&policy, Iter first, Iter last, T init,
    +
    129 BinaryOp &&binary_op) {
    +
    130 return reduce(std::forward<ExecutionPolicy>(policy),
    +
    131 rng::subrange(first, last), init,
    +
    132 std::forward<BinaryOp>(binary_op));
    +
    133}
    +
    134
    +
    135// Execution policy-less algorithms
    +
    136
    +
    137template <dr::distributed_range R> rng::range_value_t<R> reduce(R &&r) {
    +
    138 return reduce(dr::sp::par_unseq, std::forward<R>(r));
    +
    139}
    +
    140
    +
    141template <dr::distributed_range R, typename T> T reduce(R &&r, T init) {
    +
    142 return reduce(dr::sp::par_unseq, std::forward<R>(r), init);
    +
    143}
    +
    144
    +
    145template <dr::distributed_range R, typename T, typename BinaryOp>
    +
    146T reduce(R &&r, T init, BinaryOp &&binary_op) {
    +
    147 return reduce(dr::sp::par_unseq, std::forward<R>(r), init,
    +
    148 std::forward<BinaryOp>(binary_op));
    +
    149}
    +
    150
    +
    151template <dr::distributed_iterator Iter>
    +
    152std::iter_value_t<Iter> reduce(Iter first, Iter last) {
    +
    153 return reduce(dr::sp::par_unseq, first, last);
    +
    154}
    +
    155
    +
    156template <dr::distributed_iterator Iter, typename T>
    +
    157T reduce(Iter first, Iter last, T init) {
    +
    158 return reduce(dr::sp::par_unseq, first, last, init);
    +
    159}
    +
    160
    +
    161template <dr::distributed_iterator Iter, typename T, typename BinaryOp>
    +
    162T reduce(Iter first, Iter last, T init, BinaryOp &&binary_op) {
    +
    163 return reduce(dr::sp::par_unseq, first, last, init,
    +
    164 std::forward<BinaryOp>(binary_op));
    +
    165}
    +
    166
    +
    167} // namespace dr::sp
    +
    Definition: onedpl_direct_iterator.hpp:15
    +
    Definition: concepts.hpp:31
    +
    Definition: concepts.hpp:20
    +
    + + + + diff --git a/doxygen/sp_2algorithms_2sort_8hpp_source.html b/doxygen/sp_2algorithms_2sort_8hpp_source.html new file mode 100644 index 0000000000..43741ade81 --- /dev/null +++ b/doxygen/sp_2algorithms_2sort_8hpp_source.html @@ -0,0 +1,383 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/sort.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    sort.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <oneapi/dpl/execution>
    +
    8
    +
    9#include <oneapi/dpl/algorithm>
    +
    10#include <oneapi/dpl/async>
    +
    11
    +
    12#include <dr/concepts/concepts.hpp>
    +
    13#include <dr/detail/onedpl_direct_iterator.hpp>
    +
    14#include <dr/sp/init.hpp>
    +
    15
    +
    16#include <omp.h>
    +
    17#include <sycl/sycl.hpp>
    +
    18
    +
    19namespace dr::sp {
    +
    20
    +
    21namespace __detail {
    +
    22
    +
    23template <typename LocalPolicy, typename InputIt, typename Compare>
    +
    24sycl::event sort_async(LocalPolicy &&policy, InputIt first, InputIt last,
    +
    25 Compare &&comp) {
    +
    26 if (rng::distance(first, last) >= 2) {
    +
    27 dr::__detail::direct_iterator d_first(first);
    + +
    29 return oneapi::dpl::experimental::sort_async(
    +
    30 std::forward<LocalPolicy>(policy), d_first, d_last,
    +
    31 std::forward<Compare>(comp));
    +
    32 } else {
    +
    33 return sycl::event{};
    +
    34 }
    +
    35}
    +
    36
    +
    37template <typename LocalPolicy, typename InputIt1, typename InputIt2,
    +
    38 typename OutputIt, typename Comparator = std::less<>>
    +
    39OutputIt lower_bound(LocalPolicy &&policy, InputIt1 start, InputIt1 end,
    +
    40 InputIt2 value_first, InputIt2 value_last, OutputIt result,
    +
    41 Comparator comp = Comparator()) {
    +
    42 dr::__detail::direct_iterator d_start(start);
    + +
    44
    +
    45 dr::__detail::direct_iterator d_value_first(value_first);
    +
    46 dr::__detail::direct_iterator d_value_last(value_last);
    +
    47
    +
    48 dr::__detail::direct_iterator d_result(result);
    +
    49
    +
    50 return oneapi::dpl::lower_bound(std::forward<LocalPolicy>(policy), d_start,
    +
    51 d_end, d_value_first, d_value_last, d_result,
    +
    52 comp)
    +
    53 .base();
    +
    54}
    +
    55
    +
    56} // namespace __detail
    +
    57
    +
    58template <dr::distributed_range R, typename Compare = std::less<>>
    +
    59void sort(R &&r, Compare comp = Compare()) {
    +
    60 auto &&segments = dr::ranges::segments(r);
    +
    61
    +
    62 if (rng::size(segments) == 0) {
    +
    63 return;
    +
    64 } else if (rng::size(segments) == 1) {
    +
    65 auto &&segment = *rng::begin(segments);
    +
    66 auto &&local_policy =
    +
    67 dr::sp::__detail::dpl_policy(dr::ranges::rank(segment));
    +
    68 auto &&local_segment = dr::sp::__detail::local(segment);
    +
    69
    +
    70 __detail::sort_async(local_policy, rng::begin(local_segment),
    +
    71 rng::end(local_segment), comp)
    +
    72 .wait();
    +
    73 return;
    +
    74 }
    +
    75
    +
    76 using T = rng::range_value_t<R>;
    +
    77 std::vector<sycl::event> events;
    +
    78
    +
    79 const std::size_t n_segments = std::size_t(rng::size(segments));
    +
    80 const std::size_t n_splitters = n_segments - 1;
    +
    81
    +
    82 // Sort each local segment, then compute medians.
    +
    83 // Each segment has `n_splitters` medians,
    +
    84 // so `n_segments * n_splitters` medians total.
    +
    85
    +
    86 T *medians = sycl::malloc_device<T>(n_segments * n_splitters,
    +
    87 sp::devices()[0], sp::context());
    +
    88
    +
    89 for (auto &&[segment_id_, segment] : rng::views::enumerate(segments)) {
    +
    90 auto const segment_id = static_cast<std::size_t>(segment_id_);
    +
    91 auto &&q = dr::sp::__detail::queue(dr::ranges::rank(segment));
    +
    92 auto &&local_policy =
    +
    93 dr::sp::__detail::dpl_policy(dr::ranges::rank(segment));
    +
    94
    +
    95 auto &&local_segment = dr::sp::__detail::local(segment);
    +
    96
    +
    97 auto s = __detail::sort_async(local_policy, rng::begin(local_segment),
    +
    98 rng::end(local_segment), comp);
    +
    99
    +
    100 double step_size = static_cast<double>(rng::size(segment)) / n_segments;
    +
    101
    +
    102 auto local_begin = rng::begin(local_segment);
    +
    103
    +
    104 auto e = q.submit([&](auto &&h) {
    +
    105 h.depends_on(s);
    +
    106
    +
    107 h.parallel_for(n_splitters, [=](auto i) {
    +
    108 medians[n_splitters * segment_id + i] =
    +
    109 local_begin[std::size_t(step_size * (i + 1) + 0.5)];
    +
    110 });
    +
    111 });
    +
    112
    +
    113 events.push_back(e);
    +
    114 }
    +
    115
    +
    116 dr::sp::__detail::wait(events);
    +
    117 events.clear();
    +
    118
    +
    119 // Compute global medians by sorting medians and
    +
    120 // computing `n_splitters` medians from the medians.
    +
    121 auto &&local_policy = dr::sp::__detail::dpl_policy(0);
    +
    122 __detail::sort_async(local_policy, medians,
    +
    123 medians + n_segments * n_splitters, comp)
    +
    124 .wait();
    +
    125
    +
    126 double step_size = static_cast<double>(n_segments * n_splitters) / n_segments;
    +
    127
    +
    128 // - Collect median of medians to get final splitters.
    +
    129 // - Write splitters to [0, n_splitters) in `medians`
    +
    130
    +
    131 auto &&q = dr::sp::__detail::queue(0);
    +
    132 q.single_task([=] {
    +
    133 for (std::size_t i = 0; i < n_splitters; i++) {
    +
    134 medians[i] = medians[std::size_t(step_size * (i + 1) + 0.5)];
    +
    135 }
    +
    136 }).wait();
    +
    137
    +
    138 std::vector<std::size_t *> splitter_indices;
    +
    139 // sorted_seg_sizes[i]: how many elements exists in all segments between
    +
    140 // medians[i-1] and medians[i]
    +
    141 std::vector<std::size_t> sorted_seg_sizes(n_segments, 0);
    +
    142 // push_positions[snd_idx][rcv_idx]: shift inside final segment of rcv_idx for
    +
    143 // data being sent from initial snd_idx segment
    +
    144 std::vector<std::vector<std::size_t>> push_positions(n_segments);
    +
    145
    +
    146 // Compute how many elements will be sent to each of the new "sorted
    +
    147 // segments". Simultaneously compute the offsets `push_positions` where each
    +
    148 // segments' corresponding elements will be pushed.
    +
    149
    +
    150 for (auto &&[segment_id, segment] : rng::views::enumerate(segments)) {
    +
    151 auto &&q = dr::sp::__detail::queue(dr::ranges::rank(segment));
    +
    152 auto &&local_policy =
    +
    153 dr::sp::__detail::dpl_policy(dr::ranges::rank(segment));
    +
    154
    +
    155 auto &&local_segment = dr::sp::__detail::local(segment);
    +
    156
    +
    157 // slitter_i = [ index in local_segment of first element greater or equal
    +
    158 // 1st global median, index ... 2nd global median, ..., size of
    +
    159 // local_segment]
    +
    160 std::size_t *splitter_i = sycl::malloc_shared<std::size_t>(
    +
    161 n_segments, q.get_device(), sp::context());
    +
    162 splitter_indices.push_back(splitter_i);
    +
    163
    +
    164 // Local copy `medians_l` necessary due to [GSD-3893]
    +
    165 T *medians_l =
    +
    166 sycl::malloc_device<T>(n_splitters, q.get_device(), sp::context());
    +
    167
    +
    168 q.memcpy(medians_l, medians, sizeof(T) * n_splitters).wait();
    +
    169
    +
    170 __detail::lower_bound(local_policy, rng::begin(local_segment),
    +
    171 rng::end(local_segment), medians_l,
    +
    172 medians_l + n_splitters, splitter_i, comp);
    +
    173
    +
    174 sycl::free(medians_l, sp::context());
    +
    175
    +
    176 splitter_i[n_splitters] = rng::size(local_segment);
    +
    177
    +
    178 for (std::size_t i = 0; i < n_segments; i++) {
    +
    179 const std::size_t n_elements =
    +
    180 splitter_i[i] - (i == 0 ? 0 : splitter_i[i - 1]);
    +
    181 const std::size_t pos =
    +
    182 std::atomic_ref(sorted_seg_sizes[i]).fetch_add(n_elements);
    +
    183 push_positions[static_cast<std::size_t>(segment_id)].push_back(pos);
    +
    184 }
    +
    185 }
    +
    186
    +
    187 // Allocate new "sorted segments"
    +
    188 std::vector<T *> sorted_segments;
    +
    189
    +
    190 for (auto &&[segment_id, segment] : rng::views::enumerate(segments)) {
    +
    191 auto &&q = dr::sp::__detail::queue(dr::ranges::rank(segment));
    +
    192
    +
    193 T *buffer = sycl::malloc_device<T>(
    +
    194 sorted_seg_sizes[static_cast<std::size_t>(segment_id)], q);
    +
    195 sorted_segments.push_back(buffer);
    +
    196 }
    +
    197
    +
    198 // Copy corresponding elements to each "sorted segment"
    +
    199 for (auto &&[segment_id_, segment] : rng::views::enumerate(segments)) {
    +
    200 auto &&local_segment = dr::sp::__detail::local(segment);
    +
    201 const auto segment_id = static_cast<std::size_t>(segment_id_);
    +
    202
    +
    203 std::size_t *splitter_i = splitter_indices[segment_id];
    +
    204
    +
    205 auto p_first = rng::begin(local_segment);
    +
    206 auto p_last = p_first;
    +
    207 for (std::size_t i = 0; i < n_segments; i++) {
    +
    208 p_last = rng::begin(local_segment) + splitter_i[i];
    +
    209
    +
    210 const std::size_t pos = push_positions[segment_id][i];
    +
    211
    +
    212 auto e = sp::copy_async(p_first, p_last, sorted_segments[i] + pos);
    +
    213 events.push_back(e);
    +
    214
    +
    215 p_first = p_last;
    +
    216 }
    +
    217 }
    +
    218
    +
    219 dr::sp::__detail::wait(events);
    +
    220 events.clear();
    +
    221
    +
    222 // merge sorted chunks within each of these new segments
    +
    223
    +
    224#pragma omp parallel num_threads(n_segments)
    +
    225 {
    +
    226 int t = omp_get_thread_num();
    +
    227
    +
    228 std::vector<std::size_t> chunks_ind;
    +
    229 for (std::size_t i = 0; i < n_segments; i++) {
    +
    230 chunks_ind.push_back(push_positions[i][t]);
    +
    231 }
    +
    232
    +
    233 auto _segments = n_segments;
    +
    234 while (_segments > 1) {
    +
    235 std::vector<std::size_t> new_chunks;
    +
    236 new_chunks.push_back(0);
    +
    237
    +
    238 for (int s = 0; s < _segments / 2; s++) {
    +
    239
    +
    240 const std::size_t l = (2 * s + 2 < _segments) ? chunks_ind[2 * s + 2]
    +
    241 : sorted_seg_sizes[t];
    +
    242
    +
    243 auto first = dr::__detail::direct_iterator(sorted_segments[t] +
    +
    244 chunks_ind[2 * s]);
    +
    245 auto middle = dr::__detail::direct_iterator(sorted_segments[t] +
    +
    246 chunks_ind[2 * s + 1]);
    +
    247 auto last = dr::__detail::direct_iterator(sorted_segments[t] + l);
    +
    248
    +
    249 new_chunks.push_back(l);
    +
    250
    +
    251 oneapi::dpl::inplace_merge(
    +
    252 __detail::dpl_policy(dr::ranges::rank(segments[t])), first, middle,
    +
    253 last, std::forward<Compare>(comp));
    +
    254 }
    +
    255
    +
    256 _segments = (_segments + 1) / 2;
    +
    257
    +
    258 std::swap(chunks_ind, new_chunks);
    +
    259 }
    +
    260 } // End of omp parallel region
    +
    261
    +
    262 // Copy the results into the output.
    +
    263
    +
    264 auto d_first = rng::begin(r);
    +
    265
    +
    266 for (std::size_t i = 0; i < sorted_segments.size(); i++) {
    +
    267 T *seg = sorted_segments[i];
    +
    268 std::size_t n_elements = sorted_seg_sizes[i];
    +
    269
    +
    270 auto e = sp::copy_async(seg, seg + n_elements, d_first);
    +
    271
    +
    272 events.push_back(e);
    +
    273
    +
    274 rng::advance(d_first, n_elements);
    +
    275 }
    +
    276
    +
    277 dr::sp::__detail::wait(events);
    +
    278
    +
    279 // Free temporary memory.
    +
    280
    +
    281 for (auto &&sorted_seg : sorted_segments) {
    +
    282 sycl::free(sorted_seg, sp::context());
    +
    283 }
    +
    284
    +
    285 for (auto &&splitter_i : splitter_indices) {
    +
    286 sycl::free(splitter_i, sp::context());
    +
    287 }
    +
    288
    +
    289 sycl::free(medians, sp::context());
    +
    290}
    +
    291
    +
    292template <dr::distributed_iterator RandomIt, typename Compare = std::less<>>
    +
    293void sort(RandomIt first, RandomIt last, Compare comp = Compare()) {
    +
    294 sort(rng::subrange(first, last), comp);
    +
    295}
    +
    296
    +
    297} // namespace dr::sp
    +
    Definition: onedpl_direct_iterator.hpp:15
    +
    + + + + diff --git a/doxygen/sp_2algorithms_2transform_8hpp_source.html b/doxygen/sp_2algorithms_2transform_8hpp_source.html new file mode 100644 index 0000000000..48dfb02782 --- /dev/null +++ b/doxygen/sp_2algorithms_2transform_8hpp_source.html @@ -0,0 +1,168 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/transform.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    transform.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4#pragma once
    +
    5
    +
    6#include <dr/sp/detail.hpp>
    +
    7#include <dr/sp/init.hpp>
    +
    8#include <dr/sp/util.hpp>
    +
    9
    +
    10namespace dr::sp {
    +
    11
    +
    25template <class ExecutionPolicy>
    +
    26auto transform(ExecutionPolicy &&policy, dr::distributed_range auto &&in,
    +
    27 dr::distributed_iterator auto out, auto &&fn) {
    +
    28
    +
    29 static_assert( // currently only one policy supported
    +
    30 std::is_same_v<std::remove_cvref_t<ExecutionPolicy>, device_policy>);
    +
    31
    +
    32 std::vector<sycl::event> events;
    +
    33 using OutT = typename decltype(out)::value_type;
    +
    34 std::vector<void *> buffers;
    +
    35 const auto out_end = out + rng::size(in);
    +
    36
    +
    37 for (auto &&[in_seg, out_seg] :
    +
    38 views::zip(in, rng::subrange(out, out_end)).zipped_segments()) {
    +
    39 auto in_device = policy.get_devices()[in_seg.rank()];
    +
    40 auto &&q = __detail::queue(dr::ranges::rank(in_seg));
    +
    41 const std::size_t seg_size = rng::size(in_seg);
    +
    42 assert(seg_size == rng::size(out_seg));
    +
    43 auto local_in_seg = __detail::local(in_seg);
    +
    44
    +
    45 if (in_seg.rank() == out_seg.rank()) {
    +
    46 auto local_out_seg = __detail::local(out_seg);
    +
    47 events.emplace_back(q.parallel_for(seg_size, [=](auto idx) {
    +
    48 local_out_seg[idx] = fn(local_in_seg[idx]);
    +
    49 }));
    +
    50 } else {
    +
    51 OutT *buffer =
    +
    52 sycl::malloc_device<OutT>(seg_size, in_device, dr::sp::context());
    +
    53 buffers.push_back(buffer);
    +
    54
    +
    55 sycl::event compute_event = q.parallel_for(
    +
    56 seg_size, [=](auto idx) { buffer[idx] = fn(local_in_seg[idx]); });
    +
    57 events.emplace_back(q.copy(buffer, __detail::local(out_seg.begin()),
    +
    58 seg_size, compute_event));
    +
    59 }
    +
    60 }
    +
    61 __detail::wait(events);
    +
    62
    +
    63 for (auto *b : buffers)
    +
    64 sycl::free(b, dr::sp::context());
    +
    65
    +
    66 return rng::unary_transform_result<decltype(rng::end(in)), decltype(out_end)>{
    +
    67 rng::end(in), out_end};
    +
    68}
    +
    69
    +
    70template <dr::distributed_range R, dr::distributed_iterator Iter, typename Fn>
    +
    71auto transform(R &&in, Iter out, Fn &&fn) {
    +
    72 return transform(dr::sp::par_unseq, std::forward<R>(in),
    +
    73 std::forward<Iter>(out), std::forward<Fn>(fn));
    +
    74}
    +
    75
    +
    76template <typename ExecutionPolicy, dr::distributed_iterator Iter1,
    +
    77 dr::distributed_iterator Iter2, typename Fn>
    +
    78auto transform(ExecutionPolicy &&policy, Iter1 in_begin, Iter1 in_end,
    +
    79 Iter2 out_end, Fn &&fn) {
    +
    80 return transform(
    +
    81 std::forward<ExecutionPolicy>(policy),
    +
    82 rng::subrange(std::forward<Iter1>(in_begin), std::forward<Iter1>(in_end)),
    +
    83 std::forward<Iter2>(out_end), std::forward<Fn>(fn));
    +
    84}
    +
    85
    + +
    87 typename Fn>
    +
    88auto transform(Iter1 in_begin, Iter1 in_end, Iter2 out_end, Fn &&fn) {
    +
    89 return transform(dr::sp::par_unseq, std::forward<Iter1>(in_begin),
    +
    90 std::forward<Iter1>(in_end), std::forward<Iter2>(out_end),
    +
    91 std::forward<Fn>(fn));
    +
    92}
    +
    93
    +
    94} // namespace dr::sp
    +
    Definition: concepts.hpp:31
    +
    Definition: concepts.hpp:20
    +
    + + + + diff --git a/doxygen/sp_2distributed__vector_8hpp_source.html b/doxygen/sp_2distributed__vector_8hpp_source.html new file mode 100644 index 0000000000..da516949fa --- /dev/null +++ b/doxygen/sp_2distributed__vector_8hpp_source.html @@ -0,0 +1,305 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/distributed_vector.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    distributed_vector.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <vector>
    +
    8
    +
    9#include <sycl/sycl.hpp>
    +
    10
    +
    11#include <dr/detail/segments_tools.hpp>
    +
    12#include <dr/sp/allocators.hpp>
    +
    13#include <dr/sp/device_ptr.hpp>
    +
    14#include <dr/sp/device_vector.hpp>
    +
    15#include <dr/sp/vector.hpp>
    +
    16
    +
    17namespace dr::sp {
    +
    18
    +
    19template <typename T, typename L> class distributed_vector_accessor {
    +
    20public:
    +
    21 using element_type = T;
    +
    22 using value_type = std::remove_cv_t<T>;
    +
    23
    +
    24 using segment_type = L;
    +
    25 using const_segment_type = std::add_const_t<L>;
    +
    26 using nonconst_segment_type = std::remove_const_t<L>;
    +
    27
    +
    28 using size_type = std::size_t;
    +
    29 using difference_type = std::ptrdiff_t;
    +
    30
    +
    31 // using pointer = typename segment_type::pointer;
    +
    32 using reference = rng::range_reference_t<segment_type>;
    +
    33
    +
    34 using iterator_category = std::random_access_iterator_tag;
    +
    35
    + + + +
    39
    +
    40 constexpr distributed_vector_accessor() noexcept = default;
    +
    41 constexpr ~distributed_vector_accessor() noexcept = default;
    + +
    43 const distributed_vector_accessor &) noexcept = default;
    + +
    45 operator=(const distributed_vector_accessor &) noexcept = default;
    +
    46
    +
    47 constexpr distributed_vector_accessor(std::span<segment_type> segments,
    +
    48 size_type segment_id, size_type idx,
    +
    49 size_type segment_size) noexcept
    +
    50 : segments_(segments), segment_id_(segment_id), idx_(idx),
    +
    51 segment_size_(segment_size) {}
    +
    52
    + +
    54 operator+=(difference_type offset) noexcept {
    +
    55 if (offset > 0) {
    +
    56 idx_ += offset;
    +
    57 if (idx_ >= segment_size_) {
    +
    58 segment_id_ += idx_ / segment_size_;
    +
    59 idx_ = idx_ % segment_size_;
    +
    60 }
    +
    61 }
    +
    62
    +
    63 if (offset < 0) {
    +
    64 size_type new_global_idx = get_global_idx() + offset;
    +
    65 segment_id_ = new_global_idx / segment_size_;
    +
    66 idx_ = new_global_idx % segment_size_;
    +
    67 }
    +
    68 return *this;
    +
    69 }
    +
    70
    +
    71 constexpr bool operator==(const iterator_accessor &other) const noexcept {
    +
    72 return segment_id_ == other.segment_id_ && idx_ == other.idx_;
    +
    73 }
    +
    74
    +
    75 constexpr difference_type
    +
    76 operator-(const iterator_accessor &other) const noexcept {
    +
    77 return difference_type(get_global_idx()) - other.get_global_idx();
    +
    78 }
    +
    79
    +
    80 constexpr bool operator<(const iterator_accessor &other) const noexcept {
    +
    81 if (segment_id_ < other.segment_id_) {
    +
    82 return true;
    +
    83 } else if (segment_id_ == other.segment_id_) {
    +
    84 return idx_ < other.idx_;
    +
    85 } else {
    +
    86 return false;
    +
    87 }
    +
    88 }
    +
    89
    +
    90 constexpr reference operator*() const noexcept {
    +
    91 return segments_[segment_id_][idx_];
    +
    92 }
    +
    93
    +
    94 auto segments() const noexcept {
    +
    95 return dr::__detail::drop_segments(segments_, segment_id_, idx_);
    +
    96 }
    +
    97
    +
    98private:
    +
    99 size_type get_global_idx() const noexcept {
    +
    100 return segment_id_ * segment_size_ + idx_;
    +
    101 }
    +
    102
    +
    103 std::span<segment_type> segments_;
    +
    104 size_type segment_id_ = 0;
    +
    105 size_type idx_ = 0;
    +
    106 size_type segment_size_ = 0;
    +
    107};
    +
    108
    +
    109template <typename T, typename L>
    + + +
    112
    +
    113// TODO: support teams, distributions
    +
    114
    +
    116template <typename T, typename Allocator = dr::sp::device_allocator<T>>
    + +
    118public:
    + +
    120 using const_segment_type =
    +
    121 std::add_const_t<dr::sp::device_vector<T, Allocator>>;
    +
    122
    +
    123 using value_type = T;
    +
    124 using size_type = std::size_t;
    +
    125 using difference_type = std::ptrdiff_t;
    +
    126
    +
    127 using pointer = decltype(std::declval<segment_type>().data());
    +
    128 using const_pointer =
    +
    129 decltype(std::declval<std::add_const_t<segment_type>>().data());
    +
    130
    +
    131 using reference = std::iter_reference_t<pointer>;
    +
    132 using const_reference = std::iter_reference_t<const_pointer>;
    +
    133
    + +
    135 using const_iterator =
    + +
    137 using allocator_type = Allocator;
    +
    138
    +
    139 distributed_vector(std::size_t count = 0) {
    +
    140 assert(dr::sp::devices().size() > 0);
    +
    141 size_ = count;
    +
    142 segment_size_ =
    +
    143 (count + dr::sp::devices().size() - 1) / dr::sp::devices().size();
    +
    144 capacity_ = segment_size_ * dr::sp::devices().size();
    +
    145
    +
    146 std::size_t rank = 0;
    +
    147 for (auto &&device : dr::sp::devices()) {
    +
    148 segments_.emplace_back(segment_type(
    +
    149 segment_size_, Allocator(dr::sp::context(), device), rank++));
    +
    150 }
    +
    151 }
    +
    152
    +
    153 distributed_vector(std::size_t count, const T &value)
    +
    154 : distributed_vector(count) {
    +
    155 dr::sp::fill(*this, value);
    +
    156 }
    +
    157
    +
    158 distributed_vector(std::initializer_list<T> init)
    +
    159 : distributed_vector(init.size()) {
    +
    160 dr::sp::copy(rng::begin(init), rng::end(init), begin());
    +
    161 }
    +
    162
    +
    163 reference operator[](size_type pos) {
    +
    164 size_type segment_id = pos / segment_size_;
    +
    165 size_type local_id = pos % segment_size_;
    +
    166 return *(segments_[segment_id].begin() + local_id);
    +
    167 }
    +
    168
    +
    169 const_reference operator[](size_type pos) const {
    +
    170 size_type segment_id = pos / segment_size_;
    +
    171 size_type local_id = pos % segment_size_;
    +
    172 return *(segments_[segment_id].begin() + local_id);
    +
    173 }
    +
    174
    +
    175 size_type size() const noexcept { return size_; }
    +
    176
    +
    177 auto segments() { return dr::__detail::take_segments(segments_, size()); }
    +
    178
    +
    179 auto segments() const {
    +
    180 return dr::__detail::take_segments(segments_, size());
    +
    181 }
    +
    182
    +
    183 iterator begin() { return iterator(segments_, 0, 0, segment_size_); }
    +
    184
    +
    185 const_iterator begin() const {
    +
    186 return const_iterator(segments_, 0, 0, segment_size_);
    +
    187 }
    +
    188
    +
    189 iterator end() {
    +
    190 return size_ ? iterator(segments_, size() / segment_size_,
    +
    191 size() % segment_size_, segment_size_)
    +
    192 : begin();
    +
    193 }
    +
    194
    +
    195 const_iterator end() const {
    +
    196 return size_ ? const_iterator(segments_, size() / segment_size_,
    +
    197 size() % segment_size_, segment_size_)
    +
    198 : begin();
    +
    199 }
    +
    200
    +
    201 void resize(size_type count, const value_type &value) {
    +
    202 distributed_vector<T, Allocator> other(count, value);
    +
    203 std::size_t copy_size = std::min(other.size(), size());
    +
    204 dr::sp::copy(begin(), begin() + copy_size, other.begin());
    +
    205 *this = std::move(other);
    +
    206 }
    +
    207
    +
    208 void resize(size_type count) { resize(count, value_type{}); }
    +
    209
    +
    210private:
    +
    211 std::vector<segment_type> segments_;
    +
    212 std::size_t capacity_ = 0;
    +
    213 std::size_t size_ = 0;
    +
    214 std::size_t segment_size_ = 0;
    +
    215};
    +
    216
    +
    217} // namespace dr::sp
    +
    Definition: iterator_adaptor.hpp:23
    +
    Definition: device_vector.hpp:13
    +
    Definition: distributed_vector.hpp:19
    +
    distributed vector
    Definition: distributed_vector.hpp:117
    +
    + + + + diff --git a/doxygen/sp_2views_2enumerate_8hpp_source.html b/doxygen/sp_2views_2enumerate_8hpp_source.html new file mode 100644 index 0000000000..557e3c2ab0 --- /dev/null +++ b/doxygen/sp_2views_2enumerate_8hpp_source.html @@ -0,0 +1,144 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/views/enumerate.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    enumerate.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/sp/zip_view.hpp>
    +
    8
    +
    9namespace dr::sp {
    +
    10
    +
    11namespace views {
    +
    12
    +
    13namespace {
    +
    14
    +
    15template <rng::range R> struct range_size {
    +
    16 using type = std::size_t;
    +
    17};
    +
    18
    +
    19template <rng::sized_range R> struct range_size<R> {
    +
    20 using type = rng::range_size_t<R>;
    +
    21};
    +
    22
    +
    23template <rng::range R> using range_size_t = typename range_size<R>::type;
    +
    24
    +
    25} // namespace
    +
    26
    + +
    28public:
    +
    29 template <rng::viewable_range R>
    +
    30 requires(rng::sized_range<R>)
    +
    31 auto operator()(R &&r) const {
    +
    32 using W = std::uint32_t;
    +
    33 return dr::sp::zip_view(rng::views::iota(W(0), W(rng::size(r))),
    +
    34 std::forward<R>(r));
    +
    35 }
    +
    36
    +
    37 template <rng::viewable_range R>
    +
    38 friend auto operator|(R &&r, const enumerate_adapter_closure &closure) {
    +
    39 return closure(std::forward<R>(r));
    +
    40 }
    +
    41};
    +
    42
    + +
    44public:
    +
    45 template <rng::viewable_range R> constexpr auto operator()(R &&r) const {
    +
    46 return enumerate_adapter_closure{}(std::forward<R>(r));
    +
    47 }
    +
    48
    +
    49 inline auto enumerate() const { return enumerate_adapter_closure{}; }
    +
    50};
    +
    51
    +
    52inline constexpr auto enumerate = enumerate_fn_{};
    +
    53
    +
    54} // namespace views
    +
    55
    +
    56} // namespace dr::sp
    +
    Definition: enumerate.hpp:27
    +
    Definition: enumerate.hpp:43
    +
    zip
    Definition: zip_view.hpp:108
    +
    + + + + diff --git a/doxygen/sp_2views_2views_8hpp_source.html b/doxygen/sp_2views_2views_8hpp_source.html new file mode 100644 index 0000000000..5a5b89b618 --- /dev/null +++ b/doxygen/sp_2views_2views_8hpp_source.html @@ -0,0 +1,111 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/views/views.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    views.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/sp/views/standard_views.hpp>
    +
    8#include <dr/views/iota.hpp>
    +
    9#include <dr/views/transform.hpp>
    +
    10#include <dr/views/views.hpp>
    +
    11
    +
    12namespace dr::sp::views {
    +
    13
    +
    14inline constexpr auto all = rng::views::all;
    +
    15
    +
    16inline constexpr auto counted = rng::views::counted;
    +
    17
    +
    18inline constexpr auto drop = rng::views::drop;
    +
    19
    +
    20inline constexpr auto iota = dr::views::iota;
    +
    21
    +
    22inline constexpr auto take = rng::views::take;
    +
    23
    +
    24inline constexpr auto transform = dr::views::transform;
    +
    25
    +
    26} // namespace dr::sp::views
    +
    + + + + diff --git a/doxygen/sp_8hpp_source.html b/doxygen/sp_8hpp_source.html new file mode 100644 index 0000000000..ac6e111557 --- /dev/null +++ b/doxygen/sp_8hpp_source.html @@ -0,0 +1,105 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    sp.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/detail/logger.hpp>
    +
    8#include <dr/sp/algorithms/algorithms.hpp>
    +
    9#include <dr/sp/containers/distributed_dense_matrix.hpp>
    +
    10#include <dr/sp/containers/sparse_matrix.hpp>
    +
    11#include <dr/sp/detail.hpp>
    +
    12#include <dr/sp/distributed_span.hpp>
    +
    13#include <dr/sp/distributed_vector.hpp>
    +
    14#include <dr/sp/init.hpp>
    +
    15#include <dr/sp/range.hpp>
    +
    16#include <dr/sp/range_adaptors.hpp>
    +
    17#include <dr/sp/util.hpp>
    +
    18#include <dr/sp/util/matrix_io.hpp>
    +
    19#include <dr/sp/views/views.hpp>
    +
    20#include <dr/views/views.hpp>
    +
    + + + + diff --git a/doxygen/span_8hpp_source.html b/doxygen/span_8hpp_source.html new file mode 100644 index 0000000000..c034e42c8c --- /dev/null +++ b/doxygen/span_8hpp_source.html @@ -0,0 +1,148 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/span.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    span.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <iterator>
    +
    8
    +
    9#include <dr/detail/ranges_shim.hpp>
    +
    10
    +
    11namespace dr::sp {
    +
    12
    +
    13template <typename T, rng::random_access_iterator Iter = T *>
    +
    14class span : public rng::view_interface<dr::sp::span<T, Iter>> {
    +
    15public:
    +
    16 static_assert(std::is_same_v<std::iter_value_t<Iter>, T>);
    +
    17
    +
    18 using value_type = std::iter_value_t<Iter>;
    +
    19 using size_type = std::size_t;
    +
    20 using difference_type = std::iter_difference_t<Iter>;
    +
    21 using reference = std::iter_reference_t<Iter>;
    +
    22 using iterator = Iter;
    +
    23
    +
    24 template <rng::random_access_range R>
    +
    25 span(R &&r) : begin_(rng::begin(r)), end_(rng::end(r)) {}
    +
    26 span(Iter first, Iter last) : begin_(first), end_(last) {}
    +
    27 span(Iter first, std::size_t count) : begin_(first), end_(first + count) {}
    +
    28
    +
    29 span() = default;
    +
    30 span(const span &) noexcept = default;
    +
    31 span &operator=(const span &) noexcept = default;
    +
    32
    +
    33 std::size_t size() const noexcept { return std::size_t(end() - begin()); }
    +
    34
    +
    35 bool empty() const noexcept { return size() == 0; }
    +
    36
    +
    37 Iter begin() const noexcept { return begin_; }
    +
    38
    +
    39 Iter end() const noexcept { return end_; }
    +
    40
    +
    41 reference operator[](size_type index) const { return *(begin() + index); }
    +
    42
    +
    43 span first(size_type n) const { return span(begin(), begin() + n); }
    +
    44
    +
    45 span last(size_type n) const { return span(end() - n, end()); }
    +
    46
    +
    47 span subspan(std::size_t offset, std::size_t count) const {
    +
    48 return span(begin() + offset, begin() + offset + count);
    +
    49 }
    +
    50
    +
    51private:
    +
    52 Iter begin_, end_;
    +
    53};
    +
    54
    +
    55template <rng::random_access_range R>
    +
    56span(R &&) -> span<rng::range_value_t<R>, rng::iterator_t<R>>;
    +
    57
    +
    58template <rng::random_access_iterator Iter>
    +
    59span(Iter first, std::size_t count) -> span<std::iter_value_t<Iter>, Iter>;
    +
    60
    +
    61} // namespace dr::sp
    +
    Definition: index.hpp:34
    +
    Definition: span.hpp:14
    +
    + + + + diff --git a/doxygen/sparse__matrix_8hpp_source.html b/doxygen/sparse__matrix_8hpp_source.html new file mode 100644 index 0000000000..83b44c394c --- /dev/null +++ b/doxygen/sparse__matrix_8hpp_source.html @@ -0,0 +1,522 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/sparse_matrix.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    sparse_matrix.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/detail/index.hpp>
    +
    8#include <dr/sp/algorithms/copy.hpp>
    +
    9#include <dr/sp/containers/matrix_entry.hpp>
    +
    10#include <dr/sp/containers/matrix_partition.hpp>
    +
    11#include <dr/sp/device_vector.hpp>
    +
    12#include <dr/sp/distributed_span.hpp>
    +
    13#include <dr/sp/init.hpp>
    +
    14#include <dr/sp/util/generate_random.hpp>
    +
    15#include <dr/sp/views/csr_matrix_view.hpp>
    +
    16#include <iterator>
    +
    17
    +
    18namespace dr::sp {
    +
    19
    +
    20template <rng::random_access_range Segments>
    +
    21 requires(rng::viewable_range<Segments>)
    + +
    23public:
    +
    24 using segment_type = rng::range_value_t<Segments>;
    +
    25
    +
    26 using value_type = rng::range_value_t<segment_type>;
    +
    27
    +
    28 using size_type = rng::range_size_t<segment_type>;
    +
    29 using difference_type = rng::range_difference_t<segment_type>;
    +
    30
    +
    31 using reference = rng::range_reference_t<segment_type>;
    +
    32
    +
    33 using iterator_category = std::random_access_iterator_tag;
    +
    34
    + + + +
    38
    +
    39 constexpr distributed_range_accessor() noexcept = default;
    +
    40 constexpr ~distributed_range_accessor() noexcept = default;
    + +
    42 const distributed_range_accessor &) noexcept = default;
    + +
    44 operator=(const distributed_range_accessor &) noexcept = default;
    +
    45
    +
    46 constexpr distributed_range_accessor(Segments segments, size_type segment_id,
    +
    47 size_type idx) noexcept
    +
    48 : segments_(rng::views::all(std::forward<Segments>(segments))),
    +
    49 segment_id_(segment_id), idx_(idx) {
    +
    50 while (idx_ >= rng::size((*(segments_.begin() + segment_id_))) &&
    +
    51 segment_id_ < rng::size(segments_)) {
    +
    52 segment_id_++;
    +
    53 idx_ = 0;
    +
    54 }
    +
    55 }
    +
    56
    + +
    58 operator+=(difference_type offset) noexcept {
    +
    59
    +
    60 while (offset > 0) {
    +
    61 difference_type current_offset = std::min(
    +
    62 offset,
    +
    63 difference_type(rng::size(*(segments_.begin() + segment_id_))) -
    +
    64 difference_type(idx_));
    +
    65 idx_ += current_offset;
    +
    66 offset -= current_offset;
    +
    67
    +
    68 while (idx_ >= rng::size((*(segments_.begin() + segment_id_))) &&
    +
    69 segment_id_ < rng::size(segments_)) {
    +
    70 segment_id_++;
    +
    71 idx_ = 0;
    +
    72 }
    +
    73 }
    +
    74
    +
    75 while (offset < 0) {
    +
    76 difference_type current_offset =
    +
    77 std::min(-offset, difference_type(idx_) + 1);
    +
    78
    +
    79 difference_type new_idx = difference_type(idx_) - current_offset;
    +
    80
    +
    81 while (new_idx < 0 && segment_id_ > 0) {
    +
    82 segment_id_--;
    +
    83 new_idx = rng::size(*(segments_.begin() + segment_id_)) - 1;
    +
    84 }
    +
    85
    +
    86 idx_ = new_idx;
    +
    87 offset += current_offset;
    +
    88 }
    +
    89
    +
    90 assert(offset == 0);
    +
    91 return *this;
    +
    92 }
    +
    93
    +
    94 constexpr bool operator==(const iterator_accessor &other) const noexcept {
    +
    95 return segment_id_ == other.segment_id_ && idx_ == other.idx_;
    +
    96 }
    +
    97
    +
    98 constexpr difference_type
    +
    99 operator-(const iterator_accessor &other) const noexcept {
    +
    100 return difference_type(get_global_idx()) - other.get_global_idx();
    +
    101 }
    +
    102
    +
    103 constexpr bool operator<(const iterator_accessor &other) const noexcept {
    +
    104 if (segment_id_ < other.segment_id_) {
    +
    105 return true;
    +
    106 } else if (segment_id_ == other.segment_id_) {
    +
    107 return idx_ < other.idx_;
    +
    108 } else {
    +
    109 return false;
    +
    110 }
    +
    111 }
    +
    112
    +
    113 constexpr reference operator*() const noexcept {
    +
    114 return *((*(segments_.begin() + segment_id_)).begin() + idx_);
    +
    115 }
    +
    116
    +
    117private:
    +
    118 size_type get_global_idx() const noexcept {
    +
    119 size_type cumulative_size = 0;
    +
    120 for (std::size_t i = 0; i < segment_id_; i++) {
    +
    121 cumulative_size += segments_[i].size();
    +
    122 }
    +
    123 return cumulative_size + idx_;
    +
    124 }
    +
    125
    +
    126 rng::views::all_t<Segments> segments_;
    +
    127 size_type segment_id_ = 0;
    +
    128 size_type idx_ = 0;
    +
    129};
    +
    130
    +
    131template <typename Segments>
    + + +
    134
    +
    135template <typename T, std::integral I = std::int64_t> class sparse_matrix {
    +
    136public:
    +
    137 using size_type = std::size_t;
    +
    138 using difference_type = std::ptrdiff_t;
    +
    139
    + +
    141
    +
    142 using scalar_reference = rng::range_reference_t<
    + +
    144 using const_scalar_reference = rng::range_reference_t<
    + +
    146
    + + +
    149
    +
    150 using key_type = dr::index<I>;
    +
    151
    + +
    153 T, I,
    +
    154 rng::iterator_t<dr::sp::device_vector<T, dr::sp::device_allocator<T>>>,
    +
    155 rng::iterator_t<dr::sp::device_vector<I, dr::sp::device_allocator<I>>>>;
    +
    156
    +
    157 // using iterator = sparse_matrix_iterator<T, dr::sp::device_vector<T,
    +
    158 // dr::sp::device_allocator<T>>>;
    +
    159 using iterator =
    + +
    161
    + +
    163 : shape_(shape), partition_(default_partition_()) {
    +
    164 init_();
    +
    165 }
    +
    166
    +
    167 sparse_matrix(key_type shape, double density)
    +
    168 : shape_(shape), partition_(default_partition_()) {
    +
    169 init_random_(density);
    +
    170 }
    +
    171
    +
    172 sparse_matrix(key_type shape, double density,
    +
    173 const matrix_partition &partition)
    +
    174 : shape_(shape), partition_(partition.clone()) {
    +
    175 init_random_(density);
    +
    176 }
    +
    177
    +
    178 sparse_matrix(key_type shape, const matrix_partition &partition)
    +
    179 : shape_(shape), partition_(partition.clone()) {
    +
    180 init_();
    +
    181 }
    +
    182
    +
    183 size_type size() const noexcept { return total_nnz_; }
    +
    184
    +
    185 key_type shape() const noexcept { return shape_; }
    +
    186
    +
    187 iterator begin() { return iterator(segments(), 0, 0); }
    +
    188
    +
    189 iterator end() {
    +
    190 return iterator(segments(), grid_shape_[0] * grid_shape_[1], 0);
    +
    191 }
    +
    192
    +
    193 segment_type tile(key_type tile_index) {
    +
    194 std::size_t tile_idx = tile_index[0] * grid_shape_[1] + tile_index[1];
    +
    195 auto values = values_[tile_idx].begin();
    +
    196 auto rowptr = rowptr_[tile_idx].begin();
    +
    197 auto colind = colind_[tile_idx].begin();
    +
    198 auto nnz = nnz_[tile_idx];
    +
    199
    +
    200 std::size_t tm =
    +
    201 std::min(tile_shape_[0], shape()[0] - tile_index[0] * tile_shape_[0]);
    +
    202 std::size_t tn =
    +
    203 std::min(tile_shape_[1], shape()[1] - tile_index[1] * tile_shape_[1]);
    +
    204
    +
    205 return segment_type(values, rowptr, colind, key_type(tm, tn), nnz,
    +
    206 values_[tile_idx].rank());
    +
    207 }
    +
    208
    +
    209 // Note: this function is currently *not* asynchronous due to a deadlock
    +
    210 // in `gemv_benchmark`. I believe this is a SYCL bug.
    +
    211 template <typename... Args>
    +
    212 auto copy_tile_async(key_type tile_index,
    + +
    214 std::size_t tile_idx = tile_index[0] * grid_shape_[1] + tile_index[1];
    +
    215 auto &&values = values_[tile_idx];
    +
    216 auto &&colind = colind_[tile_idx];
    +
    217 auto &&rowptr = rowptr_[tile_idx];
    +
    218 auto &&nnz = nnz_[tile_idx];
    +
    219
    +
    220 total_nnz_ -= nnz;
    +
    221 nnz = tile_view.size();
    +
    222
    +
    223 total_nnz_ += tile_view.size();
    +
    224
    +
    225 values.resize(tile_view.size());
    +
    226 colind.resize(tile_view.size());
    +
    227 rowptr.resize(tile_view.shape()[0] + 1);
    +
    228
    +
    229 auto v_e = dr::sp::copy_async(tile_view.values_data(),
    +
    230 tile_view.values_data() + values.size(),
    +
    231 values.data());
    +
    232
    +
    233 auto c_e = dr::sp::copy_async(tile_view.colind_data(),
    +
    234 tile_view.colind_data() + colind.size(),
    +
    235 colind.data());
    +
    236
    +
    237 auto r_e = dr::sp::copy_async(tile_view.rowptr_data(),
    +
    238 tile_view.rowptr_data() + rowptr.size(),
    +
    239 rowptr.data());
    +
    240
    +
    241 tiles_ = generate_tiles_();
    +
    242 segments_ = generate_segments_();
    +
    243
    +
    244 v_e.wait();
    +
    245 c_e.wait();
    +
    246 r_e.wait();
    +
    247
    +
    248 return __detail::combine_events({v_e, c_e, r_e});
    +
    249 }
    +
    250
    +
    251 template <typename... Args>
    +
    252 void copy_tile(key_type tile_index,
    + +
    254 copy_tile_async(tile_index, tile_view).wait();
    +
    255 }
    +
    256
    +
    257 key_type tile_shape() const noexcept { return tile_shape_; }
    +
    258
    +
    259 key_type grid_shape() const noexcept { return grid_shape_; }
    +
    260
    +
    261 std::span<segment_type> tiles() { return std::span(tiles_); }
    +
    262
    +
    263 std::span<segment_type> segments() { return std::span(segments_); }
    +
    264
    +
    265private:
    +
    266 std::vector<segment_type> generate_tiles_() {
    +
    267 std::vector<segment_type> views_;
    +
    268
    +
    269 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
    +
    270 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
    +
    271 std::size_t tm = std::min<std::size_t>(tile_shape_[0],
    +
    272 shape()[0] - i * tile_shape_[0]);
    +
    273 std::size_t tn = std::min<std::size_t>(tile_shape_[1],
    +
    274 shape()[1] - j * tile_shape_[1]);
    +
    275
    +
    276 std::size_t tile_idx = i * grid_shape_[1] + j;
    +
    277
    +
    278 auto values = values_[tile_idx].begin();
    +
    279 auto rowptr = rowptr_[tile_idx].begin();
    +
    280 auto colind = colind_[tile_idx].begin();
    +
    281 auto nnz = nnz_[tile_idx];
    +
    282
    +
    283 views_.emplace_back(values, rowptr, colind, key_type(tm, tn), nnz,
    +
    284 values_[tile_idx].rank());
    +
    285 }
    +
    286 }
    +
    287 return views_;
    +
    288 }
    +
    289
    +
    290 std::vector<segment_type> generate_segments_() {
    +
    291 std::vector<segment_type> views_;
    +
    292
    +
    293 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
    +
    294 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
    +
    295 std::size_t tm = std::min<std::size_t>(tile_shape_[0],
    +
    296 shape()[0] - i * tile_shape_[0]);
    +
    297 std::size_t tn = std::min<std::size_t>(tile_shape_[1],
    +
    298 shape()[1] - j * tile_shape_[1]);
    +
    299
    +
    300 std::size_t tile_idx = i * grid_shape_[1] + j;
    +
    301
    +
    302 auto values = values_[tile_idx].begin();
    +
    303 auto rowptr = rowptr_[tile_idx].begin();
    +
    304 auto colind = colind_[tile_idx].begin();
    +
    305 auto nnz = nnz_[tile_idx];
    +
    306
    +
    307 std::size_t m_offset = i * tile_shape_[0];
    +
    308 std::size_t n_offset = j * tile_shape_[1];
    +
    309
    +
    310 views_.emplace_back(values, rowptr, colind, key_type(tm, tn), nnz,
    +
    311 values_[i * grid_shape_[1] + j].rank(),
    +
    312 key_type(m_offset, n_offset));
    +
    313 }
    +
    314 }
    +
    315 return views_;
    +
    316 }
    +
    317
    +
    318private:
    +
    319 void init_() {
    +
    320 grid_shape_ = key_type(partition_->grid_shape(shape()));
    +
    321 tile_shape_ = key_type(partition_->tile_shape(shape()));
    +
    322
    +
    323 values_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    324 rowptr_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    325 colind_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    326 nnz_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    327
    +
    328 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
    +
    329 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
    +
    330 std::size_t rank = partition_->tile_rank(shape(), {i, j});
    +
    331
    +
    332 auto device = dr::sp::devices()[rank];
    +
    333 dr::sp::device_allocator<T> alloc(dr::sp::context(), device);
    +
    334 dr::sp::device_allocator<I> i_alloc(dr::sp::context(), device);
    +
    335
    +
    336 values_.emplace_back(1, alloc, rank);
    +
    337 rowptr_.emplace_back(2, i_alloc, rank);
    +
    338 colind_.emplace_back(1, i_alloc, rank);
    +
    339 nnz_.push_back(0);
    +
    340 rowptr_.back()[0] = 0;
    +
    341 rowptr_.back()[1] = 0;
    +
    342 }
    +
    343 }
    +
    344 tiles_ = generate_tiles_();
    +
    345 segments_ = generate_segments_();
    +
    346 }
    +
    347
    +
    348 void init_random_(double density) {
    +
    349 grid_shape_ = key_type(partition_->grid_shape(shape()));
    +
    350 tile_shape_ = key_type(partition_->tile_shape(shape()));
    +
    351
    +
    352 values_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    353 rowptr_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    354 colind_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    355 nnz_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    356
    +
    357 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
    +
    358 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
    +
    359 std::size_t rank = partition_->tile_rank(shape(), {i, j});
    +
    360
    +
    361 std::size_t tm = std::min<std::size_t>(tile_shape_[0],
    +
    362 shape()[0] - i * tile_shape_[0]);
    +
    363 std::size_t tn = std::min<std::size_t>(tile_shape_[1],
    +
    364 shape()[1] - j * tile_shape_[1]);
    +
    365
    +
    366 auto device = dr::sp::devices()[rank];
    +
    367 dr::sp::device_allocator<T> alloc(dr::sp::context(), device);
    +
    368 dr::sp::device_allocator<I> i_alloc(dr::sp::context(), device);
    +
    369
    +
    370 auto seed = i * grid_shape_[1] + j;
    +
    371
    +
    372 auto csr = generate_random_csr<T, I>(key_type(tm, tn), density, seed);
    +
    373 std::size_t nnz = csr.size();
    +
    374
    + +
    376 csr.size(), alloc, rank);
    + +
    378 tm + 1, i_alloc, rank);
    +
    379
    + +
    381 csr.size(), i_alloc, rank);
    +
    382
    +
    383 dr::sp::copy(csr.values_data(), csr.values_data() + csr.size(),
    +
    384 values.data());
    +
    385 dr::sp::copy(csr.rowptr_data(), csr.rowptr_data() + tm + 1,
    +
    386 rowptr.data());
    +
    387 dr::sp::copy(csr.colind_data(), csr.colind_data() + csr.size(),
    +
    388 colind.data());
    +
    389
    +
    390 values_.push_back(std::move(values));
    +
    391 rowptr_.emplace_back(std::move(rowptr));
    +
    392 colind_.emplace_back(std::move(colind));
    +
    393 nnz_.push_back(nnz);
    +
    394 total_nnz_ += nnz;
    +
    395
    +
    396 delete[] csr.values_data();
    +
    397 delete[] csr.rowptr_data();
    +
    398 delete[] csr.colind_data();
    +
    399 }
    +
    400 }
    +
    401 tiles_ = generate_tiles_();
    +
    402 segments_ = generate_segments_();
    +
    403 }
    +
    404
    +
    405 std::unique_ptr<dr::sp::matrix_partition> default_partition_() {
    +
    406 auto ptr = dr::sp::row_cyclic();
    +
    407 return std::make_unique<dr::sp::block_cyclic>(ptr);
    +
    408 }
    +
    409
    +
    410private:
    +
    411 key_type shape_;
    +
    412 key_type grid_shape_;
    +
    413 key_type tile_shape_;
    +
    414 std::unique_ptr<dr::sp::matrix_partition> partition_;
    +
    415
    +
    416 std::vector<dr::sp::device_vector<T, dr::sp::device_allocator<T>>> values_;
    +
    417 std::vector<dr::sp::device_vector<I, dr::sp::device_allocator<I>>> rowptr_;
    +
    418 std::vector<dr::sp::device_vector<I, dr::sp::device_allocator<I>>> colind_;
    +
    419
    +
    420 std::vector<std::size_t> nnz_;
    +
    421 std::size_t total_nnz_ = 0;
    +
    422
    +
    423 std::vector<segment_type> tiles_;
    +
    424 std::vector<segment_type> segments_;
    +
    425};
    +
    426
    +
    427} // namespace dr::sp
    + +
    Definition: iterator_adaptor.hpp:23
    +
    Definition: csr_matrix_view.hpp:126
    +
    Definition: allocators.hpp:20
    +
    Definition: device_vector.hpp:13
    +
    Definition: sparse_matrix.hpp:22
    +
    Definition: matrix_entry.hpp:15
    +
    Definition: matrix_partition.hpp:23
    +
    Definition: matrix_entry.hpp:112
    +
    Definition: sparse_matrix.hpp:135
    +
    + + + + diff --git a/doxygen/splitbar.png b/doxygen/splitbar.png new file mode 100644 index 0000000000..fe895f2c58 Binary files /dev/null and b/doxygen/splitbar.png differ diff --git a/doxygen/splitbard.png b/doxygen/splitbard.png new file mode 100644 index 0000000000..8367416d75 Binary files /dev/null and b/doxygen/splitbard.png differ diff --git a/doxygen/standard__views_8hpp_source.html b/doxygen/standard__views_8hpp_source.html new file mode 100644 index 0000000000..520845f030 --- /dev/null +++ b/doxygen/standard__views_8hpp_source.html @@ -0,0 +1,135 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/views/standard_views.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    standard_views.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/detail/index.hpp>
    +
    8#include <dr/detail/segments_tools.hpp>
    +
    9#include <dr/sp/distributed_span.hpp>
    +
    10#include <dr/sp/views/enumerate.hpp>
    +
    11#include <dr/sp/zip_view.hpp>
    +
    12#include <dr/views/transform.hpp>
    +
    13
    +
    14namespace dr::sp {
    +
    15
    +
    16namespace views {
    +
    17
    +
    18template <dr::distributed_range R>
    +
    19auto slice(R &&r, dr::index<> slice_indices) {
    +
    20 return dr::sp::distributed_span(dr::ranges::segments(std::forward<R>(r)))
    +
    21 .subspan(slice_indices[0], slice_indices[1] - slice_indices[0]);
    +
    22}
    +
    23
    + +
    25public:
    +
    26 slice_adaptor_closure(dr::index<> slice_indices) : idx_(slice_indices) {}
    +
    27
    +
    28 template <rng::random_access_range R> auto operator()(R &&r) const {
    +
    29 return slice(std::forward<R>(r), idx_);
    +
    30 }
    +
    31
    +
    32 template <rng::random_access_range R>
    +
    33 friend auto operator|(R &&r, const slice_adaptor_closure &closure) {
    +
    34 return closure(std::forward<R>(r));
    +
    35 }
    +
    36
    +
    37private:
    +
    38 dr::index<> idx_;
    +
    39};
    +
    40
    +
    41inline auto slice(dr::index<> slice_indices) {
    +
    42 return slice_adaptor_closure(slice_indices);
    +
    43}
    +
    44
    +
    45} // namespace views
    +
    46
    +
    47} // namespace dr::sp
    +
    Definition: index.hpp:34
    +
    Definition: distributed_span.hpp:127
    +
    Definition: standard_views.hpp:24
    +
    + + + + diff --git a/doxygen/structdr_1_1default__memory-members.html b/doxygen/structdr_1_1default__memory-members.html new file mode 100644 index 0000000000..7be77f51e5 --- /dev/null +++ b/doxygen/structdr_1_1default__memory-members.html @@ -0,0 +1,96 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::default_memory< T > Member List
    +
    +
    + +

    This is the complete list of members for dr::default_memory< T >, including all inherited members.

    + + + + + + + + + +
    allocate(std::size_t size) (defined in dr::default_memory< T >)dr::default_memory< T >inline
    allocate(std::size_t size) (defined in dr::default_memory< T >)dr::default_memory< T >inline
    deallocate(T *p, std::size_t n) (defined in dr::default_memory< T >)dr::default_memory< T >inline
    deallocate(F *p, std::size_t n) (defined in dr::default_memory< T >)dr::default_memory< T >inline
    memcpy(void *dst, const void *src, std::size_t numBytes) (defined in dr::default_memory< T >)dr::default_memory< T >inline
    offload(F lambda) (defined in dr::default_memory< T >)dr::default_memory< T >inline
    std_allocator (defined in dr::default_memory< T >)dr::default_memory< T >
    value_type typedef (defined in dr::default_memory< T >)dr::default_memory< T >
    + + + + diff --git a/doxygen/structdr_1_1default__memory.html b/doxygen/structdr_1_1default__memory.html new file mode 100644 index 0000000000..af16cb71c9 --- /dev/null +++ b/doxygen/structdr_1_1default__memory.html @@ -0,0 +1,130 @@ + + + + + + + +Distributed Ranges: dr::default_memory< T > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::default_memory< T > Struct Template Reference
    +
    +
    + + + + +

    +Public Types

    +using value_type = T
     
    + + + + + + + + + + + + + + + + +

    +Public Member Functions

    +T * allocate (std::size_t size)
     
    +template<typename F >
    F * allocate (std::size_t size)
     
    +constexpr void deallocate (T *p, std::size_t n)
     
    +template<typename F >
    void deallocate (F *p, std::size_t n)
     
    +void memcpy (void *dst, const void *src, std::size_t numBytes)
     
    +template<typename F >
    void offload (F lambda)
     
    + + + +

    +Public Attributes

    +std::allocator< T > std_allocator
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/memory.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__drop__view.html b/doxygen/structdr_1_1is__drop__view.html new file mode 100644 index 0000000000..31ceb238ea --- /dev/null +++ b/doxygen/structdr_1_1is__drop__view.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_drop_view< T > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_drop_view< T > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_drop_view< T >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_drop_view< T >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4.html b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4.html new file mode 100644 index 0000000000..6bfe3be4ee --- /dev/null +++ b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_drop_view< rng::drop_view< T > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_drop_view< rng::drop_view< T > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_drop_view< rng::drop_view< T > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_drop_view< rng::drop_view< T > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__coll__graph.map b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..5540ed652e --- /dev/null +++ b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__coll__graph.md5 b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..14002e5a1c --- /dev/null +++ b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +b2394a6f2e80c9ffb36ae43abecef95c \ No newline at end of file diff --git a/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__coll__graph.png b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..2c791a562c Binary files /dev/null and b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__inherit__graph.map b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..5540ed652e --- /dev/null +++ b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__inherit__graph.md5 b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..14002e5a1c --- /dev/null +++ b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +b2394a6f2e80c9ffb36ae43abecef95c \ No newline at end of file diff --git a/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__inherit__graph.png b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..2c791a562c Binary files /dev/null and b/doxygen/structdr_1_1is__drop__view_3_01rng_1_1drop__view_3_01T_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__drop__view__coll__graph.map b/doxygen/structdr_1_1is__drop__view__coll__graph.map new file mode 100644 index 0000000000..af5df8b6f0 --- /dev/null +++ b/doxygen/structdr_1_1is__drop__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__drop__view__coll__graph.md5 b/doxygen/structdr_1_1is__drop__view__coll__graph.md5 new file mode 100644 index 0000000000..fc437a1562 --- /dev/null +++ b/doxygen/structdr_1_1is__drop__view__coll__graph.md5 @@ -0,0 +1 @@ +a2f91c7d6a6fb5c622edca015988d54e \ No newline at end of file diff --git a/doxygen/structdr_1_1is__drop__view__coll__graph.png b/doxygen/structdr_1_1is__drop__view__coll__graph.png new file mode 100644 index 0000000000..cc1ba18aae Binary files /dev/null and b/doxygen/structdr_1_1is__drop__view__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__drop__view__inherit__graph.map b/doxygen/structdr_1_1is__drop__view__inherit__graph.map new file mode 100644 index 0000000000..af5df8b6f0 --- /dev/null +++ b/doxygen/structdr_1_1is__drop__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__drop__view__inherit__graph.md5 b/doxygen/structdr_1_1is__drop__view__inherit__graph.md5 new file mode 100644 index 0000000000..fc437a1562 --- /dev/null +++ b/doxygen/structdr_1_1is__drop__view__inherit__graph.md5 @@ -0,0 +1 @@ +a2f91c7d6a6fb5c622edca015988d54e \ No newline at end of file diff --git a/doxygen/structdr_1_1is__drop__view__inherit__graph.png b/doxygen/structdr_1_1is__drop__view__inherit__graph.png new file mode 100644 index 0000000000..cc1ba18aae Binary files /dev/null and b/doxygen/structdr_1_1is__drop__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__iota__view.html b/doxygen/structdr_1_1is__iota__view.html new file mode 100644 index 0000000000..ab34063339 --- /dev/null +++ b/doxygen/structdr_1_1is__iota__view.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_iota_view< T > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_iota_view< T > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_iota_view< T >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_iota_view< T >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4.html b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4.html new file mode 100644 index 0000000000..9a4ecd4b70 --- /dev/null +++ b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_iota_view< rng::iota_view< W > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_iota_view< rng::iota_view< W > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_iota_view< rng::iota_view< W > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_iota_view< rng::iota_view< W > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__coll__graph.map b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..e7f848c530 --- /dev/null +++ b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__coll__graph.md5 b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..145b111463 --- /dev/null +++ b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +a9f48d4a7fc5297b8a7c19f5e6a755d7 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__coll__graph.png b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..2d28b8fc69 Binary files /dev/null and b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__inherit__graph.map b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..e7f848c530 --- /dev/null +++ b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__inherit__graph.md5 b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..145b111463 --- /dev/null +++ b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +a9f48d4a7fc5297b8a7c19f5e6a755d7 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__inherit__graph.png b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..2d28b8fc69 Binary files /dev/null and b/doxygen/structdr_1_1is__iota__view_3_01rng_1_1iota__view_3_01W_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__iota__view__coll__graph.map b/doxygen/structdr_1_1is__iota__view__coll__graph.map new file mode 100644 index 0000000000..7501f1f5da --- /dev/null +++ b/doxygen/structdr_1_1is__iota__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__iota__view__coll__graph.md5 b/doxygen/structdr_1_1is__iota__view__coll__graph.md5 new file mode 100644 index 0000000000..bb7f154d51 --- /dev/null +++ b/doxygen/structdr_1_1is__iota__view__coll__graph.md5 @@ -0,0 +1 @@ +971d254fcf9e90ba1f710154f84b8677 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__iota__view__coll__graph.png b/doxygen/structdr_1_1is__iota__view__coll__graph.png new file mode 100644 index 0000000000..6b1102c773 Binary files /dev/null and b/doxygen/structdr_1_1is__iota__view__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__iota__view__inherit__graph.map b/doxygen/structdr_1_1is__iota__view__inherit__graph.map new file mode 100644 index 0000000000..7501f1f5da --- /dev/null +++ b/doxygen/structdr_1_1is__iota__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__iota__view__inherit__graph.md5 b/doxygen/structdr_1_1is__iota__view__inherit__graph.md5 new file mode 100644 index 0000000000..bb7f154d51 --- /dev/null +++ b/doxygen/structdr_1_1is__iota__view__inherit__graph.md5 @@ -0,0 +1 @@ +971d254fcf9e90ba1f710154f84b8677 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__iota__view__inherit__graph.png b/doxygen/structdr_1_1is__iota__view__inherit__graph.png new file mode 100644 index 0000000000..6b1102c773 Binary files /dev/null and b/doxygen/structdr_1_1is__iota__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__owning__view.html b/doxygen/structdr_1_1is__owning__view.html new file mode 100644 index 0000000000..2a9ef1880f --- /dev/null +++ b/doxygen/structdr_1_1is__owning__view.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_owning_view< T > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_owning_view< T > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_owning_view< T >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_owning_view< T >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/zip_view.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__owning__view__coll__graph.map b/doxygen/structdr_1_1is__owning__view__coll__graph.map new file mode 100644 index 0000000000..1fdbdf11cc --- /dev/null +++ b/doxygen/structdr_1_1is__owning__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__owning__view__coll__graph.md5 b/doxygen/structdr_1_1is__owning__view__coll__graph.md5 new file mode 100644 index 0000000000..8bc5db7d45 --- /dev/null +++ b/doxygen/structdr_1_1is__owning__view__coll__graph.md5 @@ -0,0 +1 @@ +ef09467e54a05cc78ea660814c52f301 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__owning__view__coll__graph.png b/doxygen/structdr_1_1is__owning__view__coll__graph.png new file mode 100644 index 0000000000..63dea317cb Binary files /dev/null and b/doxygen/structdr_1_1is__owning__view__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__owning__view__inherit__graph.map b/doxygen/structdr_1_1is__owning__view__inherit__graph.map new file mode 100644 index 0000000000..1fdbdf11cc --- /dev/null +++ b/doxygen/structdr_1_1is__owning__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__owning__view__inherit__graph.md5 b/doxygen/structdr_1_1is__owning__view__inherit__graph.md5 new file mode 100644 index 0000000000..8bc5db7d45 --- /dev/null +++ b/doxygen/structdr_1_1is__owning__view__inherit__graph.md5 @@ -0,0 +1 @@ +ef09467e54a05cc78ea660814c52f301 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__owning__view__inherit__graph.png b/doxygen/structdr_1_1is__owning__view__inherit__graph.png new file mode 100644 index 0000000000..63dea317cb Binary files /dev/null and b/doxygen/structdr_1_1is__owning__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__ref__view.html b/doxygen/structdr_1_1is__ref__view.html new file mode 100644 index 0000000000..db5c7ef4ab --- /dev/null +++ b/doxygen/structdr_1_1is__ref__view.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_ref_view< T > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_ref_view< T > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_ref_view< T >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_ref_view< T >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4.html b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4.html new file mode 100644 index 0000000000..dbda435f15 --- /dev/null +++ b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_ref_view< rng::ref_view< R > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_ref_view< rng::ref_view< R > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_ref_view< rng::ref_view< R > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_ref_view< rng::ref_view< R > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__coll__graph.map b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..cce1fcce07 --- /dev/null +++ b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__coll__graph.md5 b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..57bc0cd6c6 --- /dev/null +++ b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +fd977d2e770e454b3d89ee651a6ab0ee \ No newline at end of file diff --git a/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__coll__graph.png b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..ddef788071 Binary files /dev/null and b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__inherit__graph.map b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..cce1fcce07 --- /dev/null +++ b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__inherit__graph.md5 b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..57bc0cd6c6 --- /dev/null +++ b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +fd977d2e770e454b3d89ee651a6ab0ee \ No newline at end of file diff --git a/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__inherit__graph.png b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..ddef788071 Binary files /dev/null and b/doxygen/structdr_1_1is__ref__view_3_01rng_1_1ref__view_3_01R_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__ref__view__coll__graph.map b/doxygen/structdr_1_1is__ref__view__coll__graph.map new file mode 100644 index 0000000000..b672f05972 --- /dev/null +++ b/doxygen/structdr_1_1is__ref__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__ref__view__coll__graph.md5 b/doxygen/structdr_1_1is__ref__view__coll__graph.md5 new file mode 100644 index 0000000000..aa5583741a --- /dev/null +++ b/doxygen/structdr_1_1is__ref__view__coll__graph.md5 @@ -0,0 +1 @@ +bac4e2cc71a001722b1cd79b6608d656 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__ref__view__coll__graph.png b/doxygen/structdr_1_1is__ref__view__coll__graph.png new file mode 100644 index 0000000000..6a24e8e3c2 Binary files /dev/null and b/doxygen/structdr_1_1is__ref__view__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__ref__view__inherit__graph.map b/doxygen/structdr_1_1is__ref__view__inherit__graph.map new file mode 100644 index 0000000000..b672f05972 --- /dev/null +++ b/doxygen/structdr_1_1is__ref__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__ref__view__inherit__graph.md5 b/doxygen/structdr_1_1is__ref__view__inherit__graph.md5 new file mode 100644 index 0000000000..aa5583741a --- /dev/null +++ b/doxygen/structdr_1_1is__ref__view__inherit__graph.md5 @@ -0,0 +1 @@ +bac4e2cc71a001722b1cd79b6608d656 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__ref__view__inherit__graph.png b/doxygen/structdr_1_1is__ref__view__inherit__graph.png new file mode 100644 index 0000000000..6a24e8e3c2 Binary files /dev/null and b/doxygen/structdr_1_1is__ref__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__sliding__view.html b/doxygen/structdr_1_1is__sliding__view.html new file mode 100644 index 0000000000..12f57cfaf1 --- /dev/null +++ b/doxygen/structdr_1_1is__sliding__view.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_sliding_view< T > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_sliding_view< T > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_sliding_view< T >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_sliding_view< T >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4.html b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4.html new file mode 100644 index 0000000000..9ae38314c8 --- /dev/null +++ b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_sliding_view< rng::sliding_view< T > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_sliding_view< rng::sliding_view< T > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_sliding_view< rng::sliding_view< T > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_sliding_view< rng::sliding_view< T > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__coll__graph.map b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..f9683c55d0 --- /dev/null +++ b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__coll__graph.md5 b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..880cfc71c7 --- /dev/null +++ b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +0e8dfdd907abacb79ca759ad0bc07d54 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__coll__graph.png b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..3b92771a4c Binary files /dev/null and b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__inherit__graph.map b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..f9683c55d0 --- /dev/null +++ b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__inherit__graph.md5 b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..880cfc71c7 --- /dev/null +++ b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +0e8dfdd907abacb79ca759ad0bc07d54 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__inherit__graph.png b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..3b92771a4c Binary files /dev/null and b/doxygen/structdr_1_1is__sliding__view_3_01rng_1_1sliding__view_3_01T_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__sliding__view__coll__graph.map b/doxygen/structdr_1_1is__sliding__view__coll__graph.map new file mode 100644 index 0000000000..302ba7b04b --- /dev/null +++ b/doxygen/structdr_1_1is__sliding__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__sliding__view__coll__graph.md5 b/doxygen/structdr_1_1is__sliding__view__coll__graph.md5 new file mode 100644 index 0000000000..ae32ba6be5 --- /dev/null +++ b/doxygen/structdr_1_1is__sliding__view__coll__graph.md5 @@ -0,0 +1 @@ +c082d9b8f35b2990d2bbf27644b1ff70 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__sliding__view__coll__graph.png b/doxygen/structdr_1_1is__sliding__view__coll__graph.png new file mode 100644 index 0000000000..193795997e Binary files /dev/null and b/doxygen/structdr_1_1is__sliding__view__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__sliding__view__inherit__graph.map b/doxygen/structdr_1_1is__sliding__view__inherit__graph.map new file mode 100644 index 0000000000..302ba7b04b --- /dev/null +++ b/doxygen/structdr_1_1is__sliding__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__sliding__view__inherit__graph.md5 b/doxygen/structdr_1_1is__sliding__view__inherit__graph.md5 new file mode 100644 index 0000000000..ae32ba6be5 --- /dev/null +++ b/doxygen/structdr_1_1is__sliding__view__inherit__graph.md5 @@ -0,0 +1 @@ +c082d9b8f35b2990d2bbf27644b1ff70 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__sliding__view__inherit__graph.png b/doxygen/structdr_1_1is__sliding__view__inherit__graph.png new file mode 100644 index 0000000000..193795997e Binary files /dev/null and b/doxygen/structdr_1_1is__sliding__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__subrange__view.html b/doxygen/structdr_1_1is__subrange__view.html new file mode 100644 index 0000000000..238cea82ed --- /dev/null +++ b/doxygen/structdr_1_1is__subrange__view.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_subrange_view< T > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_subrange_view< T > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_subrange_view< T >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_subrange_view< T >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4.html b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4.html new file mode 100644 index 0000000000..58643d6f10 --- /dev/null +++ b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_subrange_view< rng::subrange< T > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_subrange_view< rng::subrange< T > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_subrange_view< rng::subrange< T > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_subrange_view< rng::subrange< T > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__coll__graph.map b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..a448b8f416 --- /dev/null +++ b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__coll__graph.md5 b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..25c2966b77 --- /dev/null +++ b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +94fee86429efc7e5a71c1cdd1880752e \ No newline at end of file diff --git a/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__coll__graph.png b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..f8ebb819e6 Binary files /dev/null and b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__inherit__graph.map b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..a448b8f416 --- /dev/null +++ b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__inherit__graph.md5 b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..25c2966b77 --- /dev/null +++ b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +94fee86429efc7e5a71c1cdd1880752e \ No newline at end of file diff --git a/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__inherit__graph.png b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..f8ebb819e6 Binary files /dev/null and b/doxygen/structdr_1_1is__subrange__view_3_01rng_1_1subrange_3_01T_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__subrange__view__coll__graph.map b/doxygen/structdr_1_1is__subrange__view__coll__graph.map new file mode 100644 index 0000000000..bd386c1649 --- /dev/null +++ b/doxygen/structdr_1_1is__subrange__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__subrange__view__coll__graph.md5 b/doxygen/structdr_1_1is__subrange__view__coll__graph.md5 new file mode 100644 index 0000000000..4e2fc340e3 --- /dev/null +++ b/doxygen/structdr_1_1is__subrange__view__coll__graph.md5 @@ -0,0 +1 @@ +652e23d426a91fe5793fb43e195f2f9d \ No newline at end of file diff --git a/doxygen/structdr_1_1is__subrange__view__coll__graph.png b/doxygen/structdr_1_1is__subrange__view__coll__graph.png new file mode 100644 index 0000000000..370707b4de Binary files /dev/null and b/doxygen/structdr_1_1is__subrange__view__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__subrange__view__inherit__graph.map b/doxygen/structdr_1_1is__subrange__view__inherit__graph.map new file mode 100644 index 0000000000..bd386c1649 --- /dev/null +++ b/doxygen/structdr_1_1is__subrange__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__subrange__view__inherit__graph.md5 b/doxygen/structdr_1_1is__subrange__view__inherit__graph.md5 new file mode 100644 index 0000000000..4e2fc340e3 --- /dev/null +++ b/doxygen/structdr_1_1is__subrange__view__inherit__graph.md5 @@ -0,0 +1 @@ +652e23d426a91fe5793fb43e195f2f9d \ No newline at end of file diff --git a/doxygen/structdr_1_1is__subrange__view__inherit__graph.png b/doxygen/structdr_1_1is__subrange__view__inherit__graph.png new file mode 100644 index 0000000000..370707b4de Binary files /dev/null and b/doxygen/structdr_1_1is__subrange__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__take__view.html b/doxygen/structdr_1_1is__take__view.html new file mode 100644 index 0000000000..76a688a927 --- /dev/null +++ b/doxygen/structdr_1_1is__take__view.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_take_view< T > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_take_view< T > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_take_view< T >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_take_view< T >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4.html b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4.html new file mode 100644 index 0000000000..37e4b8987b --- /dev/null +++ b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_take_view< rng::take_view< T > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_take_view< rng::take_view< T > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_take_view< rng::take_view< T > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_take_view< rng::take_view< T > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__coll__graph.map b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..d17238c2f0 --- /dev/null +++ b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__coll__graph.md5 b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..0384f52d7e --- /dev/null +++ b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +df14a0d4b41133f525f1af75f10c3f60 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__coll__graph.png b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..0ccff0677d Binary files /dev/null and b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__inherit__graph.map b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..d17238c2f0 --- /dev/null +++ b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__inherit__graph.md5 b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..0384f52d7e --- /dev/null +++ b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +df14a0d4b41133f525f1af75f10c3f60 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__inherit__graph.png b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..0ccff0677d Binary files /dev/null and b/doxygen/structdr_1_1is__take__view_3_01rng_1_1take__view_3_01T_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__take__view__coll__graph.map b/doxygen/structdr_1_1is__take__view__coll__graph.map new file mode 100644 index 0000000000..2b8a5ece5b --- /dev/null +++ b/doxygen/structdr_1_1is__take__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__take__view__coll__graph.md5 b/doxygen/structdr_1_1is__take__view__coll__graph.md5 new file mode 100644 index 0000000000..d71720fd7b --- /dev/null +++ b/doxygen/structdr_1_1is__take__view__coll__graph.md5 @@ -0,0 +1 @@ +7fb2e69bbdde7ac7007449ec0cca1c40 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__take__view__coll__graph.png b/doxygen/structdr_1_1is__take__view__coll__graph.png new file mode 100644 index 0000000000..cb7c212aa2 Binary files /dev/null and b/doxygen/structdr_1_1is__take__view__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__take__view__inherit__graph.map b/doxygen/structdr_1_1is__take__view__inherit__graph.map new file mode 100644 index 0000000000..2b8a5ece5b --- /dev/null +++ b/doxygen/structdr_1_1is__take__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__take__view__inherit__graph.md5 b/doxygen/structdr_1_1is__take__view__inherit__graph.md5 new file mode 100644 index 0000000000..d71720fd7b --- /dev/null +++ b/doxygen/structdr_1_1is__take__view__inherit__graph.md5 @@ -0,0 +1 @@ +7fb2e69bbdde7ac7007449ec0cca1c40 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__take__view__inherit__graph.png b/doxygen/structdr_1_1is__take__view__inherit__graph.png new file mode 100644 index 0000000000..cb7c212aa2 Binary files /dev/null and b/doxygen/structdr_1_1is__take__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__zip__view.html b/doxygen/structdr_1_1is__zip__view.html new file mode 100644 index 0000000000..76c52444b9 --- /dev/null +++ b/doxygen/structdr_1_1is__zip__view.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_zip_view< T > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_zip_view< T > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_zip_view< T >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_zip_view< T >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4.html b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4.html new file mode 100644 index 0000000000..6a2ce0e6ad --- /dev/null +++ b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::is_zip_view< rng::zip_view< Views... > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::is_zip_view< rng::zip_view< Views... > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::is_zip_view< rng::zip_view< Views... > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::is_zip_view< rng::zip_view< Views... > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__coll__graph.map b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..5a9c141c11 --- /dev/null +++ b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__coll__graph.md5 b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..370b072008 --- /dev/null +++ b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +0b5ffce679f56979a39fd7ac2b3c5a08 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__coll__graph.png b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..f0d273f9e4 Binary files /dev/null and b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__inherit__graph.map b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..5a9c141c11 --- /dev/null +++ b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__inherit__graph.md5 b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..370b072008 --- /dev/null +++ b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +0b5ffce679f56979a39fd7ac2b3c5a08 \ No newline at end of file diff --git a/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__inherit__graph.png b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..f0d273f9e4 Binary files /dev/null and b/doxygen/structdr_1_1is__zip__view_3_01rng_1_1zip__view_3_01Views_8_8_8_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/structdr_1_1is__zip__view__coll__graph.map b/doxygen/structdr_1_1is__zip__view__coll__graph.map new file mode 100644 index 0000000000..b7178db2e9 --- /dev/null +++ b/doxygen/structdr_1_1is__zip__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__zip__view__coll__graph.md5 b/doxygen/structdr_1_1is__zip__view__coll__graph.md5 new file mode 100644 index 0000000000..f738559ed4 --- /dev/null +++ b/doxygen/structdr_1_1is__zip__view__coll__graph.md5 @@ -0,0 +1 @@ +99c087d18bc4b487a737135592836a9d \ No newline at end of file diff --git a/doxygen/structdr_1_1is__zip__view__coll__graph.png b/doxygen/structdr_1_1is__zip__view__coll__graph.png new file mode 100644 index 0000000000..c2ed105bbf Binary files /dev/null and b/doxygen/structdr_1_1is__zip__view__coll__graph.png differ diff --git a/doxygen/structdr_1_1is__zip__view__inherit__graph.map b/doxygen/structdr_1_1is__zip__view__inherit__graph.map new file mode 100644 index 0000000000..b7178db2e9 --- /dev/null +++ b/doxygen/structdr_1_1is__zip__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1is__zip__view__inherit__graph.md5 b/doxygen/structdr_1_1is__zip__view__inherit__graph.md5 new file mode 100644 index 0000000000..f738559ed4 --- /dev/null +++ b/doxygen/structdr_1_1is__zip__view__inherit__graph.md5 @@ -0,0 +1 @@ +99c087d18bc4b487a737135592836a9d \ No newline at end of file diff --git a/doxygen/structdr_1_1is__zip__view__inherit__graph.png b/doxygen/structdr_1_1is__zip__view__inherit__graph.png new file mode 100644 index 0000000000..c2ed105bbf Binary files /dev/null and b/doxygen/structdr_1_1is__zip__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1mp_1_1____detail_1_1any-members.html b/doxygen/structdr_1_1mp_1_1____detail_1_1any-members.html new file mode 100644 index 0000000000..01a7b5dd6e --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1____detail_1_1any-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::__detail::any Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::__detail::any, including all inherited members.

    + + +
    operator T() const noexcept (defined in dr::mp::__detail::any)dr::mp::__detail::anyinline
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1____detail_1_1any.html b/doxygen/structdr_1_1mp_1_1____detail_1_1any.html new file mode 100644 index 0000000000..e0879e1993 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1____detail_1_1any.html @@ -0,0 +1,99 @@ + + + + + + + +Distributed Ranges: dr::mp::__detail::any Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::__detail::any Struct Reference
    +
    +
    + + + + + +

    +Public Member Functions

    +template<typename T >
     operator T () const noexcept
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/md_for_each.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1____detail_1_1global__context-members.html b/doxygen/structdr_1_1mp_1_1____detail_1_1global__context-members.html new file mode 100644 index 0000000000..56ff45839b --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1____detail_1_1global__context-members.html @@ -0,0 +1,97 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::__detail::global_context Member List
    +
    + + + + + diff --git a/doxygen/structdr_1_1mp_1_1____detail_1_1global__context.html b/doxygen/structdr_1_1mp_1_1____detail_1_1global__context.html new file mode 100644 index 0000000000..279b3afba2 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1____detail_1_1global__context.html @@ -0,0 +1,134 @@ + + + + + + + +Distributed Ranges: dr::mp::__detail::global_context Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::__detail::global_context Struct Reference
    +
    +
    +
    +Collaboration diagram for dr::mp::__detail::global_context:
    +
    +
    Collaboration graph
    + + + + + +
    [legend]
    + + + + +

    +Public Member Functions

    +void init ()
     
    + + + + + + + + + + + +

    +Public Attributes

    +bool use_sycl_ = false
     
    +dr::communicator comm_
     
    +std::set< MPI_Win > wins_
     
    +dr::rma_window root_win_
     
    +std::vector< char > root_scratchpad_
     
    + + + +

    +Static Public Attributes

    +static constexpr std::size_t scratchpad_size_ = 1000000
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/global.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1____detail_1_1global__context__coll__graph.map b/doxygen/structdr_1_1mp_1_1____detail_1_1global__context__coll__graph.map new file mode 100644 index 0000000000..6ce65a69d0 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1____detail_1_1global__context__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/structdr_1_1mp_1_1____detail_1_1global__context__coll__graph.md5 b/doxygen/structdr_1_1mp_1_1____detail_1_1global__context__coll__graph.md5 new file mode 100644 index 0000000000..eaec616759 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1____detail_1_1global__context__coll__graph.md5 @@ -0,0 +1 @@ +b2d067a8a5b159689bb804934306b217 \ No newline at end of file diff --git a/doxygen/structdr_1_1mp_1_1____detail_1_1global__context__coll__graph.png b/doxygen/structdr_1_1mp_1_1____detail_1_1global__context__coll__graph.png new file mode 100644 index 0000000000..d5e18d2106 Binary files /dev/null and b/doxygen/structdr_1_1mp_1_1____detail_1_1global__context__coll__graph.png differ diff --git a/doxygen/structdr_1_1mp_1_1device__policy.html b/doxygen/structdr_1_1mp_1_1device__policy.html new file mode 100644 index 0000000000..34035dfcb2 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1device__policy.html @@ -0,0 +1,88 @@ + + + + + + + +Distributed Ranges: dr::mp::device_policy Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::device_policy Struct Reference
    +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/sycl_support.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1distribution-members.html b/doxygen/structdr_1_1mp_1_1distribution-members.html new file mode 100644 index 0000000000..8be443468f --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1distribution-members.html @@ -0,0 +1,95 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::distribution Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::distribution, including all inherited members.

    + + + + + + + + +
    granularity(std::size_t size) (defined in dr::mp::distribution)dr::mp::distributioninline
    granularity() const (defined in dr::mp::distribution)dr::mp::distributioninline
    halo(std::size_t radius) (defined in dr::mp::distribution)dr::mp::distributioninline
    halo(std::size_t prev, std::size_t next) (defined in dr::mp::distribution)dr::mp::distributioninline
    halo() const (defined in dr::mp::distribution)dr::mp::distributioninline
    periodic(bool periodic) (defined in dr::mp::distribution)dr::mp::distributioninline
    periodic() const (defined in dr::mp::distribution)dr::mp::distributioninline
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1distribution.html b/doxygen/structdr_1_1mp_1_1distribution.html new file mode 100644 index 0000000000..d546bb136e --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1distribution.html @@ -0,0 +1,116 @@ + + + + + + + +Distributed Ranges: dr::mp::distribution Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::distribution Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + +

    +Public Member Functions

    +distributionhalo (std::size_t radius)
     
    +distributionhalo (std::size_t prev, std::size_t next)
     
    +auto halo () const
     
    +distributionperiodic (bool periodic)
     
    +auto periodic () const
     
    +distributiongranularity (std::size_t size)
     
    +auto granularity () const
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/containers/distribution.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1halo__bounds-members.html b/doxygen/structdr_1_1mp_1_1halo__bounds-members.html new file mode 100644 index 0000000000..ab9d569882 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1halo__bounds-members.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::halo_bounds Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::halo_bounds, including all inherited members.

    + + + + +
    next (defined in dr::mp::halo_bounds)dr::mp::halo_bounds
    periodic (defined in dr::mp::halo_bounds)dr::mp::halo_bounds
    prev (defined in dr::mp::halo_bounds)dr::mp::halo_bounds
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1halo__bounds.html b/doxygen/structdr_1_1mp_1_1halo__bounds.html new file mode 100644 index 0000000000..7ea8b91b50 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1halo__bounds.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: dr::mp::halo_bounds Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::halo_bounds Struct Reference
    +
    +
    + + + + + + + + +

    +Public Attributes

    +std::size_t prev = 0
     
    +std::size_t next = 0
     
    +bool periodic = false
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/halo.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1halo__impl_1_1max__op-members.html b/doxygen/structdr_1_1mp_1_1halo__impl_1_1max__op-members.html new file mode 100644 index 0000000000..710b099f33 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1halo__impl_1_1max__op-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::halo_impl< Group >::max_op Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::halo_impl< Group >::max_op, including all inherited members.

    + + +
    operator()(T &a, T &b) const (defined in dr::mp::halo_impl< Group >::max_op)dr::mp::halo_impl< Group >::max_opinline
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1halo__impl_1_1max__op.html b/doxygen/structdr_1_1mp_1_1halo__impl_1_1max__op.html new file mode 100644 index 0000000000..661f9f6759 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1halo__impl_1_1max__op.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mp::halo_impl< Group >::max_op Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::halo_impl< Group >::max_op Struct Reference
    +
    +
    + + + + +

    +Public Member Functions

    +T operator() (T &a, T &b) const
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/halo.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1halo__impl_1_1min__op-members.html b/doxygen/structdr_1_1mp_1_1halo__impl_1_1min__op-members.html new file mode 100644 index 0000000000..419ee9c592 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1halo__impl_1_1min__op-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::halo_impl< Group >::min_op Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::halo_impl< Group >::min_op, including all inherited members.

    + + +
    operator()(T &a, T &b) const (defined in dr::mp::halo_impl< Group >::min_op)dr::mp::halo_impl< Group >::min_opinline
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1halo__impl_1_1min__op.html b/doxygen/structdr_1_1mp_1_1halo__impl_1_1min__op.html new file mode 100644 index 0000000000..2a95c245df --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1halo__impl_1_1min__op.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mp::halo_impl< Group >::min_op Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::halo_impl< Group >::min_op Struct Reference
    +
    +
    + + + + +

    +Public Member Functions

    +T operator() (T &a, T &b) const
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/halo.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1halo__impl_1_1multiplies__op-members.html b/doxygen/structdr_1_1mp_1_1halo__impl_1_1multiplies__op-members.html new file mode 100644 index 0000000000..f5d53c4b42 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1halo__impl_1_1multiplies__op-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::halo_impl< Group >::multiplies_op Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::halo_impl< Group >::multiplies_op, including all inherited members.

    + + +
    operator()(T &a, T &b) const (defined in dr::mp::halo_impl< Group >::multiplies_op)dr::mp::halo_impl< Group >::multiplies_opinline
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1halo__impl_1_1multiplies__op.html b/doxygen/structdr_1_1mp_1_1halo__impl_1_1multiplies__op.html new file mode 100644 index 0000000000..e6e634424b --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1halo__impl_1_1multiplies__op.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mp::halo_impl< Group >::multiplies_op Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::halo_impl< Group >::multiplies_op Struct Reference
    +
    +
    + + + + +

    +Public Member Functions

    +T operator() (T &a, T &b) const
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/halo.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1halo__impl_1_1plus__op-members.html b/doxygen/structdr_1_1mp_1_1halo__impl_1_1plus__op-members.html new file mode 100644 index 0000000000..962ddb559a --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1halo__impl_1_1plus__op-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::halo_impl< Group >::plus_op Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::halo_impl< Group >::plus_op, including all inherited members.

    + + +
    operator()(T &a, T &b) const (defined in dr::mp::halo_impl< Group >::plus_op)dr::mp::halo_impl< Group >::plus_opinline
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1halo__impl_1_1plus__op.html b/doxygen/structdr_1_1mp_1_1halo__impl_1_1plus__op.html new file mode 100644 index 0000000000..d4992f3c55 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1halo__impl_1_1plus__op.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mp::halo_impl< Group >::plus_op Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::halo_impl< Group >::plus_op Struct Reference
    +
    +
    + + + + +

    +Public Member Functions

    +T operator() (T &a, T &b) const
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/halo.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1halo__impl_1_1second__op-members.html b/doxygen/structdr_1_1mp_1_1halo__impl_1_1second__op-members.html new file mode 100644 index 0000000000..8427a8b9b6 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1halo__impl_1_1second__op-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::halo_impl< Group >::second_op Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::halo_impl< Group >::second_op, including all inherited members.

    + + +
    operator()(T &a, T &b) const (defined in dr::mp::halo_impl< Group >::second_op)dr::mp::halo_impl< Group >::second_opinline
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1halo__impl_1_1second__op.html b/doxygen/structdr_1_1mp_1_1halo__impl_1_1second__op.html new file mode 100644 index 0000000000..39e44b9084 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1halo__impl_1_1second__op.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mp::halo_impl< Group >::second_op Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::halo_impl< Group >::second_op Struct Reference
    +
    +
    + + + + +

    +Public Member Functions

    +T operator() (T &a, T &b) const
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/halo.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1mdspan__view-members.html b/doxygen/structdr_1_1mp_1_1mdspan__view-members.html new file mode 100644 index 0000000000..0e12e277ea --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1mdspan__view-members.html @@ -0,0 +1,97 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::mdspan_view< R, Rank, Layout > Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::mdspan_view< R, Rank, Layout >, including all inherited members.

    + + + + + + + + + + +
    begin() const (defined in dr::mp::mdspan_view< R, Rank, Layout >)dr::mp::mdspan_view< R, Rank, Layout >inline
    end() const (defined in dr::mp::mdspan_view< R, Rank, Layout >)dr::mp::mdspan_view< R, Rank, Layout >inline
    grid() (defined in dr::mp::mdspan_view< R, Rank, Layout >)dr::mp::mdspan_view< R, Rank, Layout >inline
    mdspan() const (defined in dr::mp::mdspan_view< R, Rank, Layout >)dr::mp::mdspan_view< R, Rank, Layout >inline
    mdspan_view(R r, dr::__detail::dr_extents< Rank > full_shape) (defined in dr::mp::mdspan_view< R, Rank, Layout >)dr::mp::mdspan_view< R, Rank, Layout >inline
    mdspan_view(R r, dr::__detail::dr_extents< Rank > full_shape, dr::__detail::dr_extents< Rank > tile_shape) (defined in dr::mp::mdspan_view< R, Rank, Layout >)dr::mp::mdspan_view< R, Rank, Layout >inline
    operator[](difference_type n) (defined in dr::mp::mdspan_view< R, Rank, Layout >)dr::mp::mdspan_view< R, Rank, Layout >inline
    rank() (defined in dr::mp::mdspan_view< R, Rank, Layout >)dr::mp::mdspan_view< R, Rank, Layout >inlinestatic
    segments() const (defined in dr::mp::mdspan_view< R, Rank, Layout >)dr::mp::mdspan_view< R, Rank, Layout >inline
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1mdspan__view.html b/doxygen/structdr_1_1mp_1_1mdspan__view.html new file mode 100644 index 0000000000..314ff9e949 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1mdspan__view.html @@ -0,0 +1,144 @@ + + + + + + + +Distributed Ranges: dr::mp::mdspan_view< R, Rank, Layout > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::mdspan_view< R, Rank, Layout > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::mp::mdspan_view< R, Rank, Layout >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::mp::mdspan_view< R, Rank, Layout >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    mdspan_view (R r, dr::__detail::dr_extents< Rank > full_shape)
     
    mdspan_view (R r, dr::__detail::dr_extents< Rank > full_shape, dr::__detail::dr_extents< Rank > tile_shape)
     
    +auto begin () const
     
    +auto end () const
     
    +auto operator[] (difference_type n)
     
    +auto mdspan () const
     
    +auto segments () const
     
    +auto grid ()
     
    + + + +

    +Static Public Member Functions

    +static constexpr auto rank ()
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views/mdspan_view.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1mdspan__view__coll__graph.map b/doxygen/structdr_1_1mp_1_1mdspan__view__coll__graph.map new file mode 100644 index 0000000000..85e993d626 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1mdspan__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1mp_1_1mdspan__view__coll__graph.md5 b/doxygen/structdr_1_1mp_1_1mdspan__view__coll__graph.md5 new file mode 100644 index 0000000000..fa5d885d0d --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1mdspan__view__coll__graph.md5 @@ -0,0 +1 @@ +bf739661bb9505ac480fc6cd57b5724c \ No newline at end of file diff --git a/doxygen/structdr_1_1mp_1_1mdspan__view__coll__graph.png b/doxygen/structdr_1_1mp_1_1mdspan__view__coll__graph.png new file mode 100644 index 0000000000..468e8e5694 Binary files /dev/null and b/doxygen/structdr_1_1mp_1_1mdspan__view__coll__graph.png differ diff --git a/doxygen/structdr_1_1mp_1_1mdspan__view__inherit__graph.map b/doxygen/structdr_1_1mp_1_1mdspan__view__inherit__graph.map new file mode 100644 index 0000000000..85e993d626 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1mdspan__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1mp_1_1mdspan__view__inherit__graph.md5 b/doxygen/structdr_1_1mp_1_1mdspan__view__inherit__graph.md5 new file mode 100644 index 0000000000..fa5d885d0d --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1mdspan__view__inherit__graph.md5 @@ -0,0 +1 @@ +bf739661bb9505ac480fc6cd57b5724c \ No newline at end of file diff --git a/doxygen/structdr_1_1mp_1_1mdspan__view__inherit__graph.png b/doxygen/structdr_1_1mp_1_1mdspan__view__inherit__graph.png new file mode 100644 index 0000000000..468e8e5694 Binary files /dev/null and b/doxygen/structdr_1_1mp_1_1mdspan__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1mp_1_1submdspan__view-members.html b/doxygen/structdr_1_1mp_1_1submdspan__view-members.html new file mode 100644 index 0000000000..ac3796a986 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1submdspan__view-members.html @@ -0,0 +1,95 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::submdspan_view< Base > Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::submdspan_view< Base >, including all inherited members.

    + + + + + + + + +
    begin() const (defined in dr::mp::submdspan_view< Base >)dr::mp::submdspan_view< Base >inline
    end() const (defined in dr::mp::submdspan_view< Base >)dr::mp::submdspan_view< Base >inline
    grid() (defined in dr::mp::submdspan_view< Base >)dr::mp::submdspan_view< Base >inline
    mdspan() const (defined in dr::mp::submdspan_view< Base >)dr::mp::submdspan_view< Base >inline
    operator[](difference_type n) (defined in dr::mp::submdspan_view< Base >)dr::mp::submdspan_view< Base >inline
    segments() const (defined in dr::mp::submdspan_view< Base >)dr::mp::submdspan_view< Base >inline
    submdspan_view(is_mdspan_view auto base, extents_type slice_starts, extents_type slice_ends) (defined in dr::mp::submdspan_view< Base >)dr::mp::submdspan_view< Base >inline
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1submdspan__view.html b/doxygen/structdr_1_1mp_1_1submdspan__view.html new file mode 100644 index 0000000000..17abe74721 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1submdspan__view.html @@ -0,0 +1,134 @@ + + + + + + + +Distributed Ranges: dr::mp::submdspan_view< Base > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::submdspan_view< Base > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::mp::submdspan_view< Base >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::mp::submdspan_view< Base >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    + + + + + + + + + + + + + + + + +

    +Public Member Functions

    submdspan_view (is_mdspan_view auto base, extents_type slice_starts, extents_type slice_ends)
     
    +auto begin () const
     
    +auto end () const
     
    +auto operator[] (difference_type n)
     
    +auto mdspan () const
     
    +auto segments () const
     
    +auto grid ()
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views/submdspan_view.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1submdspan__view__coll__graph.map b/doxygen/structdr_1_1mp_1_1submdspan__view__coll__graph.map new file mode 100644 index 0000000000..0436b0c46c --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1submdspan__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1mp_1_1submdspan__view__coll__graph.md5 b/doxygen/structdr_1_1mp_1_1submdspan__view__coll__graph.md5 new file mode 100644 index 0000000000..775ff6393c --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1submdspan__view__coll__graph.md5 @@ -0,0 +1 @@ +a248f4cce634574824b88589b63846bc \ No newline at end of file diff --git a/doxygen/structdr_1_1mp_1_1submdspan__view__coll__graph.png b/doxygen/structdr_1_1mp_1_1submdspan__view__coll__graph.png new file mode 100644 index 0000000000..92f526c60c Binary files /dev/null and b/doxygen/structdr_1_1mp_1_1submdspan__view__coll__graph.png differ diff --git a/doxygen/structdr_1_1mp_1_1submdspan__view__inherit__graph.map b/doxygen/structdr_1_1mp_1_1submdspan__view__inherit__graph.map new file mode 100644 index 0000000000..0436b0c46c --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1submdspan__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1mp_1_1submdspan__view__inherit__graph.md5 b/doxygen/structdr_1_1mp_1_1submdspan__view__inherit__graph.md5 new file mode 100644 index 0000000000..775ff6393c --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1submdspan__view__inherit__graph.md5 @@ -0,0 +1 @@ +a248f4cce634574824b88589b63846bc \ No newline at end of file diff --git a/doxygen/structdr_1_1mp_1_1submdspan__view__inherit__graph.png b/doxygen/structdr_1_1mp_1_1submdspan__view__inherit__graph.png new file mode 100644 index 0000000000..92f526c60c Binary files /dev/null and b/doxygen/structdr_1_1mp_1_1submdspan__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1range__size-members.html b/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1range__size-members.html new file mode 100644 index 0000000000..4d529193ea --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1range__size-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::views::__detail::range_size< R > Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::views::__detail::range_size< R >, including all inherited members.

    + + +
    type typedef (defined in dr::mp::views::__detail::range_size< R >)dr::mp::views::__detail::range_size< R >
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1range__size.html b/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1range__size.html new file mode 100644 index 0000000000..abce98fe27 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1range__size.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mp::views::__detail::range_size< R > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::views::__detail::range_size< R > Struct Template Reference
    +
    +
    + + + + +

    +Public Types

    +using type = std::size_t
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views/enumerate.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1range__size_3_01R_01_4-members.html b/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1range__size_3_01R_01_4-members.html new file mode 100644 index 0000000000..7439973c4d --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1range__size_3_01R_01_4-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::views::__detail::range_size< R > Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::views::__detail::range_size< R >, including all inherited members.

    + + +
    type typedef (defined in dr::mp::views::__detail::range_size< R >)dr::mp::views::__detail::range_size< R >
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1range__size_3_01R_01_4.html b/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1range__size_3_01R_01_4.html new file mode 100644 index 0000000000..45b05c405c --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1range__size_3_01R_01_4.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mp::views::__detail::range_size< R > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::views::__detail::range_size< R > Struct Template Reference
    +
    +
    + + + + +

    +Public Types

    +using type = rng::range_size_t< R >
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views/enumerate.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1sliding__fn-members.html b/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1sliding__fn-members.html new file mode 100644 index 0000000000..8eb1391700 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1sliding__fn-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mp::views::__detail::sliding_fn Member List
    +
    +
    + +

    This is the complete list of members for dr::mp::views::__detail::sliding_fn, including all inherited members.

    + + +
    operator()(Rng &&r, Int n) const (defined in dr::mp::views::__detail::sliding_fn)dr::mp::views::__detail::sliding_fninline
    + + + + diff --git a/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1sliding__fn.html b/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1sliding__fn.html new file mode 100644 index 0000000000..36adc3c612 --- /dev/null +++ b/doxygen/structdr_1_1mp_1_1views_1_1____detail_1_1sliding__fn.html @@ -0,0 +1,100 @@ + + + + + + + +Distributed Ranges: dr::mp::views::__detail::sliding_fn Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mp::views::__detail::sliding_fn Struct Reference
    +
    +
    + + + + + +

    +Public Member Functions

    +template<typename Rng , typename Int >
    +requires rng::viewable_range<Rng> && rng::forward_range<Rng> && rng::detail::integer_like_<Int>
    auto operator() (Rng &&r, Int n) const
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views/sliding.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1ranges_1_1____detail_1_1local__fn__-members.html b/doxygen/structdr_1_1ranges_1_1____detail_1_1local__fn__-members.html new file mode 100644 index 0000000000..26615300a3 --- /dev/null +++ b/doxygen/structdr_1_1ranges_1_1____detail_1_1local__fn__-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::ranges::__detail::local_fn_ Member List
    +
    +
    + +

    This is the complete list of members for dr::ranges::__detail::local_fn_, including all inherited members.

    + + + +
    operator()(T &&t) const (defined in dr::ranges::__detail::local_fn_)dr::ranges::__detail::local_fn_inline
    operator()(T &&t) const (defined in dr::ranges::__detail::local_fn_)dr::ranges::__detail::local_fn_inline
    + + + + diff --git a/doxygen/structdr_1_1ranges_1_1____detail_1_1local__fn__.html b/doxygen/structdr_1_1ranges_1_1____detail_1_1local__fn__.html new file mode 100644 index 0000000000..0a48020a60 --- /dev/null +++ b/doxygen/structdr_1_1ranges_1_1____detail_1_1local__fn__.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: dr::ranges::__detail::local_fn_ Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::ranges::__detail::local_fn_ Struct Reference
    +
    +
    + + + + + + + + +

    +Public Member Functions

    +template<typename T >
    +requires (has_local<T>)
    auto operator() (T &&t) const
     
    +template<typename T >
    decltype(auto) operator() (T &&t) const
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/ranges.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1sp_1_1____detail_1_1tuple__or__pair-members.html b/doxygen/structdr_1_1sp_1_1____detail_1_1tuple__or__pair-members.html new file mode 100644 index 0000000000..114321f57c --- /dev/null +++ b/doxygen/structdr_1_1sp_1_1____detail_1_1tuple__or__pair-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::sp::__detail::tuple_or_pair< Args > Member List
    +
    +
    + +

    This is the complete list of members for dr::sp::__detail::tuple_or_pair< Args >, including all inherited members.

    + + +
    type typedef (defined in dr::sp::__detail::tuple_or_pair< Args >)dr::sp::__detail::tuple_or_pair< Args >
    + + + + diff --git a/doxygen/structdr_1_1sp_1_1____detail_1_1tuple__or__pair.html b/doxygen/structdr_1_1sp_1_1____detail_1_1tuple__or__pair.html new file mode 100644 index 0000000000..5caf25ee6f --- /dev/null +++ b/doxygen/structdr_1_1sp_1_1____detail_1_1tuple__or__pair.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::sp::__detail::tuple_or_pair< Args > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::sp::__detail::tuple_or_pair< Args > Struct Template Reference
    +
    +
    + + + + +

    +Public Types

    +using type = std::tuple< Args... >
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/zip_view.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1sp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4-members.html b/doxygen/structdr_1_1sp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4-members.html new file mode 100644 index 0000000000..45b7b749aa --- /dev/null +++ b/doxygen/structdr_1_1sp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::sp::__detail::tuple_or_pair< T, U > Member List
    +
    +
    + +

    This is the complete list of members for dr::sp::__detail::tuple_or_pair< T, U >, including all inherited members.

    + + +
    type typedef (defined in dr::sp::__detail::tuple_or_pair< T, U >)dr::sp::__detail::tuple_or_pair< T, U >
    + + + + diff --git a/doxygen/structdr_1_1sp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4.html b/doxygen/structdr_1_1sp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4.html new file mode 100644 index 0000000000..4ce094e753 --- /dev/null +++ b/doxygen/structdr_1_1sp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::sp::__detail::tuple_or_pair< T, U > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::sp::__detail::tuple_or_pair< T, U > Struct Template Reference
    +
    +
    + + + + +

    +Public Types

    +using type = std::pair< T, U >
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/zip_view.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1sp_1_1device__allocator_1_1rebind-members.html b/doxygen/structdr_1_1sp_1_1device__allocator_1_1rebind-members.html new file mode 100644 index 0000000000..af05ff7dcc --- /dev/null +++ b/doxygen/structdr_1_1sp_1_1device__allocator_1_1rebind-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::sp::device_allocator< T, Alignment >::rebind< U > Member List
    +
    +
    + +

    This is the complete list of members for dr::sp::device_allocator< T, Alignment >::rebind< U >, including all inherited members.

    + + +
    other typedef (defined in dr::sp::device_allocator< T, Alignment >::rebind< U >)dr::sp::device_allocator< T, Alignment >::rebind< U >
    + + + + diff --git a/doxygen/structdr_1_1sp_1_1device__allocator_1_1rebind.html b/doxygen/structdr_1_1sp_1_1device__allocator_1_1rebind.html new file mode 100644 index 0000000000..fe6bf223ea --- /dev/null +++ b/doxygen/structdr_1_1sp_1_1device__allocator_1_1rebind.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::sp::device_allocator< T, Alignment >::rebind< U > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::sp::device_allocator< T, Alignment >::rebind< U > Struct Template Reference
    +
    +
    + + + + +

    +Public Types

    +using other = device_allocator< U, Alignment >
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/allocators.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1sp_1_1device__policy-members.html b/doxygen/structdr_1_1sp_1_1device__policy-members.html new file mode 100644 index 0000000000..c2e2f08e6a --- /dev/null +++ b/doxygen/structdr_1_1sp_1_1device__policy-members.html @@ -0,0 +1,94 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::sp::device_policy Member List
    +
    +
    + +

    This is the complete list of members for dr::sp::device_policy, including all inherited members.

    + + + + + + + +
    device_policy(sycl::device device) (defined in dr::sp::device_policy)dr::sp::device_policyinline
    device_policy(sycl::queue queue) (defined in dr::sp::device_policy)dr::sp::device_policyinline
    device_policy() (defined in dr::sp::device_policy)dr::sp::device_policyinline
    device_policy(R &&devices) (defined in dr::sp::device_policy)dr::sp::device_policyinline
    get_devices() noexcept (defined in dr::sp::device_policy)dr::sp::device_policyinline
    get_devices() const noexcept (defined in dr::sp::device_policy)dr::sp::device_policyinline
    + + + + diff --git a/doxygen/structdr_1_1sp_1_1device__policy.html b/doxygen/structdr_1_1sp_1_1device__policy.html new file mode 100644 index 0000000000..7bcc10d851 --- /dev/null +++ b/doxygen/structdr_1_1sp_1_1device__policy.html @@ -0,0 +1,112 @@ + + + + + + + +Distributed Ranges: dr::sp::device_policy Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::sp::device_policy Struct Reference
    +
    +
    + + + + + + + + + + + + + +

    +Public Member Functions

    device_policy (sycl::device device)
     
    device_policy (sycl::queue queue)
     
    +template<rng::range R>
    +requires (std::is_same_v<rng::range_value_t<R>, sycl::device>)
     device_policy (R &&devices)
     
    +std::span< sycl::device > get_devices () noexcept
     
    +std::span< const sycl::device > get_devices () const noexcept
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/algorithms/execution_policy.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1sp_1_1distributed__vector-members.html b/doxygen/structdr_1_1sp_1_1distributed__vector-members.html new file mode 100644 index 0000000000..89ddd86fd8 --- /dev/null +++ b/doxygen/structdr_1_1sp_1_1distributed__vector-members.html @@ -0,0 +1,114 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::sp::distributed_vector< T, Allocator > Member List
    +
    +
    + +

    This is the complete list of members for dr::sp::distributed_vector< T, Allocator >, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    allocator_type typedef (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >
    begin() (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    begin() const (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    const_iterator typedef (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >
    const_pointer typedef (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >
    const_reference typedef (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >
    const_segment_type typedef (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >
    difference_type typedef (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >
    distributed_vector(std::size_t count=0) (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    distributed_vector(std::size_t count, const T &value) (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    distributed_vector(std::initializer_list< T > init) (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    end() (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    end() const (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    iterator typedef (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >
    operator[](size_type pos) (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    operator[](size_type pos) const (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    pointer typedef (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >
    reference typedef (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >
    resize(size_type count, const value_type &value) (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    resize(size_type count) (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    segment_type typedef (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >
    segments() (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    segments() const (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    size() const noexcept (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >inline
    size_type typedef (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >
    value_type typedef (defined in dr::sp::distributed_vector< T, Allocator >)dr::sp::distributed_vector< T, Allocator >
    + + + + diff --git a/doxygen/structdr_1_1sp_1_1distributed__vector.html b/doxygen/structdr_1_1sp_1_1distributed__vector.html new file mode 100644 index 0000000000..412d2bd45c --- /dev/null +++ b/doxygen/structdr_1_1sp_1_1distributed__vector.html @@ -0,0 +1,185 @@ + + + + + + + +Distributed Ranges: dr::sp::distributed_vector< T, Allocator > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::sp::distributed_vector< T, Allocator > Struct Template Reference
    +
    +
    + +

    distributed vector + More...

    + +

    #include <distributed_vector.hpp>

    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Types

    +using segment_type = dr::sp::device_vector< T, Allocator >
     
    +using const_segment_type = std::add_const_t< dr::sp::device_vector< T, Allocator > >
     
    +using value_type = T
     
    +using size_type = std::size_t
     
    +using difference_type = std::ptrdiff_t
     
    +using pointer = decltype(std::declval< segment_type >().data())
     
    +using const_pointer = decltype(std::declval< std::add_const_t< segment_type > >().data())
     
    +using reference = std::iter_reference_t< pointer >
     
    +using const_reference = std::iter_reference_t< const_pointer >
     
    +using iterator = distributed_vector_iterator< T, segment_type >
     
    +using const_iterator = distributed_vector_iterator< const T, const_segment_type >
     
    +using allocator_type = Allocator
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    distributed_vector (std::size_t count=0)
     
    distributed_vector (std::size_t count, const T &value)
     
    distributed_vector (std::initializer_list< T > init)
     
    +reference operator[] (size_type pos)
     
    +const_reference operator[] (size_type pos) const
     
    +size_type size () const noexcept
     
    +auto segments ()
     
    +auto segments () const
     
    +iterator begin ()
     
    +const_iterator begin () const
     
    +iterator end ()
     
    +const_iterator end () const
     
    +void resize (size_type count, const value_type &value)
     
    +void resize (size_type count)
     
    +

    Detailed Description

    +
    template<typename T, typename Allocator = dr::sp::device_allocator<T>>
    +struct dr::sp::distributed_vector< T, Allocator >

    distributed vector

    +

    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doxygen/structdr_1_1views_1_1iota__fn__-members.html b/doxygen/structdr_1_1views_1_1iota__fn__-members.html new file mode 100644 index 0000000000..dd5d1eee73 --- /dev/null +++ b/doxygen/structdr_1_1views_1_1iota__fn__-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::views::iota_fn_ Member List
    +
    +
    + +

    This is the complete list of members for dr::views::iota_fn_, including all inherited members.

    + + + +
    operator()(W value) const (defined in dr::views::iota_fn_)dr::views::iota_fn_inline
    operator()(W value, Bound bound) const (defined in dr::views::iota_fn_)dr::views::iota_fn_inline
    + + + + diff --git a/doxygen/structdr_1_1views_1_1iota__fn__.html b/doxygen/structdr_1_1views_1_1iota__fn__.html new file mode 100644 index 0000000000..8c2815f90b --- /dev/null +++ b/doxygen/structdr_1_1views_1_1iota__fn__.html @@ -0,0 +1,103 @@ + + + + + + + +Distributed Ranges: dr::views::iota_fn_ Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::views::iota_fn_ Struct Reference
    +
    +
    + + + + + + + + +

    +Public Member Functions

    +template<std::integral W>
    auto operator() (W value) const
     
    +template<std::integral W, std::integral Bound>
    auto operator() (W value, Bound bound) const
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/views/iota.hpp
    • +
    +
    + + + + diff --git a/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4-members.html b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4-members.html new file mode 100644 index 0000000000..314de90ce1 --- /dev/null +++ b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    fmt::formatter< Mdspan, char > Member List
    +
    +
    + +

    This is the complete list of members for fmt::formatter< Mdspan, char >, including all inherited members.

    + + + +
    format(Mdspan mdspan, FmtContext &ctx) const (defined in fmt::formatter< Mdspan, char >)fmt::formatter< Mdspan, char >inline
    format_mdspan(auto &ctx, auto mdspan, auto &index, std::size_t dim) const (defined in fmt::formatter< Mdspan, char >)fmt::formatter< Mdspan, char >inline
    + + + + diff --git a/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4.html b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4.html new file mode 100644 index 0000000000..1f5b65d377 --- /dev/null +++ b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4.html @@ -0,0 +1,120 @@ + + + + + + + +Distributed Ranges: fmt::formatter< Mdspan, char > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    fmt::formatter< Mdspan, char > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for fmt::formatter< Mdspan, char >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for fmt::formatter< Mdspan, char >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    + + + + + + + +

    +Public Member Functions

    +template<typename FmtContext >
    auto format (Mdspan mdspan, FmtContext &ctx) const
     
    +void format_mdspan (auto &ctx, auto mdspan, auto &index, std::size_t dim) const
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/mdspan_utils.hpp
    • +
    +
    + + + + diff --git a/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__coll__graph.map b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__coll__graph.map new file mode 100644 index 0000000000..d1b9a379e3 --- /dev/null +++ b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__coll__graph.md5 b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__coll__graph.md5 new file mode 100644 index 0000000000..8048a0261a --- /dev/null +++ b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__coll__graph.md5 @@ -0,0 +1 @@ +787393ee5b4d2029036d67d19df84ced \ No newline at end of file diff --git a/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__coll__graph.png b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__coll__graph.png new file mode 100644 index 0000000000..0a15b1d70a Binary files /dev/null and b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__coll__graph.png differ diff --git a/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__inherit__graph.map b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__inherit__graph.map new file mode 100644 index 0000000000..d1b9a379e3 --- /dev/null +++ b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__inherit__graph.md5 b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..8048a0261a --- /dev/null +++ b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +787393ee5b4d2029036d67d19df84ced \ No newline at end of file diff --git a/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__inherit__graph.png b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__inherit__graph.png new file mode 100644 index 0000000000..0a15b1d70a Binary files /dev/null and b/doxygen/structfmt_1_1formatter_3_01Mdspan_00_01char_01_4__inherit__graph.png differ diff --git a/doxygen/structnostd_1_1source__location-members.html b/doxygen/structnostd_1_1source__location-members.html new file mode 100644 index 0000000000..a587d23c39 --- /dev/null +++ b/doxygen/structnostd_1_1source__location-members.html @@ -0,0 +1,95 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    nostd::source_location Member List
    +
    +
    + +

    This is the complete list of members for nostd::source_location, including all inherited members.

    + + + + + + + + +
    column() const noexcept (defined in nostd::source_location)nostd::source_locationinline
    current(const char *fileName="unsupported", const char *functionName="unsupported", const uint_least32_t lineNumber=0, const uint_least32_t columnOffset=0) noexcept (defined in nostd::source_location)nostd::source_locationinlinestatic
    file_name() const noexcept (defined in nostd::source_location)nostd::source_locationinline
    function_name() const noexcept (defined in nostd::source_location)nostd::source_locationinline
    line() const noexcept (defined in nostd::source_location)nostd::source_locationinline
    source_location(const source_location &)=default (defined in nostd::source_location)nostd::source_location
    source_location(source_location &&)=default (defined in nostd::source_location)nostd::source_location
    + + + + diff --git a/doxygen/structnostd_1_1source__location.html b/doxygen/structnostd_1_1source__location.html new file mode 100644 index 0000000000..7628649533 --- /dev/null +++ b/doxygen/structnostd_1_1source__location.html @@ -0,0 +1,120 @@ + + + + + + + +Distributed Ranges: nostd::source_location Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    nostd::source_location Struct Reference
    +
    +
    + + + + + + + + + + + + + + +

    +Public Member Functions

    source_location (const source_location &)=default
     
    source_location (source_location &&)=default
     
    +constexpr const char * file_name () const noexcept
     
    +constexpr const char * function_name () const noexcept
     
    +constexpr uint_least32_t line () const noexcept
     
    +constexpr std::uint_least32_t column () const noexcept
     
    + + + +

    +Static Public Member Functions

    +static constexpr source_location current (const char *fileName="unsupported", const char *functionName="unsupported", const uint_least32_t lineNumber=0, const uint_least32_t columnOffset=0) noexcept
     
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/vendor/source_location/source_location.hpp
    • +
    +
    + + + + diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4.html b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4.html new file mode 100644 index 0000000000..d4d89ed2f8 --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: std::tuple_element< Index, dr::index< I > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    std::tuple_element< Index, dr::index< I > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for std::tuple_element< Index, dr::index< I > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for std::tuple_element< Index, dr::index< I > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/index.hpp
    • +
    +
    + + + + diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__coll__graph.map b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..9011fdab8f --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__coll__graph.md5 b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..c210f859dc --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +e1224836b7a16209c60a5f085becfdf1 \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__coll__graph.png b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..2252aadb47 Binary files /dev/null and b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.map b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..9011fdab8f --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.md5 b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..c210f859dc --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +e1224836b7a16209c60a5f085becfdf1 \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.png b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..2252aadb47 Binary files /dev/null and b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html new file mode 100644 index 0000000000..6154676e1a --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: std::tuple_element< Index, dr::sp::matrix_entry< T, I > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    std::tuple_element< Index, dr::sp::matrix_entry< T, I > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for std::tuple_element< Index, dr::sp::matrix_entry< T, I > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for std::tuple_element< Index, dr::sp::matrix_entry< T, I > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/matrix_entry.hpp
    • +
    +
    + + + + diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.map b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..046d061958 --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.md5 b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..8fb63e339c --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +7ce33c5977498e9f95b83f0526966be3 \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.png b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..fa4612c191 Binary files /dev/null and b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.map b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..046d061958 --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.md5 b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..8fb63e339c --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +7ce33c5977498e9f95b83f0526966be3 \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.png b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..fa4612c191 Binary files /dev/null and b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html new file mode 100644 index 0000000000..d30600a34d --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: std::tuple_element< Index, dr::sp::matrix_ref< T, I, TRef > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    std::tuple_element< Index, dr::sp::matrix_ref< T, I, TRef > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for std::tuple_element< Index, dr::sp::matrix_ref< T, I, TRef > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for std::tuple_element< Index, dr::sp::matrix_ref< T, I, TRef > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/matrix_entry.hpp
    • +
    +
    + + + + diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.map b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..2aadf9471f --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.md5 b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..0dccc44d41 --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +dc31fc93764b839eee68789ffad51882 \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.png b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..b3826ab74d Binary files /dev/null and b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.map b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..2aadf9471f --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.md5 b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..0dccc44d41 --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +dc31fc93764b839eee68789ffad51882 \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.png b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..b3826ab74d Binary files /dev/null and b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4.html b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4.html new file mode 100644 index 0000000000..32fdc54fe9 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: std::tuple_size< dr::index< I > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    std::tuple_size< dr::index< I > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for std::tuple_size< dr::index< I > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for std::tuple_size< dr::index< I > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/index.hpp
    • +
    +
    + + + + diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__coll__graph.map b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..09c2ae6dce --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__coll__graph.md5 b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..9cdf7c6c83 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +63ee53349f88fac890b89317c0456308 \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__coll__graph.png b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..b6132f82c0 Binary files /dev/null and b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.map b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..09c2ae6dce --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.md5 b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..9cdf7c6c83 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +63ee53349f88fac890b89317c0456308 \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.png b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..b6132f82c0 Binary files /dev/null and b/doxygen/structstd_1_1tuple__size_3_01dr_1_1index_3_01I_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html new file mode 100644 index 0000000000..dbf8b6af16 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: std::tuple_size< dr::sp::matrix_entry< T, I > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    std::tuple_size< dr::sp::matrix_entry< T, I > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for std::tuple_size< dr::sp::matrix_entry< T, I > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for std::tuple_size< dr::sp::matrix_entry< T, I > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/matrix_entry.hpp
    • +
    +
    + + + + diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.map b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..d750482211 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.md5 b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..8199cce943 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +ddcc46f40278cc3b341553d07b068ded \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.png b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..6c8bb9f3a3 Binary files /dev/null and b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.map b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..d750482211 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.md5 b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..8199cce943 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +ddcc46f40278cc3b341553d07b068ded \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.png b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..6c8bb9f3a3 Binary files /dev/null and b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html new file mode 100644 index 0000000000..401fef88dd --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: std::tuple_size< dr::sp::matrix_ref< T, I, TRef > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    std::tuple_size< dr::sp::matrix_ref< T, I, TRef > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for std::tuple_size< dr::sp::matrix_ref< T, I, TRef > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for std::tuple_size< dr::sp::matrix_ref< T, I, TRef > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/containers/matrix_entry.hpp
    • +
    +
    + + + + diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.map b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..22a37f3ce2 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.md5 b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..b24f570aee --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +23fc92fc9e2f1d965314a0dca1f8ecbd \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.png b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..ef6a04b351 Binary files /dev/null and b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.png differ diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.map b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..22a37f3ce2 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.md5 b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..b24f570aee --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +23fc92fc9e2f1d965314a0dca1f8ecbd \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.png b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..ef6a04b351 Binary files /dev/null and b/doxygen/structstd_1_1tuple__size_3_01dr_1_1sp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.png differ diff --git a/doxygen/submdspan__view_8hpp_source.html b/doxygen/submdspan__view_8hpp_source.html new file mode 100644 index 0000000000..6b73cb16b8 --- /dev/null +++ b/doxygen/submdspan__view_8hpp_source.html @@ -0,0 +1,256 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views/submdspan_view.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    submdspan_view.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/detail/mdspan_shim.hpp>
    +
    8#include <dr/detail/ranges_shim.hpp>
    +
    9#include <dr/mp/views/mdspan_view.hpp>
    +
    10
    +
    11namespace dr::mp::__detail {
    +
    12
    +
    13//
    +
    14// Add a local mdspan to the underlying segment
    +
    15//
    +
    16template <typename BaseSegment, std::size_t Rank,
    +
    17 typename Layout = md::layout_stride>
    +
    18class mdsub_segment : public BaseSegment {
    +
    19private:
    +
    20public:
    +
    21 using index_type = dr::__detail::dr_extents<Rank>;
    +
    22
    +
    23 mdsub_segment(){};
    +
    24 mdsub_segment(BaseSegment segment, const index_type &slice_starts,
    +
    25 const index_type &slice_ends)
    +
    26 : BaseSegment(segment),
    +
    27 mdspan_(local_tile(segment, slice_starts, slice_ends)),
    +
    28 root_mdspan_(segment.mdspan()) {}
    +
    29
    +
    30 auto mdspan() const { return mdspan_; }
    +
    31 auto root_mdspan() const { return root_mdspan_; }
    +
    32
    +
    33private:
    +
    34 using T = rng::range_value_t<BaseSegment>;
    +
    35
    +
    36 static auto local_tile(BaseSegment segment, const index_type &slice_starts,
    +
    37 const index_type &slice_ends) {
    +
    38 index_type starts, ends;
    +
    39 index_type base_starts = segment.origin();
    +
    40 auto base_mdspan = segment.mdspan();
    +
    41
    +
    42 for (std::size_t i = 0; i < Rank; i++) {
    +
    43 // Clip base to area covered by requested span, and translate from global
    +
    44 // to local indexing
    +
    45 auto base_end = base_starts[i] + base_mdspan.extent(i);
    +
    46 starts[i] =
    +
    47 std::min(base_end, std::max(slice_starts[i], base_starts[i])) -
    +
    48 base_starts[i];
    +
    49 ends[i] = std::max(base_starts[i], std::min(slice_ends[i], base_end)) -
    +
    50 base_starts[i];
    +
    51 }
    +
    52
    +
    53 return dr::__detail::make_submdspan(base_mdspan, starts, ends);
    +
    54 }
    +
    55
    +
    56 md::mdspan<T, dr::__detail::md_extents<Rank>, md::layout_stride> mdspan_;
    +
    57 md::mdspan<T, dr::__detail::md_extents<Rank>, md::layout_stride> root_mdspan_;
    +
    58};
    +
    59
    +
    60} // namespace dr::mp::__detail
    +
    61
    +
    62namespace dr::mp {
    +
    63
    +
    64//
    +
    65// Wrap a mdspan view
    +
    66//
    +
    67template <is_mdspan_view Base>
    +
    68struct submdspan_view : public rng::view_interface<submdspan_view<Base>> {
    +
    69private:
    +
    70 static auto make_segments(auto base, auto slice_starts, auto slice_ends) {
    +
    71 auto make_md = [=](auto segment) {
    +
    72 return __detail::mdsub_segment(segment, slice_starts, slice_ends);
    +
    73 };
    +
    74 return dr::ranges::segments(base) | rng::views::transform(make_md);
    +
    75 }
    +
    76
    +
    77 using iterator_type = rng::iterator_t<Base>;
    +
    78 using extents_type = dr::__detail::dr_extents<Base::rank()>;
    +
    79 using difference_type = rng::iter_difference_t<iterator_type>;
    +
    80 using segments_type =
    +
    81 decltype(make_segments(std::declval<Base>(), std::declval<extents_type>(),
    +
    82 std::declval<extents_type>()));
    +
    83
    +
    84 Base base_;
    +
    85 extents_type slice_starts_;
    +
    86 extents_type slice_ends_;
    +
    87 segments_type segments_;
    +
    88
    +
    89public:
    +
    90 submdspan_view(is_mdspan_view auto base, extents_type slice_starts,
    +
    91 extents_type slice_ends)
    +
    92 : base_(base), slice_starts_(std::forward<extents_type>(slice_starts)),
    +
    93 slice_ends_(std::forward<extents_type>(slice_ends)) {
    +
    94 segments_ = make_segments(base_, slice_starts_, slice_ends_);
    +
    95 }
    +
    96
    +
    97 // Base implements random access range
    +
    98 auto begin() const { return base_.begin(); }
    +
    99 auto end() const { return base_.end(); }
    +
    100 auto operator[](difference_type n) { return base_[n]; }
    +
    101
    +
    102 auto mdspan() const {
    +
    103 return dr::__detail::make_submdspan(base_.mdspan(), slice_starts_,
    +
    104 slice_ends_);
    +
    105 }
    +
    106
    +
    107 auto segments() const { return segments_; }
    +
    108
    +
    109 // Mdspan access to grid
    +
    110 auto grid() {
    +
    111 using grid_iterator_type = rng::iterator_t<segments_type>;
    +
    112 using grid_type =
    +
    113 md::mdspan<grid_iterator_type, dr::__detail::md_extents<Base::rank()>,
    +
    114 md::layout_right,
    + +
    116 return grid_type(rng::begin(segments_), base_.grid().extents());
    +
    117 }
    +
    118};
    +
    119
    +
    120template <typename R, typename Extents>
    +
    121submdspan_view(R r, Extents slice_starts, Extents slice_ends)
    + +
    123
    +
    124} // namespace dr::mp
    +
    125
    +
    126namespace dr::mp::views {
    +
    127
    +
    128template <typename Extents> class submdspan_adapter_closure {
    +
    129public:
    +
    130 submdspan_adapter_closure(Extents slice_starts, Extents slice_ends)
    +
    131 : slice_starts_(slice_starts), slice_ends_(slice_ends) {}
    +
    132
    +
    133 template <rng::viewable_range R> auto operator()(R &&r) const {
    +
    134 return submdspan_view(std::forward<R>(r), slice_starts_, slice_ends_);
    +
    135 }
    +
    136
    +
    137 template <rng::viewable_range R>
    +
    138 friend auto operator|(R &&r, const submdspan_adapter_closure &closure) {
    +
    139 return closure(std::forward<R>(r));
    +
    140 }
    +
    141
    +
    142private:
    +
    143 Extents slice_starts_;
    +
    144 Extents slice_ends_;
    +
    145};
    +
    146
    + +
    148public:
    +
    149 template <is_mdspan_view R, typename Extents>
    +
    150 auto operator()(R r, Extents &&slice_starts, Extents &&slice_ends) const {
    +
    151 return submdspan_adapter_closure(std::forward<Extents>(slice_starts),
    +
    152 std::forward<Extents>(slice_ends))(
    +
    153 std::forward<R>(r));
    +
    154 }
    +
    155
    +
    156 template <typename Extents>
    +
    157 auto operator()(Extents &&slice_starts, Extents &&slice_ends) const {
    +
    158 return submdspan_adapter_closure(std::forward<Extents>(slice_starts),
    +
    159 std::forward<Extents>(slice_ends));
    +
    160 }
    +
    161};
    +
    162
    +
    163inline constexpr auto submdspan = submdspan_fn_{};
    +
    164
    +
    165} // namespace dr::mp::views
    +
    Definition: mdspan_utils.hpp:60
    +
    Definition: submdspan_view.hpp:18
    +
    Definition: submdspan_view.hpp:128
    +
    Definition: submdspan_view.hpp:147
    +
    Definition: mdspan_view.hpp:206
    +
    Definition: submdspan_view.hpp:68
    +
    + + + + diff --git a/doxygen/subrange_8hpp_source.html b/doxygen/subrange_8hpp_source.html new file mode 100644 index 0000000000..292d6a1d35 --- /dev/null +++ b/doxygen/subrange_8hpp_source.html @@ -0,0 +1,289 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/containers/subrange.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    subrange.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/detail/ranges_shim.hpp>
    +
    8
    +
    9namespace dr::mp {
    +
    10
    +
    11template <typename DM> class subrange_iterator {
    +
    12public:
    +
    13 using value_type = typename DM::value_type;
    +
    14 using difference_type = typename DM::difference_type;
    +
    15
    + +
    17
    +
    18 subrange_iterator(DM *dm, std::pair<std::size_t, std::size_t> row_rng,
    +
    19 std::pair<std::size_t, std::size_t> col_rng,
    +
    20 difference_type index = 0) noexcept {
    +
    21 dm_ = dm;
    +
    22 row_rng_ = row_rng;
    +
    23 col_rng_ = col_rng;
    +
    24 index_ = index;
    +
    25 }
    +
    26
    +
    27 value_type &operator*() const {
    +
    28
    +
    29 int offset = dm_->halo_bounds().prev + find_dm_offset(index_) -
    +
    30 default_comm().rank() * dm_->segment_size();
    +
    31
    +
    32 assert(offset >= 0);
    +
    33 assert(offset < (int)dm_->data_size());
    +
    34 return *(dm_->data() + offset);
    +
    35 }
    +
    36
    +
    37 dm_row<value_type> operator[](int n) {
    +
    38 std::size_t rowsize = col_rng_.second - col_rng_.first;
    +
    39
    +
    40 int offset = dm_->halo_bounds().prev +
    +
    41 find_dm_offset((int)(index_ + n * rowsize)) -
    +
    42 default_comm().rank() * dm_->segment_size();
    +
    43
    +
    44 assert(offset >= 0);
    +
    45 assert(offset < (int)dm_->data_size());
    +
    46
    +
    47 signed long idx = default_comm().rank() * dm_->segment_shape()[0]; // ??
    +
    48 value_type *ptr = dm_->data() + offset;
    +
    49 const dv_segment<DM> *segment = &(dm_->segments()[0]); // comm rank ??
    +
    50
    +
    51 return dm_row<value_type>(idx, ptr, rowsize, segment);
    +
    52 }
    +
    53
    +
    54 value_type &operator[](std::pair<int, int> p) {
    +
    55 int offset = dm_->distribution_.halo().prev + find_dm_offset(index_) -
    +
    56 default_comm().rank() * dm_->segment_size() +
    +
    57 dm_->shape()[1] * p.first + p.second;
    +
    58
    +
    59 assert(offset >= 0);
    +
    60 assert(offset < (int)dm_->data_size());
    +
    61 return *(dm_->data() + offset);
    +
    62 }
    +
    63
    +
    64 // friend operators fulfill rng::detail::weakly_equality_comparable_with_
    +
    65 friend bool operator==(subrange_iterator &first, subrange_iterator &second) {
    +
    66 return first.index_ == second.index_;
    +
    67 }
    +
    68 friend bool operator!=(subrange_iterator &first, subrange_iterator &second) {
    +
    69 return first.index_ != second.index_;
    +
    70 }
    +
    71 friend bool operator==(subrange_iterator first, subrange_iterator second) {
    +
    72 return first.index_ == second.index_;
    +
    73 }
    +
    74 friend bool operator!=(subrange_iterator first, subrange_iterator second) {
    +
    75 return first.index_ != second.index_;
    +
    76 }
    +
    77 auto operator<=>(const subrange_iterator &other) const noexcept {
    +
    78 return this->index_ <=> other.index_;
    +
    79 }
    +
    80
    +
    81 // Only these arithmetic manipulate internal state
    +
    82 auto &operator-=(difference_type n) {
    +
    83 index_ -= n;
    +
    84 return *this;
    +
    85 }
    +
    86 auto &operator+=(difference_type n) {
    +
    87 index_ += n;
    +
    88 return *this;
    +
    89 }
    +
    90
    +
    91 difference_type operator-(const subrange_iterator &other) const noexcept {
    +
    92 return index_ - other.index_;
    +
    93 }
    +
    94 // prefix
    +
    95 auto &operator++() {
    +
    96 index_ += 1;
    +
    97 return *this;
    +
    98 }
    +
    99 auto &operator--() {
    +
    100 index_ -= 1;
    +
    101 return *this;
    +
    102 }
    +
    103
    +
    104 // postfix
    +
    105 auto operator++(int) {
    +
    106 auto prev = *this;
    +
    107 index_ += 1;
    +
    108 return prev;
    +
    109 }
    +
    110 auto operator--(int) {
    +
    111 auto prev = *this;
    +
    112 index_ -= 1;
    +
    113 return prev;
    +
    114 }
    +
    115
    +
    116 auto operator+(difference_type n) const {
    +
    117 return subrange_iterator(dm_, row_rng_, col_rng_, index_ + n);
    +
    118 }
    +
    119 auto operator-(difference_type n) const {
    +
    120 return subrange_iterator(dm_, row_rng_, col_rng_, index_ - n);
    +
    121 }
    +
    122
    +
    123 // When *this is not first in the expression
    +
    124 friend auto operator+(difference_type n, const subrange_iterator &other) {
    +
    125 return other + n;
    +
    126 }
    +
    127
    +
    128 auto &halo() { return dm_->halo(); }
    +
    129 auto segments() { return dm_->segments(); }
    +
    130
    +
    131 bool is_local() { return dm_->is_local_cell(find_dm_offset(index_)); }
    +
    132
    +
    133 // for debug purposes
    +
    134 std::size_t find_dm_offset() const { return find_dm_offset(index_); }
    +
    135
    +
    136private:
    +
    137 /*
    +
    138 * converts index within subrange (viewed as linear contiguous space)
    +
    139 * into index within physical segment in dm
    +
    140 */
    +
    141 std::size_t find_dm_offset(int index) const {
    +
    142 int ind_rows, ind_cols;
    +
    143 int offset = 0;
    +
    144
    +
    145 ind_rows = index / (col_rng_.second - col_rng_.first);
    +
    146 ind_cols = index % (col_rng_.second - col_rng_.first);
    +
    147
    +
    148 if (ind_cols < 0) {
    +
    149 ind_rows -= 1;
    +
    150 ind_cols += (col_rng_.second - col_rng_.first);
    +
    151 }
    +
    152
    +
    153 offset += row_rng_.first * dm_->shape()[1] + col_rng_.first;
    +
    154 offset += (int)(ind_rows * dm_->shape()[1] + ind_cols);
    +
    155
    +
    156 return offset;
    +
    157 };
    +
    158
    +
    159private:
    +
    160 DM *dm_ = nullptr;
    +
    161 std::pair<int, int> row_rng_ = std::pair<int, int>(0, 0);
    +
    162 std::pair<int, int> col_rng_ = std::pair<int, int>(0, 0);
    +
    163
    +
    164 std::size_t index_ = 0;
    +
    165}; // class subrange_iterator
    +
    166
    +
    167template <typename DM>
    +
    168class subrange : public rng::view_interface<subrange<DM>> {
    +
    169public:
    + +
    171 using value_type = typename DM::value_type;
    +
    172
    +
    173 subrange(DM &dm, std::pair<std::size_t, std::size_t> row_rng,
    +
    174 std::pair<std::size_t, std::size_t> col_rng) {
    +
    175 dm_ = &dm;
    +
    176 row_rng_ = row_rng;
    +
    177 col_rng_ = col_rng;
    +
    178
    +
    179 subrng_size_ =
    +
    180 (col_rng.second - col_rng.first) * (row_rng.second - row_rng.first);
    +
    181 }
    +
    182
    +
    183 iterator begin() const { return iterator(dm_, row_rng_, col_rng_); }
    +
    184 iterator end() const { return begin() + subrng_size_; }
    +
    185
    +
    186 auto size() { return subrng_size_; }
    +
    187
    +
    188 auto &halo() const { return dm_->halo(); }
    +
    189 auto segments() const { return dm_->segments(); }
    +
    190
    +
    191private:
    +
    192 DM *dm_;
    +
    193 std::pair<std::size_t, std::size_t> row_rng_;
    +
    194 std::pair<std::size_t, std::size_t> col_rng_;
    +
    195
    +
    196 std::size_t subrng_size_ = 0;
    +
    197
    +
    198}; // class subrange
    +
    199
    +
    200} // namespace dr::mp
    +
    Definition: index.hpp:34
    +
    Definition: segment.hpp:214
    +
    Definition: subrange.hpp:11
    +
    Definition: subrange.hpp:168
    +
    + + + + diff --git a/doxygen/sycl__support_8hpp_source.html b/doxygen/sycl__support_8hpp_source.html new file mode 100644 index 0000000000..c1433f4a75 --- /dev/null +++ b/doxygen/sycl__support_8hpp_source.html @@ -0,0 +1,187 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/sycl_support.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    sycl_support.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7// file for helper functions working only if compiled with SYCL, assert
    +
    8// otherwise
    +
    9
    +
    10#ifdef SYCL_LANGUAGE_VERSION
    +
    11
    +
    12namespace dr::mp {
    +
    13
    +
    14sycl::queue &sycl_queue();
    +
    15
    +
    16} // namespace dr::mp
    +
    17
    +
    18namespace dr::mp::__detail {
    +
    19
    +
    20template <typename T> T sycl_get(T &v) {
    +
    21 T temp;
    +
    22 sycl_queue().memcpy(&temp, &v, sizeof(v)).wait();
    +
    23 return temp;
    +
    24}
    +
    25
    +
    26template <typename T> auto sycl_get(T &v1, T &v2) {
    +
    27 std::pair<T, T> temp;
    +
    28 auto ev1 = sycl_queue().memcpy(&temp.first, &v1, sizeof(v1));
    +
    29 auto ev2 = sycl_queue().memcpy(&temp.second, &v2, sizeof(v2));
    +
    30 ev1.wait();
    +
    31 ev2.wait();
    +
    32 return temp;
    +
    33}
    +
    34
    +
    35template <typename T> void sycl_copy(T const *begin, T const *end, T *dst) {
    +
    36 sycl_queue().memcpy(dst, begin, (end - begin) * sizeof(T)).wait();
    +
    37}
    +
    38
    +
    39template <typename T, std::size_t Alignment>
    +
    40using shared_base_allocator =
    +
    41 sycl::usm_allocator<T, sycl::usm::alloc::shared, Alignment>;
    +
    42
    +
    43}; // namespace dr::mp::__detail
    +
    44
    +
    45namespace dr::mp {
    +
    46
    +
    47template <typename T, std::size_t Alignment = 0>
    +
    48class sycl_shared_allocator
    +
    49 : public __detail::shared_base_allocator<T, Alignment> {
    +
    50public:
    +
    51 sycl_shared_allocator(sycl::queue q = sycl_queue())
    +
    52 : __detail::shared_base_allocator<T, Alignment>(q) {}
    +
    53};
    +
    54
    +
    55struct device_policy {
    +
    56 device_policy(sycl::queue q = sycl_queue()) : queue(q), dpl_policy(q) {}
    +
    57
    +
    58 sycl::queue queue;
    +
    59 decltype(oneapi::dpl::execution::make_device_policy(queue)) dpl_policy;
    +
    60};
    +
    61
    +
    62} // namespace dr::mp
    +
    63
    +
    64#else // !SYCL_LANGUAGE_VERSION
    +
    65
    +
    66namespace dr::mp {
    +
    67
    +
    68struct device_policy {};
    +
    69
    +
    70} // namespace dr::mp
    +
    71
    +
    72namespace dr::mp::__detail {
    +
    73
    +
    74// define here to avoid ifdefs where it is called
    +
    75template <typename T> T sycl_get(T &v) {
    +
    76 assert(false);
    +
    77 return v;
    +
    78}
    +
    79
    +
    80// define here to avoid ifdefs where it is called
    +
    81template <typename T> auto sycl_get(T &v1, T &v2) {
    +
    82 assert(false);
    +
    83 return std::pair<T, T>{v1, v2};
    +
    84}
    +
    85
    +
    86template <typename T> void sycl_copy(T const *begin, T const *end, T *dst) {
    +
    87 assert(false);
    +
    88}
    +
    89
    +
    90} // namespace dr::mp::__detail
    +
    91
    +
    92#endif // SYCL_LANGUAGE_VERSION
    +
    93
    +
    94namespace dr::mp::__detail {
    +
    95
    +
    96template <typename T>
    +
    97void sycl_copy(T const *src, T *dst, std::size_t size = 1) {
    +
    98 sycl_copy(src, src + size, dst);
    +
    99}
    +
    100
    +
    101} // namespace dr::mp::__detail
    +
    Definition: sycl_support.hpp:68
    +
    + + + + diff --git a/doxygen/sycl__utils_8hpp_source.html b/doxygen/sycl__utils_8hpp_source.html new file mode 100644 index 0000000000..37772497c7 --- /dev/null +++ b/doxygen/sycl__utils_8hpp_source.html @@ -0,0 +1,293 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/sycl_utils.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    sycl_utils.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <limits>
    +
    8
    +
    9#include <dr/detail/utils.hpp>
    +
    10
    +
    11#ifdef SYCL_LANGUAGE_VERSION
    +
    12
    +
    13#include <sycl/sycl.hpp>
    +
    14
    +
    15namespace dr::__detail {
    +
    16
    +
    17// With the ND-range workaround, the maximum kernel size is
    +
    18// `std::numeric_limits<std::int32_t>::max()` rounded down to
    +
    19// the nearest multiple of the block size.
    +
    20inline std::size_t max_kernel_size_(std::size_t block_size = 128) {
    +
    21 std::size_t max_kernel_size = std::numeric_limits<std::int32_t>::max();
    +
    22 return (max_kernel_size / block_size) * block_size;
    +
    23}
    +
    24
    +
    25// This is a workaround to avoid performance degradation
    +
    26// in DPC++ for odd range sizes.
    +
    27template <typename Fn>
    +
    28sycl::event parallel_for_workaround(sycl::queue &q, sycl::range<1> numWorkItems,
    +
    29 Fn &&fn, std::size_t block_size = 128) {
    +
    30 std::size_t num_blocks = (numWorkItems.size() + block_size - 1) / block_size;
    +
    31
    +
    32 int32_t range_size = numWorkItems.size();
    +
    33
    +
    34 auto event = q.parallel_for(
    +
    35 sycl::nd_range<>(num_blocks * block_size, block_size), [=](auto nd_idx) {
    +
    36 auto idx = nd_idx.get_global_id(0);
    +
    37 if (idx < range_size) {
    +
    38 fn(idx);
    +
    39 }
    +
    40 });
    +
    41 return event;
    +
    42}
    +
    43
    +
    44template <typename Fn>
    +
    45sycl::event parallel_for_64bit(sycl::queue &q, sycl::range<1> numWorkItems,
    +
    46 Fn &&fn) {
    +
    47 std::size_t block_size = 128;
    +
    48 std::size_t max_kernel_size = max_kernel_size_(block_size);
    +
    49
    +
    50 std::vector<sycl::event> events;
    +
    51 for (std::size_t base_idx = 0; base_idx < numWorkItems.size();
    +
    52 base_idx += max_kernel_size) {
    +
    53 std::size_t launch_size =
    +
    54 std::min(numWorkItems.size() - base_idx, max_kernel_size);
    +
    55
    +
    56 auto e = parallel_for_workaround(
    +
    57 q, launch_size,
    +
    58 [=](sycl::id<1> idx_) {
    +
    59 sycl::id<1> idx(base_idx + idx_);
    +
    60 fn(idx);
    +
    61 },
    +
    62 block_size);
    +
    63
    +
    64 events.push_back(e);
    +
    65 }
    +
    66
    +
    67 auto e = q.submit([&](auto &&h) {
    +
    68 h.depends_on(events);
    +
    69 // Empty host task necessary due to [CMPLRLLVM-46542]
    +
    70 h.host_task([] {});
    +
    71 });
    +
    72
    +
    73 return e;
    +
    74}
    +
    75
    +
    76//
    +
    77// return true if the device can be partitioned by affinity domain
    +
    78//
    +
    79inline auto partitionable(sycl::device device) {
    +
    80 // Earlier commits used the query API, but they return true even
    +
    81 // though a partition will fail: Intel MPI mpirun with multiple
    +
    82 // processes.
    +
    83 try {
    +
    84 device.create_sub_devices<
    +
    85 sycl::info::partition_property::partition_by_affinity_domain>(
    +
    86 sycl::info::partition_affinity_domain::numa);
    +
    87 } catch (sycl::exception const &e) {
    +
    88 if (e.code() == sycl::errc::invalid ||
    +
    89 e.code() == sycl::errc::feature_not_supported) {
    +
    90 return false;
    +
    91 } else {
    +
    92 throw;
    +
    93 }
    +
    94 }
    +
    95
    +
    96 return true;
    +
    97}
    +
    98
    +
    99// Convert a global range to a nd_range using generic block size level
    +
    100// gpu requires uniform size workgroup, so round up to a multiple of a
    +
    101// workgroup.
    +
    102template <int Dim> auto nd_range(sycl::range<Dim> global) {
    +
    103 if constexpr (Dim == 1) {
    +
    104 sycl::range local(128);
    +
    105 return sycl::nd_range<Dim>(sycl::range(round_up(global[0], local[0])),
    +
    106 local);
    +
    107 } else if constexpr (Dim == 2) {
    +
    108 sycl::range local(16, 16);
    +
    109 return sycl::nd_range<Dim>(sycl::range(round_up(global[0], local[0]),
    +
    110 round_up(global[1], local[1])),
    +
    111 local);
    +
    112 } else if constexpr (Dim == 3) {
    +
    113 sycl::range local(8, 8, 8);
    +
    114 return sycl::nd_range<Dim>(sycl::range(round_up(global[0], local[0]),
    +
    115 round_up(global[1], local[1]),
    +
    116 round_up(global[2], local[2])),
    +
    117 local);
    +
    118 } else {
    +
    119 assert(false);
    +
    120 return sycl::range(0);
    +
    121 }
    +
    122}
    +
    123
    +
    124template <typename Fn>
    +
    125sycl::event parallel_for_nd(sycl::queue &q, sycl::range<1> global, Fn &&fn) {
    +
    126 return q.parallel_for(nd_range(global), [=](auto nd_idx) {
    +
    127 auto idx0 = nd_idx.get_global_id(0);
    +
    128 if (idx0 < global[0]) {
    +
    129 fn(idx0);
    +
    130 }
    +
    131 });
    +
    132}
    +
    133
    +
    134template <typename Fn>
    +
    135sycl::event parallel_for_nd(sycl::queue &q, sycl::range<2> global, Fn &&fn) {
    +
    136 return q.parallel_for(nd_range(global), [=](auto nd_idx) {
    +
    137 auto idx0 = nd_idx.get_global_id(0);
    +
    138 auto idx1 = nd_idx.get_global_id(1);
    +
    139 if (idx0 < global[0] && idx1 < global[1]) {
    +
    140 fn(std::array{idx0, idx1});
    +
    141 }
    +
    142 });
    +
    143}
    +
    144
    +
    145template <typename Fn>
    +
    146sycl::event parallel_for_nd(sycl::queue &q, sycl::range<3> global, Fn &&fn) {
    +
    147 return q.parallel_for(nd_range(global), [=](auto nd_idx) {
    +
    148 auto idx0 = nd_idx.get_global_id(0);
    +
    149 auto idx1 = nd_idx.get_global_id(1);
    +
    150 auto idx2 = nd_idx.get_global_id(2);
    +
    151 if (idx0 < global[0] && idx1 < global[1] && idx2 < global[2]) {
    +
    152 fn(std::array{idx0, idx1, idx2});
    +
    153 }
    +
    154 });
    +
    155}
    +
    156
    +
    157auto combine_events(sycl::queue &q, const auto &events) {
    +
    158 return q.submit([&](auto &&h) {
    +
    159 h.depends_on(events);
    +
    160 // Empty host task necessary due to [CMPLRLLVM-46542]
    +
    161 h.host_task([] {});
    +
    162 });
    +
    163}
    +
    164
    +
    165template <typename Fn>
    +
    166sycl::event parallel_for(sycl::queue &q, sycl::range<1> numWorkItems, Fn &&fn) {
    +
    167 std::size_t block_size = 128;
    +
    168 std::size_t max_kernel_size = max_kernel_size_();
    +
    169
    +
    170 if (numWorkItems.size() < max_kernel_size) {
    +
    171 return parallel_for_workaround(q, numWorkItems, std::forward<Fn>(fn),
    +
    172 block_size);
    +
    173 } else {
    +
    174 return parallel_for_64bit(q, numWorkItems, std::forward<Fn>(fn));
    +
    175 }
    +
    176}
    +
    177
    +
    178template <typename Fn>
    +
    179sycl::event parallel_for(sycl::queue &q, sycl::range<2> global, Fn &&fn) {
    +
    180 auto max = std::numeric_limits<std::int32_t>::max();
    +
    181 assert(global[0] < max && global[1] < max);
    +
    182 return parallel_for_nd(q, global, fn);
    +
    183}
    +
    184
    +
    185template <typename Fn>
    +
    186sycl::event parallel_for(sycl::queue &q, sycl::range<3> global, Fn &&fn) {
    +
    187 auto max = std::numeric_limits<std::int32_t>::max();
    +
    188 assert(global[0] < max && global[1] < max && global[2] < max);
    +
    189 return parallel_for_nd(q, global, fn);
    +
    190}
    +
    191
    +
    192using event = sycl::event;
    +
    193
    +
    194} // namespace dr::__detail
    +
    195
    +
    196#else
    +
    197
    +
    198namespace dr::__detail {
    +
    199
    +
    200class event {
    +
    201public:
    +
    202 void wait() {}
    +
    203};
    +
    204
    +
    205} // namespace dr::__detail
    +
    206
    +
    207#endif // SYCL_LANGUAGE_VERSION
    +
    Definition: sycl_utils.hpp:200
    +
    + + + + diff --git a/doxygen/sync_off.png b/doxygen/sync_off.png new file mode 100644 index 0000000000..3b443fc628 Binary files /dev/null and b/doxygen/sync_off.png differ diff --git a/doxygen/sync_on.png b/doxygen/sync_on.png new file mode 100644 index 0000000000..e08320fb64 Binary files /dev/null and b/doxygen/sync_on.png differ diff --git a/doxygen/tab_a.png b/doxygen/tab_a.png new file mode 100644 index 0000000000..3b725c41c5 Binary files /dev/null and b/doxygen/tab_a.png differ diff --git a/doxygen/tab_ad.png b/doxygen/tab_ad.png new file mode 100644 index 0000000000..e34850acfc Binary files /dev/null and b/doxygen/tab_ad.png differ diff --git a/doxygen/tab_b.png b/doxygen/tab_b.png new file mode 100644 index 0000000000..e2b4a8638c Binary files /dev/null and b/doxygen/tab_b.png differ diff --git a/doxygen/tab_bd.png b/doxygen/tab_bd.png new file mode 100644 index 0000000000..91c2524986 Binary files /dev/null and b/doxygen/tab_bd.png differ diff --git a/doxygen/tab_h.png b/doxygen/tab_h.png new file mode 100644 index 0000000000..fd5cb70548 Binary files /dev/null and b/doxygen/tab_h.png differ diff --git a/doxygen/tab_hd.png b/doxygen/tab_hd.png new file mode 100644 index 0000000000..2489273d4c Binary files /dev/null and b/doxygen/tab_hd.png differ diff --git a/doxygen/tab_s.png b/doxygen/tab_s.png new file mode 100644 index 0000000000..ab478c95b6 Binary files /dev/null and b/doxygen/tab_s.png differ diff --git a/doxygen/tab_sd.png b/doxygen/tab_sd.png new file mode 100644 index 0000000000..757a565ced Binary files /dev/null and b/doxygen/tab_sd.png differ diff --git a/doxygen/tabs.css b/doxygen/tabs.css new file mode 100644 index 0000000000..71c8a4704c --- /dev/null +++ b/doxygen/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file diff --git a/doxygen/transpose_8hpp_source.html b/doxygen/transpose_8hpp_source.html new file mode 100644 index 0000000000..5ee3c779f6 --- /dev/null +++ b/doxygen/transpose_8hpp_source.html @@ -0,0 +1,355 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/algorithms/transpose.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    transpose.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/detail/mdspan_shim.hpp>
    +
    8#include <dr/detail/ranges_shim.hpp>
    +
    9#include <dr/mp/allocator.hpp>
    +
    10#include <dr/mp/containers/distributed_mdarray.hpp>
    +
    11
    +
    12namespace dr::mp::__detail {
    +
    13
    +
    14template <typename T> class tmp_buffer {
    +
    15public:
    +
    16 tmp_buffer(std::size_t size, auto &&candidate) {
    +
    17 // Try to use the candidate for storage
    +
    18 data_ = candidate.mdspan().data_handle();
    +
    19 size_ = size;
    +
    20 allocated_data_ = nullptr;
    +
    21
    +
    22 // Allocate a temporary buffer if it is too small
    +
    23 if (size_ > candidate.reserved()) {
    +
    24 dr::drlog.debug(
    +
    25 dr::logger::transpose,
    +
    26 "Allocating a temporary buffer requested size {} candidate size {}\n",
    +
    27 size, candidate.reserved());
    +
    28 allocated_data_ = __detail::allocator<T>().allocate(size_);
    +
    29 data_ = allocated_data_;
    +
    30 }
    +
    31 assert(data_ != nullptr);
    +
    32 }
    +
    33
    +
    34 T *data() { return data_; }
    +
    35
    +
    36 ~tmp_buffer() {
    +
    37 // release temporary storage
    +
    38 if (allocated_data_) {
    +
    39 __detail::allocator<T>().deallocate(allocated_data_, size_);
    +
    40 allocated_data_ = nullptr;
    +
    41 }
    +
    42 }
    +
    43
    +
    44private:
    +
    45 T *data_;
    +
    46 T *allocated_data_ = nullptr;
    +
    47 std::size_t size_;
    +
    48};
    +
    49
    +
    50template <dr::distributed_mdspan_range MR1, dr::distributed_mdspan_range MR2>
    +
    51void transpose2D(MR1 &&src, MR2 &&dst, auto sm, auto dm) {
    +
    52 auto comm = default_comm();
    +
    53
    +
    54 using T = rng::range_value_t<MR1>;
    +
    55
    +
    56 using index_type = dr::__detail::dr_extents<2>;
    +
    57
    +
    58 // swap dimensions of the src to create the dst
    +
    59 assert(sm.extent(0) == dm.extent(1) && sm.extent(1) == dm.extent(0));
    +
    60
    +
    61 auto src_tile = src.grid()(comm.rank(), 0);
    +
    62 auto dst_tile = dst.grid()(comm.rank(), 0);
    +
    63
    +
    64 if (comm.size() == 1) {
    +
    65 dr::drlog.debug(dr::logger::transpose, "direct transpose on single rank\n");
    +
    66 auto sm = src_tile.mdspan();
    +
    67 auto dm = dst_tile.mdspan();
    +
    68 dr::__detail::mdtranspose<decltype(sm), 1, 0> src_tile_t(sm);
    +
    69 dr::__detail::mdspan_copy(src_tile_t, dm).wait();
    +
    70
    +
    71 } else {
    +
    72 // Divide src tile into sub-tiles by taking vertical slices, each
    +
    73 // sub-tile is sent to a different rank. The sub-tile is transposed
    +
    74 // so the number of columns must match the number of rows in the
    +
    75 // dst tile
    +
    76
    +
    77 // The alltoall assumes all the ranks have equal size data. The
    +
    78 // last rank may hold less data, but the actual storage size is
    +
    79 // uniform.
    +
    80 std::size_t sub_tile_size = src.grid()(0, 0).mdspan().extent(0) *
    +
    81 dst.grid()(0, 0).mdspan().extent(0);
    +
    82 std::size_t sub_tiles_size = sub_tile_size * comm.size();
    +
    83 dr::drlog.debug(dr::logger::transpose, "sub_tile_size: {}x{} total: {}\n",
    +
    84 src.grid()(0, 0).mdspan().extent(0),
    +
    85 dst.grid()(0, 0).mdspan().extent(0), sub_tile_size);
    +
    86
    +
    87 // create a send buffer. try to reuse destination for storage
    +
    88 __detail::tmp_buffer<T> send_buffer(sub_tiles_size, dst_tile);
    +
    89 T *buffer = send_buffer.data();
    +
    90
    +
    91 std::vector<dr::__detail::event> pack_events;
    +
    92 index_type start({0, 0}), end({src_tile.mdspan().extent(0), 0});
    +
    93 for (std::size_t i = 0; i < dst.grid().extent(0); i++) {
    +
    94 auto num_cols = dst.grid()(i, 0).mdspan().extent(0);
    +
    95
    +
    96 end[1] = start[1] + num_cols;
    +
    97 dr::drlog.debug(dr::logger::transpose, "Packing start: {}, end: {}\n",
    +
    98 start, end);
    +
    99 auto sub_tile =
    +
    100 dr::__detail::make_submdspan(src_tile.mdspan(), start, end);
    +
    101 dr::__detail::mdtranspose<decltype(sub_tile), 1, 0> sub_tile_t(sub_tile);
    +
    102 pack_events.push_back(dr::__detail::mdspan_copy(sub_tile_t, buffer));
    +
    103 buffer += sub_tile_size;
    +
    104 start[1] += num_cols;
    +
    105 }
    +
    106 rng::for_each(pack_events, [](auto e) { e.wait(); });
    +
    107
    +
    108 // We have packed the src into the send_buffer and no longer need
    +
    109 // it. Try to reuse its space for the receive buffer
    +
    110 __detail::tmp_buffer<T> receive_buffer(sub_tiles_size, src_tile);
    +
    111 buffer = receive_buffer.data();
    +
    112 comm.alltoall(send_buffer.data(), receive_buffer.data(), sub_tile_size);
    +
    113
    +
    114 std::vector<dr::__detail::event> unpack_events;
    +
    115 start = {0, 0};
    +
    116 end = {dst_tile.mdspan().extent(0), 0};
    +
    117 for (std::size_t i = 0; i < src.grid().extent(0); i++) {
    +
    118 auto num_cols = src.grid()(i, 0).mdspan().extent(0);
    +
    119
    +
    120 end[1] = start[1] + num_cols;
    +
    121 dr::drlog.debug(dr::logger::transpose, "Unpacking start: {}, end: {}\n",
    +
    122 start, end);
    +
    123 auto sub_tile =
    +
    124 dr::__detail::make_submdspan(dst_tile.mdspan(), start, end);
    +
    125 unpack_events.push_back(dr::__detail::mdspan_copy(buffer, sub_tile));
    +
    126 buffer += sub_tile_size;
    +
    127 start[1] += num_cols;
    +
    128 }
    +
    129 rng::for_each(unpack_events, [](auto e) { e.wait(); });
    +
    130 }
    +
    131}
    +
    132
    + +
    134 std::size_t... Is>
    +
    135void transpose3D_slab(MR1 &&src, MR2 &&dst, auto sm, auto dm) {
    +
    136 auto comm = default_comm();
    +
    137
    +
    138 using T = rng::range_value_t<MR1>;
    +
    139
    +
    140 using index_type = dr::__detail::dr_extents<3>;
    +
    141 // 3d mdspan
    +
    142 // The transpose is needed to make the first dimension contiguous.
    +
    143 dr::drlog.debug(dr::logger::transpose,
    +
    144 "transpose src: [{}, {}, {}] dst: [{}, {}, {}]\n",
    +
    145 sm.extent(0), sm.extent(1), sm.extent(2), dm.extent(0),
    +
    146 dm.extent(1), dm.extent(2));
    +
    147
    +
    148 constexpr std::array<std::size_t, 3> from_transposed{Is...};
    +
    149
    +
    150 assert(sm.extent(0) == dm.extent(from_transposed[0]) &&
    +
    151 sm.extent(1) == dm.extent(from_transposed[1]) &&
    +
    152 sm.extent(2) == dm.extent(from_transposed[2]));
    +
    153
    +
    154 // i,j,k -> j,k,i : {2,0,1}
    +
    155 std::size_t mask_p = 1, mask_u = 2;
    +
    156 if (from_transposed[0] == 1) {
    +
    157 // i,j,k -> k,i,j : {1,2,0}
    +
    158 mask_p = 2;
    +
    159 mask_u = 1;
    +
    160 }
    +
    161
    +
    162 auto origin_dst_tile = dst.grid()(0, 0, 0).mdspan();
    +
    163 auto origin_src_tile = src.grid()(0, 0, 0).mdspan();
    +
    164 std::size_t sub_tile_size = origin_src_tile.extent(0) *
    +
    165 origin_dst_tile.extent(0) *
    +
    166 origin_dst_tile.extent(mask_p);
    +
    167
    +
    168 std::size_t sub_tiles_size = sub_tile_size * comm.size();
    +
    169
    +
    170 auto src_tile = src.grid()(comm.rank(), 0, 0);
    +
    171 auto dst_tile = dst.grid()(comm.rank(), 0, 0);
    +
    172
    +
    173 if (comm.size() == 1) {
    +
    174 dr::drlog.debug(dr::logger::transpose, "direct transpose on single rank\n");
    +
    175 auto sm = src_tile.mdspan();
    +
    176 auto dm = dst_tile.mdspan();
    +
    177 dr::__detail::mdtranspose<decltype(sm), Is...> src_tile_t(sm);
    +
    178 dr::__detail::mdspan_copy(src_tile_t, dm).wait();
    +
    179 } else {
    +
    180
    +
    181 // create a send buffer. try to reuse destination for storage
    +
    182 __detail::tmp_buffer<T> send_buffer(sub_tiles_size, dst_tile);
    +
    183
    +
    184 T *buffer = send_buffer.data();
    +
    185
    +
    186 std::vector<dr::__detail::event> pack_events;
    +
    187 index_type start({0, 0, 0}),
    +
    188 end({src_tile.mdspan().extent(0), src_tile.mdspan().extent(1),
    +
    189 src_tile.mdspan().extent(2)});
    +
    190
    +
    191 for (std::size_t i = 0; i < dst.grid().extent(0); i++) {
    +
    192 auto num_cols = dst.grid()(i, 0, 0).mdspan().extent(0);
    +
    193 end[mask_p] = start[mask_p] + num_cols;
    +
    194
    +
    195 dr::drlog.debug(dr::logger::transpose, "Packing start: {}, end: {}\n",
    +
    196 start, end);
    +
    197 auto sub_tile =
    +
    198 dr::__detail::make_submdspan(src_tile.mdspan(), start, end);
    +
    199 dr::__detail::mdtranspose<decltype(sub_tile), Is...> sub_tile_t(sub_tile);
    +
    200
    +
    201 pack_events.push_back(dr::__detail::mdspan_copy(sub_tile_t, buffer));
    +
    202 buffer += sub_tile_size;
    +
    203 start[mask_p] += num_cols;
    +
    204 }
    +
    205
    +
    206 rng::for_each(pack_events, [](auto e) { e.wait(); });
    +
    207
    +
    208 __detail::tmp_buffer<T> receive_buffer(sub_tiles_size, src_tile);
    +
    209 buffer = receive_buffer.data();
    +
    210 comm.alltoall(send_buffer.data(), receive_buffer.data(), sub_tile_size);
    +
    211
    +
    212 std::vector<dr::__detail::event> unpack_events;
    +
    213 start = {0, 0, 0};
    +
    214 end = {dst_tile.mdspan().extent(0), dst_tile.mdspan().extent(1),
    +
    215 dst_tile.mdspan().extent(2)};
    +
    216 for (std::size_t i = 0; i < src.grid().extent(0); i++) {
    +
    217 auto num_cols = src.grid()(i, 0, 0).mdspan().extent(0);
    +
    218
    +
    219 end[mask_u] = start[mask_u] + num_cols;
    +
    220 dr::drlog.debug(dr::logger::transpose, "Unpacking start: {}, end: {}\n",
    +
    221 start, end);
    +
    222 auto sub_tile =
    +
    223 dr::__detail::make_submdspan(dst_tile.mdspan(), start, end);
    +
    224 unpack_events.push_back(dr::__detail::mdspan_copy(buffer, sub_tile));
    +
    225 buffer += sub_tile_size;
    +
    226 start[mask_u] += num_cols;
    +
    227 }
    +
    228 rng::for_each(unpack_events, [](auto e) { e.wait(); });
    +
    229 }
    +
    230}
    +
    231
    +
    232}; // namespace dr::mp::__detail
    +
    233
    +
    234namespace dr::mp {
    +
    235
    +
    236// Transpose mdspan_view. The src is used for temporary storage and is
    +
    237// undefined after the transpose completes.
    +
    238template <dr::distributed_mdspan_range MR1, dr::distributed_mdspan_range MR2>
    +
    239void transpose(MR1 &&src, MR2 &&dst, bool forward = true) {
    +
    240 constexpr std::size_t rank1 = std::remove_cvref_t<MR1>::rank();
    +
    241 constexpr std::size_t rank2 = std::remove_cvref_t<MR2>::rank();
    +
    242 static_assert(rank1 == rank2);
    +
    243
    +
    244 // Data decomposition on leading dimension only
    +
    245 for (std::size_t i = 1; i < rank1; i++) {
    +
    246 assert(src.grid().extent(i) == 1);
    +
    247 }
    +
    248
    +
    249 auto sm = src.mdspan();
    +
    250 auto dm = dst.mdspan();
    +
    251
    +
    252 if constexpr (rank1 == 2) {
    +
    253 __detail::transpose2D(src, dst, sm, dm);
    +
    254 } else if constexpr (rank1 == 3) {
    +
    255 if (forward) {
    +
    256 __detail::transpose3D_slab<MR1, MR2, 2, 0, 1>(src, dst, sm, dm);
    +
    257 } else {
    +
    258 __detail::transpose3D_slab<MR1, MR2, 1, 2, 0>(src, dst, sm, dm);
    +
    259 }
    +
    260 } else {
    +
    261 assert(false);
    +
    262 }
    +
    263 barrier();
    +
    264}
    +
    265
    +
    266} // namespace dr::mp
    +
    Definition: mdspan_utils.hpp:214
    +
    Definition: allocator.hpp:11
    +
    Definition: transpose.hpp:14
    +
    Definition: mdspan_utils.hpp:332
    +
    + + + + diff --git a/doxygen/tuple__utils_8hpp_source.html b/doxygen/tuple__utils_8hpp_source.html new file mode 100644 index 0000000000..090c84ec0b --- /dev/null +++ b/doxygen/tuple__utils_8hpp_source.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/tuple_utils.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    tuple_utils.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7namespace dr::__detail {
    +
    8
    +
    9auto tuple_transform(auto tuple, auto op) {
    +
    10 auto transform = [op](auto &&...items) {
    +
    11 return std::make_tuple(op(items)...);
    +
    12 };
    +
    13 return std::apply(transform, tuple);
    +
    14}
    +
    15
    +
    16auto tie_transform(auto tuple, auto op) {
    +
    17 auto transform = [op]<typename... Items>(Items &&...items) {
    +
    18 return std::tie(op(std::forward<Items>(items))...);
    +
    19 };
    +
    20 return std::apply(transform, tuple);
    +
    21}
    +
    22
    +
    23auto tuple_foreach(auto tuple, auto op) {
    +
    24 auto transform = [op](auto... items) { (op(items), ...); };
    +
    25 std::apply(transform, tuple);
    +
    26}
    +
    27
    +
    28} // namespace dr::__detail
    +
    + + + + diff --git a/doxygen/util_8hpp_source.html b/doxygen/util_8hpp_source.html new file mode 100644 index 0000000000..64638dd023 --- /dev/null +++ b/doxygen/util_8hpp_source.html @@ -0,0 +1,357 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/util.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    util.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <iostream>
    +
    8#include <omp.h>
    +
    9#include <sycl/sycl.hpp>
    +
    10
    +
    11namespace dr::sp {
    +
    12
    +
    13template <typename Selector> sycl::device select_device(Selector &&selector) {
    +
    14 sycl::device d;
    +
    15
    +
    16 try {
    +
    17 d = sycl::device(std::forward<Selector>(selector));
    +
    18 std::cout << "Running on device \""
    +
    19 << d.get_info<sycl::info::device::name>() << "\"" << std::endl;
    +
    20 } catch (sycl::exception const &e) {
    +
    21 std::cout << "Cannot select an accelerator\n" << e.what() << "\n";
    +
    22 std::cout << "Using a CPU device\n";
    +
    23 d = sycl::device(sycl::cpu_selector_v);
    +
    24 }
    +
    25 return d;
    +
    26}
    +
    27
    +
    28inline void list_devices() {
    +
    29 auto platforms = sycl::platform::get_platforms();
    +
    30
    +
    31 for (auto &platform : platforms) {
    +
    32 std::cout << "Platform: " << platform.get_info<sycl::info::platform::name>()
    +
    33 << std::endl;
    +
    34
    +
    35 auto devices = platform.get_devices();
    +
    36 for (auto &device : devices) {
    +
    37 std::cout << " Device: " << device.get_info<sycl::info::device::name>()
    +
    38 << std::endl;
    +
    39 }
    +
    40 }
    +
    41}
    +
    42
    +
    43inline void print_device_details(std::span<sycl::device> devices) {
    +
    44 std::size_t device_id = 0;
    +
    45 for (auto &&device : devices) {
    +
    46 std::cout << "Device " << device_id << ": "
    +
    47 << device.get_info<sycl::info::device::name>() << std::endl;
    +
    48 device_id++;
    +
    49 }
    +
    50}
    +
    51
    +
    52template <typename Selector> void list_devices(Selector &&selector) {
    +
    53 sycl::platform p(std::forward<Selector>(selector));
    +
    54 auto devices = p.get_devices();
    +
    55
    +
    56 printf("--Platform Info-----------------\n");
    +
    57
    +
    58 printf("Platform %s has %lu root devices.\n",
    +
    59 p.get_info<sycl::info::platform::name>().c_str(), devices.size());
    +
    60
    +
    61 for (std::size_t i = 0; i < devices.size(); i++) {
    +
    62 auto &&device = devices[i];
    +
    63
    +
    64 printf(" %lu %s\n", i,
    +
    65 device.get_info<sycl::info::device::name>().c_str());
    +
    66
    +
    67 auto subdevices = device.create_sub_devices<
    +
    68 sycl::info::partition_property::partition_by_affinity_domain>(
    +
    69 sycl::info::partition_affinity_domain::numa);
    +
    70
    +
    71 printf(" Subdevices:\n");
    +
    72 for (std::size_t j = 0; j < subdevices.size(); j++) {
    +
    73 auto &&subdevice = subdevices[j];
    +
    74 printf(" %lu.%lu %s\n", i, j,
    +
    75 subdevice.get_info<sycl::info::device::name>().c_str());
    +
    76 }
    +
    77 }
    +
    78
    +
    79 printf("--------------------------------\n");
    +
    80}
    +
    81
    +
    82inline std::vector<sycl::device>
    +
    83trim_devices(const std::vector<sycl::device> &devices, std::size_t n_devices) {
    +
    84 std::vector<sycl::device> trimmed_devices = devices;
    +
    85
    +
    86 if (n_devices < devices.size()) {
    +
    87 trimmed_devices.resize(n_devices);
    +
    88 }
    +
    89 return trimmed_devices;
    +
    90}
    +
    91
    +
    92template <typename Selector>
    +
    93std::vector<sycl::device> get_numa_devices_impl_(Selector &&selector) {
    +
    94 std::vector<sycl::device> devices;
    +
    95
    +
    96 sycl::platform p(std::forward<Selector>(selector));
    +
    97 auto root_devices = p.get_devices();
    +
    98
    +
    99 for (auto &&root_device : root_devices) {
    +
    100 auto subdevices = root_device.create_sub_devices<
    +
    101 sycl::info::partition_property::partition_by_affinity_domain>(
    +
    102 sycl::info::partition_affinity_domain::numa);
    +
    103
    +
    104 for (auto &&subdevice : subdevices) {
    +
    105 devices.push_back(subdevice);
    +
    106 }
    +
    107 }
    +
    108
    +
    109 return devices;
    +
    110}
    +
    111
    +
    112template <typename Selector>
    +
    113std::vector<sycl::device> get_devices(Selector &&selector) {
    +
    114 sycl::platform p(std::forward<Selector>(selector));
    +
    115 return p.get_devices();
    +
    116}
    +
    117
    +
    118template <typename Selector>
    +
    119std::vector<sycl::device> get_numa_devices(Selector &&selector) {
    +
    120#ifdef USE_OMP_INTEROP
    +
    121 // possible to move ompt_queues_ sp::__detail as a global object
    +
    122 static std::vector<sycl::queue *> ompt_queues_;
    +
    123 if (ompt_queues_.empty()) {
    +
    124 int num_devices = omp_get_num_devices();
    +
    125 for (int d = 0; d < num_devices; ++d) {
    +
    126 omp_interop_t interop = nullptr;
    +
    127#pragma omp interop device(d) init(prefer_type("sycl"), targetsync : interop)
    +
    128 int result;
    +
    129 sycl::queue *omp_queue = static_cast<sycl::queue *>(
    +
    130 omp_get_interop_ptr(interop, omp_ipr_targetsync, &result));
    +
    131 if (result != omp_irc_success)
    +
    132 throw std::runtime_error(
    +
    133 "Fail to obtain sycl::queue by openmp::interop");
    +
    134 ompt_queues_.emplace_back(omp_queue);
    +
    135 }
    +
    136 }
    +
    137 std::vector<sycl::device> devices;
    +
    138 for (auto &&q : ompt_queues_) {
    +
    139 devices.push_back(q->get_device());
    +
    140 }
    +
    141 return devices;
    +
    142#else
    +
    143 try {
    +
    144 return get_numa_devices_impl_(std::forward<Selector>(selector));
    +
    145 } catch (sycl::exception const &e) {
    +
    146 if (e.code() == sycl::errc::feature_not_supported) {
    +
    147 std::cerr << "NUMA partitioning not supported, returning root devices..."
    +
    148 << std::endl;
    +
    149 return get_devices(std::forward<Selector>(selector));
    +
    150 } else {
    +
    151 throw;
    +
    152 }
    +
    153 }
    +
    154#endif
    +
    155}
    +
    156
    +
    157// Return exactly `n` devices obtained using the selector `selector`.
    +
    158// May duplicate devices
    +
    159template <typename Selector>
    +
    160std::vector<sycl::device> get_duplicated_devices(Selector &&selector,
    +
    161 std::size_t n) {
    +
    162 auto devices = get_numa_devices(std::forward<Selector>(selector));
    +
    163
    +
    164 if (devices.size() >= n) {
    +
    165 return std::vector<sycl::device>(devices.begin(), devices.begin() + n);
    +
    166 } else {
    +
    167 std::size_t i = 0;
    +
    168 while (devices.size() < n) {
    +
    169 auto d = devices[i++];
    +
    170 devices.push_back(d);
    +
    171 }
    +
    172 return devices;
    +
    173 }
    +
    174}
    +
    175
    +
    176template <typename Range> void print_range(Range &&r, std::string label = "") {
    +
    177 std::size_t indent = 1;
    +
    178
    +
    179 if (label != "") {
    +
    180 std::cout << "\"" << label << "\": ";
    +
    181 indent += label.size() + 4;
    +
    182 }
    +
    183
    +
    184 std::string indent_whitespace(indent, ' ');
    +
    185
    +
    186 std::cout << "[";
    +
    187 std::size_t columns = 10;
    +
    188 std::size_t count = 1;
    +
    189 for (auto iter = r.begin(); iter != r.end(); ++iter) {
    +
    190 std::cout << static_cast<rng::range_value_t<Range>>(*iter);
    +
    191
    +
    192 auto next = iter;
    +
    193 ++next;
    +
    194 if (next != r.end()) {
    +
    195 std::cout << ", ";
    +
    196 if (count % columns == 0) {
    +
    197 std::cout << "\n" << indent_whitespace;
    +
    198 }
    +
    199 }
    +
    200 ++count;
    +
    201 }
    +
    202 std::cout << "]" << std::endl;
    +
    203}
    +
    204
    +
    205template <typename Matrix>
    +
    206void print_matrix(Matrix &&m, std::string label = "") {
    +
    207 std::cout << m.shape()[0] << " x " << m.shape()[1] << " matrix with "
    +
    208 << m.size() << " stored values";
    +
    209 if (label != "") {
    +
    210 std::cout << " \"" << label << "\"";
    +
    211 }
    +
    212 std::cout << std::endl;
    +
    213
    +
    214 for (auto &&tuple : m) {
    +
    215 auto &&[index, value] = tuple;
    +
    216 auto &&[i, j] = index;
    +
    217
    +
    218 std::cout << "(" << i << ", " << j << "): " << value << std::endl;
    +
    219 }
    +
    220}
    +
    221
    +
    222template <typename R> void print_range_details(R &&r, std::string label = "") {
    +
    223 if (label != "") {
    +
    224 std::cout << "\"" << label << "\" ";
    +
    225 }
    +
    226
    +
    227 std::cout << "distributed range with " << rng::size(dr::ranges::segments(r))
    +
    228 << " segments." << std::endl;
    +
    229
    +
    230 std::size_t idx = 0;
    +
    231 for (auto &&segment : dr::ranges::segments(r)) {
    +
    232 std::cout << "Seg " << idx++ << ", size " << segment.size() << " (rank "
    +
    233 << dr::ranges::rank(segment) << ")" << std::endl;
    +
    234 }
    +
    235}
    +
    236
    +
    237template <dr::distributed_range R>
    +
    238void range_details(R &&r, std::size_t width = 80) {
    +
    239 std::size_t size = rng::size(r);
    +
    240
    +
    241 for (auto &&[idx, segment] :
    +
    242 dr::__detail::enumerate(dr::ranges::segments(r))) {
    +
    243 std::size_t local_size = rng::size(segment);
    +
    244
    +
    245 double percent = double(local_size) / size;
    +
    246
    +
    247 std::size_t num_chars = percent * width;
    +
    248 num_chars = std::max(num_chars, std::size_t(3));
    +
    249
    +
    250 std::size_t whitespace = num_chars - 3;
    +
    251
    +
    252 std::size_t initial_whitespace = whitespace / 2;
    +
    253 std::size_t after_whitespace = whitespace - initial_whitespace;
    +
    254
    +
    255 std::cout << "[" << std::string(initial_whitespace, ' ')
    +
    256 << dr::ranges::rank(segment) << std::string(after_whitespace, ' ')
    +
    257 << "]";
    +
    258 }
    +
    259 std::cout << std::endl;
    +
    260}
    +
    261
    +
    262namespace __detail {
    +
    263
    +
    264template <typename T>
    +
    265concept sycl_device_selector = requires(T &t, const sycl::device &device) {
    +
    266 { t(device) } -> std::convertible_to<int>;
    +
    267};
    +
    268
    +
    269}
    +
    270
    +
    271} // namespace dr::sp
    + +
    + + + + diff --git a/doxygen/utils_8hpp_source.html b/doxygen/utils_8hpp_source.html new file mode 100644 index 0000000000..99bb58b0e0 --- /dev/null +++ b/doxygen/utils_8hpp_source.html @@ -0,0 +1,115 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/utils.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    utils.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7namespace dr::__detail {
    +
    8
    +
    9inline std::size_t round_up(std::size_t n, std::size_t multiple) {
    +
    10 if (multiple == 0) {
    +
    11 return n;
    +
    12 }
    +
    13
    +
    14 int remainder = n % multiple;
    +
    15 if (remainder == 0) {
    +
    16 return n;
    +
    17 }
    +
    18
    +
    19 return n + multiple - remainder;
    +
    20}
    +
    21
    +
    22inline std::size_t partition_up(std::size_t n, std::size_t multiple) {
    +
    23 if (multiple == 0) {
    +
    24 return n;
    +
    25 }
    +
    26
    +
    27 return round_up(n, multiple) / multiple;
    +
    28}
    +
    29
    +
    30} // namespace dr::__detail
    +
    + + + + diff --git a/doxygen/vector_8hpp_source.html b/doxygen/vector_8hpp_source.html new file mode 100644 index 0000000000..6cda71ba62 --- /dev/null +++ b/doxygen/vector_8hpp_source.html @@ -0,0 +1,334 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/vector.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    vector.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <memory>
    +
    8
    +
    9namespace dr::sp {
    +
    10
    +
    11// TODO: deal properly with non-trivially destructible types
    +
    12// - constructors, destructors, assign
    +
    13
    +
    14template <typename T, typename Allocator = std::allocator<T>> class vector {
    +
    15public:
    +
    16 using value_type = T;
    +
    17 using allocator_type = Allocator;
    +
    18 using size_type = std::size_t;
    +
    19 using difference_type = std::ptrdiff_t;
    +
    20 using pointer = typename std::allocator_traits<allocator_type>::pointer;
    +
    21 using const_pointer =
    +
    22 typename std::allocator_traits<allocator_type>::const_pointer;
    +
    23 using reference = decltype(*std::declval<pointer>());
    +
    24 using const_reference = decltype(*std::declval<const_pointer>());
    +
    25 using iterator = pointer;
    +
    26 using const_iterator = const_pointer;
    +
    27
    +
    28 vector() noexcept {}
    +
    29 explicit vector(const Allocator &allocator) noexcept
    +
    30 : allocator_(allocator) {}
    +
    31
    +
    32 explicit vector(size_type count, const T &value,
    +
    33 const Allocator &alloc = Allocator())
    +
    34 : allocator_(alloc) {
    +
    35 change_capacity_impl_(count);
    +
    36 using namespace std;
    +
    37 fill(data(), data() + size(), value);
    +
    38 }
    +
    39
    +
    40 explicit vector(size_type count, const Allocator &alloc = Allocator())
    +
    41 : allocator_(alloc) {
    +
    42 change_capacity_impl_(count);
    +
    43 using namespace std;
    +
    44 fill(data(), data() + size(), T{});
    +
    45 }
    +
    46
    +
    47 template <std::forward_iterator Iter>
    +
    48 constexpr vector(Iter first, Iter last, const Allocator &alloc = Allocator())
    +
    49 : allocator_(alloc) {
    +
    50 change_capacity_impl_(rng::distance(first, last));
    +
    51 using namespace std;
    +
    52 copy(first, last, begin());
    +
    53 }
    +
    54
    +
    55 vector(const vector &other) : allocator_(other.get_allocator()) {
    +
    56 change_capacity_impl_(other.size());
    +
    57 using namespace std;
    +
    58 copy(other.begin(), other.end(), begin());
    +
    59 }
    +
    60
    +
    61 vector(const vector &other, const Allocator &alloc) : allocator_(alloc) {
    +
    62 change_capacity_impl_(other.size());
    +
    63 using namespace std;
    +
    64 copy(other.begin(), other.end(), begin());
    +
    65 }
    +
    66
    +
    67 vector(vector &&other) noexcept
    +
    68 requires(std::is_trivially_move_constructible_v<T>)
    +
    69 : allocator_(other.get_allocator()) {
    +
    70 data_ = other.data_;
    +
    71 other.data_ = nullptr;
    +
    72 size_ = other.size_;
    +
    73 other.size_ = 0;
    +
    74 capacity_ = other.capacity_;
    +
    75 other.capacity_ = 0;
    +
    76 }
    +
    77
    +
    78 vector(vector &&other, const Allocator &alloc) noexcept
    +
    79 requires(std::is_trivially_move_constructible_v<T>)
    +
    80 : allocator_(alloc) {
    +
    81 data_ = other.data_;
    +
    82 other.data_ = nullptr;
    +
    83 size_ = other.size_;
    +
    84 other.size_ = 0;
    +
    85 capacity_ = other.capacity_;
    +
    86 other.capacity_ = 0;
    +
    87 }
    +
    88
    +
    89 vector(std::initializer_list<T> init, const Allocator &alloc = Allocator())
    +
    90 : allocator_(alloc) {
    +
    91 change_capacity_impl_(init.size());
    +
    92 using namespace std;
    +
    93 copy(init.begin(), init.end(), begin());
    +
    94 }
    +
    95
    +
    96 vector &operator=(const vector &other) {
    +
    97 assign(other.begin(), other.end());
    +
    98 return *this;
    +
    99 }
    +
    100
    +
    101 template <std::forward_iterator Iter> void assign(Iter first, Iter last) {
    +
    102 auto new_size = rng::distance(first, last);
    +
    103 reserve(new_size);
    +
    104 using namespace std;
    +
    105 copy(first, last, begin());
    +
    106 size_ = new_size;
    +
    107 }
    +
    108
    +
    109 ~vector() noexcept {
    +
    110 /*
    +
    111 for (auto iter = begin(); iter != end(); ++iter) {
    +
    112 std::allocator_traits<allocator_type>::destroy(allocator_, iter);
    +
    113 }
    +
    114 */
    +
    115 if (data() != nullptr) {
    +
    116 allocator_.deallocate(data(), capacity());
    +
    117 }
    +
    118 }
    +
    119
    +
    120 size_type size() const noexcept { return size_; }
    +
    121
    +
    122 bool empty() const noexcept { return size() == 0; }
    +
    123
    +
    124 size_type capacity() const noexcept { return capacity_; }
    +
    125
    +
    126 pointer data() noexcept { return data_; }
    +
    127
    +
    128 const_pointer data() const noexcept { return data_; }
    +
    129
    +
    130 allocator_type get_allocator() const noexcept { return allocator_; }
    +
    131
    +
    132 iterator begin() noexcept { return data_; }
    +
    133
    +
    134 iterator end() noexcept { return begin() + size(); }
    +
    135
    +
    136 const_iterator begin() const noexcept { return data_; }
    +
    137
    +
    138 const_iterator end() const noexcept { return begin() + size(); }
    +
    139
    +
    140 reference operator[](size_type pos) { return *(begin() + pos); }
    +
    141
    +
    142 const_reference operator[](size_type pos) const { return *(begin() + pos); }
    +
    143
    +
    144 void reserve(size_type new_cap) {
    +
    145 if (new_cap > capacity()) {
    +
    146 pointer new_data = get_allocator().allocate(new_cap);
    +
    147 using namespace std;
    +
    148 if (begin() != end()) {
    +
    149 using namespace std;
    +
    150 copy(begin(), end(), new_data);
    +
    151 }
    +
    152 if (data_ != nullptr) {
    +
    153 get_allocator().deallocate(data_, capacity());
    +
    154 }
    +
    155 data_ = new_data;
    +
    156 capacity_ = new_cap;
    +
    157 }
    +
    158 }
    +
    159
    +
    160 void push_back(const T &value) {
    +
    161 if (size() + 1 > capacity()) {
    +
    162 size_type new_capacity = next_highest_power_of_two_impl_(capacity());
    +
    163 reserve(new_capacity);
    +
    164 }
    +
    165
    +
    166 data()[size()] = value;
    +
    167 ++size_;
    +
    168 }
    +
    169
    +
    170 void push_back(T &&value) {
    +
    171 if (size() + 1 > capacity()) {
    +
    172 size_type new_capacity = next_highest_power_of_two_impl_(capacity());
    +
    173 reserve(new_capacity);
    +
    174 }
    +
    175
    +
    176 data()[size()] = std::move(value);
    +
    177 ++size_;
    +
    178 }
    +
    179
    +
    180 bool try_push_back(const T &value) {
    +
    181 if (size() + 1 <= capacity()) {
    +
    182 data()[size()] = value;
    +
    183 ++size_;
    +
    184 return true;
    +
    185 }
    +
    186 return false;
    +
    187 }
    +
    188
    +
    189 // TODO: properly construct/destruct
    +
    190 void resize(size_type count) {
    +
    191 if (count > capacity()) {
    +
    192 reserve(count);
    +
    193 }
    +
    194 if (count > size()) {
    +
    195 /*
    +
    196 for (std::size_t i = 0; i < count - size(); i++) {
    +
    197 end()[i] = T();
    +
    198 }
    +
    199 */
    +
    200 }
    +
    201 size_ = count;
    +
    202 }
    +
    203
    +
    204 void resize(size_type count, const value_type &value) {
    +
    205 if (count > capacity()) {
    +
    206 reserve(count);
    +
    207 }
    +
    208 if (count > size()) {
    +
    209 for (std::size_t i = 0; i < count - size(); i++) {
    +
    210 end()[i] = value;
    +
    211 }
    +
    212 }
    +
    213 size_ = count;
    +
    214 }
    +
    215
    +
    216private:
    +
    217 // For use only inside constructors and assignment operators
    +
    218 void change_capacity_impl_(size_type count) {
    +
    219 if (data_ != nullptr && capacity_ != count) {
    +
    220 allocator_.deallocate(data_, capacity());
    +
    221 }
    +
    222 size_ = capacity_ = count;
    +
    223 data_ = size_ ? allocator_.allocate(count) : nullptr;
    +
    224 }
    +
    225
    +
    226 // NOTE: algorithm copied from "Bit Twiddling Hacks"
    +
    227 // (Public domain)
    +
    228 constexpr size_type next_highest_power_of_two_impl_(size_type n) {
    +
    229 n--;
    +
    230 n |= n >> 1;
    +
    231 n |= n >> 2;
    +
    232 n |= n >> 4;
    +
    233 n |= n >> 8;
    +
    234 if constexpr (sizeof(size_type) > 2)
    +
    235 n |= n >> 16;
    +
    236 if constexpr (sizeof(size_type) > 4)
    +
    237 n |= n >> 32;
    +
    238 n++;
    +
    239 return n;
    +
    240 }
    +
    241
    +
    242 pointer data_ = nullptr;
    +
    243 size_type size_ = 0;
    +
    244 size_type capacity_ = 0;
    +
    245 allocator_type allocator_;
    +
    246};
    +
    247
    +
    248} // namespace dr::sp
    +
    Definition: vector.hpp:14
    +
    + + + + diff --git a/doxygen/view__detectors_8hpp_source.html b/doxygen/view__detectors_8hpp_source.html new file mode 100644 index 0000000000..4889ed7136 --- /dev/null +++ b/doxygen/view__detectors_8hpp_source.html @@ -0,0 +1,151 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/detail/view_detectors.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    view_detectors.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <type_traits>
    +
    8
    +
    9namespace dr {
    +
    10
    +
    11template <typename T> struct is_ref_view : std::false_type {};
    +
    12template <rng::range R>
    +
    13struct is_ref_view<rng::ref_view<R>> : std::true_type {};
    +
    14
    +
    15template <typename T> inline constexpr bool is_ref_view_v = is_ref_view<T>{};
    +
    16
    +
    17template <typename T> struct is_iota_view : std::false_type {};
    +
    18template <std::weakly_incrementable W>
    +
    19struct is_iota_view<rng::iota_view<W>> : std::true_type {};
    +
    20
    +
    21template <typename T> inline constexpr bool is_iota_view_v = is_iota_view<T>{};
    +
    22
    +
    23template <typename T> struct is_take_view : std::false_type {};
    +
    24template <typename T>
    +
    25struct is_take_view<rng::take_view<T>> : std::true_type {};
    +
    26
    +
    27template <typename T>
    +
    28inline constexpr bool is_take_view_v = is_take_view<T>::value;
    +
    29
    +
    30template <typename T> struct is_drop_view : std::false_type {};
    +
    31template <typename T>
    +
    32struct is_drop_view<rng::drop_view<T>> : std::true_type {};
    +
    33
    +
    34template <typename T>
    +
    35inline constexpr bool is_drop_view_v = is_drop_view<T>::value;
    +
    36
    +
    37template <typename T> struct is_subrange_view : std::false_type {};
    +
    38template <typename T>
    +
    39struct is_subrange_view<rng::subrange<T>> : std::true_type {};
    +
    40
    +
    41template <typename T>
    +
    42inline constexpr bool is_subrange_view_v = is_subrange_view<T>::value;
    +
    43
    +
    44template <typename T> struct is_sliding_view : std::false_type {};
    +
    45template <typename T>
    +
    46struct is_sliding_view<rng::sliding_view<T>> : std::true_type {};
    +
    47template <typename T>
    +
    48inline constexpr bool is_sliding_view_v =
    + +
    50
    +
    51template <typename T> struct is_zip_view : std::false_type {};
    +
    52
    +
    53template <typename... Views>
    +
    54struct is_zip_view<rng::zip_view<Views...>> : std::true_type {};
    +
    55
    +
    56template <typename T>
    +
    57inline constexpr bool is_zip_view_v = is_zip_view<T>::value;
    +
    58
    +
    59} // namespace dr
    +
    Definition: view_detectors.hpp:30
    +
    Definition: view_detectors.hpp:17
    +
    Definition: view_detectors.hpp:11
    +
    Definition: view_detectors.hpp:44
    +
    Definition: view_detectors.hpp:37
    +
    Definition: view_detectors.hpp:23
    +
    Definition: view_detectors.hpp:51
    +
    + + + + diff --git a/doxygen/views_2iota_8hpp_source.html b/doxygen/views_2iota_8hpp_source.html new file mode 100644 index 0000000000..e9d0775b8a --- /dev/null +++ b/doxygen/views_2iota_8hpp_source.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/views/iota.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    iota.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7namespace dr::views {
    +
    8
    +
    9//
    +
    10// range-v3 iota uses sentinels that are not the same type as the
    +
    11// iterator. A zip that uses an iota has the same issue. Make our own.
    +
    12//
    +
    13
    +
    14struct iota_fn_ {
    +
    15 template <std::integral W> auto operator()(W value) const {
    +
    16 return rng::views::iota(value, std::numeric_limits<W>::max());
    +
    17 }
    +
    18
    +
    19 template <std::integral W, std::integral Bound>
    +
    20 auto operator()(W value, Bound bound) const {
    +
    21 return rng::views::iota(value, W(bound));
    +
    22 }
    +
    23};
    +
    24
    +
    25inline constexpr auto iota = iota_fn_{};
    +
    26
    +
    27} // namespace dr::views
    +
    Definition: iota.hpp:14
    +
    + + + + diff --git a/doxygen/views_2transform_8hpp_source.html b/doxygen/views_2transform_8hpp_source.html new file mode 100644 index 0000000000..c4da816ecd --- /dev/null +++ b/doxygen/views_2transform_8hpp_source.html @@ -0,0 +1,300 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/views/transform.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    transform.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <concepts>
    +
    8#include <iterator>
    +
    9#include <type_traits>
    +
    10
    +
    11#include <dr/concepts/concepts.hpp>
    +
    12#include <dr/detail/ranges_shim.hpp>
    +
    13
    +
    14namespace dr {
    +
    15
    +
    16template <std::random_access_iterator Iter, std::copy_constructible F>
    + +
    18public:
    +
    19 using value_type = std::invoke_result_t<F, std::iter_value_t<Iter>>;
    +
    20 using difference_type = std::iter_difference_t<Iter>;
    + +
    22 using reference = value_type;
    +
    23
    +
    24 using pointer = iterator;
    +
    25
    +
    26 using iterator_category = std::random_access_iterator_tag;
    +
    27
    +
    28 transform_iterator(Iter iter, F fn) noexcept : iter_(iter) {}
    +
    29 transform_iterator() noexcept = default;
    +
    30 ~transform_iterator() noexcept = default;
    +
    31 transform_iterator(const transform_iterator &) noexcept = default;
    +
    32 transform_iterator &operator=(const transform_iterator &) noexcept = default;
    +
    33
    +
    34 bool operator==(const transform_iterator &other) const noexcept {
    +
    35 return iter_ == other.iter_;
    +
    36 }
    +
    37
    +
    38 bool operator!=(const transform_iterator &other) const noexcept {
    +
    39 return iter_ != other.iter_;
    +
    40 }
    +
    41
    +
    42 iterator operator+(difference_type offset) const noexcept {
    +
    43 return iterator(iter_ + offset, fn_);
    +
    44 }
    +
    45
    +
    46 iterator operator-(difference_type offset) const noexcept {
    +
    47 return iterator(iter_ - offset, fn_);
    +
    48 }
    +
    49
    +
    50 difference_type operator-(iterator other) const noexcept {
    +
    51 return iter_ - other.iter_;
    +
    52 }
    +
    53
    +
    54 bool operator<(iterator other) const noexcept { return iter_ < other.iter_; }
    +
    55
    +
    56 bool operator>(iterator other) const noexcept { return iter_ > iter_; }
    +
    57
    +
    58 bool operator<=(iterator other) const noexcept {
    +
    59 return iter_ <= other.iter_;
    +
    60 }
    +
    61
    +
    62 bool operator>=(iterator other) const noexcept {
    +
    63 return iter_ >= other.iter_;
    +
    64 }
    +
    65
    +
    66 iterator &operator++() noexcept {
    +
    67 ++iter_;
    +
    68 return *this;
    +
    69 }
    +
    70
    +
    71 iterator operator++(int) noexcept {
    +
    72 iterator other = *this;
    +
    73 ++(*this);
    +
    74 return other;
    +
    75 }
    +
    76
    +
    77 iterator &operator--() noexcept {
    +
    78 --iter_;
    +
    79 return *this;
    +
    80 }
    +
    81
    +
    82 iterator operator--(int) noexcept {
    +
    83 iterator other = *this;
    +
    84 --(*this);
    +
    85 return other;
    +
    86 }
    +
    87
    +
    88 iterator &operator+=(difference_type offset) noexcept {
    +
    89 iter_ += offset;
    +
    90 return *this;
    +
    91 }
    +
    92
    +
    93 iterator &operator-=(difference_type offset) noexcept {
    +
    94 iter_ -= offset;
    +
    95 return *this;
    +
    96 }
    +
    97
    +
    98 reference operator*() const noexcept { return fn_(*iter_); }
    +
    99
    +
    100 reference operator[](difference_type offset) const noexcept {
    +
    101 return *(*this + offset);
    +
    102 }
    +
    103
    +
    104 friend iterator operator+(difference_type n, iterator iter) {
    +
    105 return iter.iter_ + n;
    +
    106 }
    +
    107
    +
    108 auto local() const
    + +
    110 {
    +
    111 auto iter = dr::ranges::__detail::local(iter_);
    + +
    113 }
    +
    114
    +
    115private:
    +
    116 Iter iter_;
    +
    117 F fn_;
    +
    118};
    +
    119
    +
    120template <rng::random_access_range V, std::copy_constructible F>
    +
    121 requires(std::is_default_constructible_v<F>)
    +
    122class transform_view : public rng::view_interface<transform_view<V, F>> {
    +
    123public:
    +
    124 template <rng::viewable_range R>
    +
    125 transform_view(R &&r, F fn)
    +
    126 : base_(rng::views::all(std::forward<R>(r))), fn_(fn) {}
    +
    127
    +
    128 auto begin() const { return transform_iterator(rng::begin(base_), fn_); }
    +
    129
    +
    130 auto end() const { return transform_iterator(rng::end(base_), fn_); }
    +
    131
    +
    132 auto size() const
    +
    133 requires(rng::sized_range<V>)
    +
    134 {
    +
    135 return rng::size(base_);
    +
    136 }
    +
    137
    +
    138 auto segments() const
    + +
    140 {
    +
    141 auto fn = fn_;
    +
    142 return dr::ranges::segments(base_) |
    +
    143 rng::views::transform([fn]<typename T>(T &&segment) {
    +
    144 return transform_view<rng::views::all_t<decltype(segment)>, F>(
    +
    145 std::forward<T>(segment), fn);
    +
    146 });
    +
    147 }
    +
    148
    +
    149 auto rank() const
    +
    150 requires(dr::remote_range<V>)
    +
    151 {
    +
    152 return dr::ranges::rank(base_);
    +
    153 }
    +
    154
    +
    155 V base() const { return base_; }
    +
    156
    +
    157private:
    +
    158 V base_;
    +
    159 F fn_;
    +
    160};
    +
    161
    +
    162template <rng::viewable_range R, std::copy_constructible F>
    + +
    164
    +
    165namespace views {
    +
    166
    +
    167template <std::copy_constructible F> class transform_adapter_closure {
    +
    168public:
    +
    169 transform_adapter_closure(F fn) : fn_(fn) {}
    +
    170
    +
    171 template <rng::viewable_range R> auto operator()(R &&r) const {
    +
    172 return dr::transform_view(std::forward<R>(r), fn_);
    +
    173 }
    +
    174
    +
    175 template <rng::viewable_range R>
    +
    176 friend auto operator|(R &&r, const transform_adapter_closure &closure) {
    +
    177 return closure(std::forward<R>(r));
    +
    178 }
    +
    179
    +
    180private:
    +
    181 F fn_;
    +
    182};
    +
    183
    + +
    185public:
    +
    186 template <rng::viewable_range R, std::copy_constructible F>
    +
    187 auto operator()(R &&r, F &&f) const {
    +
    188 return transform_adapter_closure(std::forward<F>(f))(std::forward<R>(r));
    +
    189 }
    +
    190
    +
    191 template <std::copy_constructible F> auto operator()(F &&fn) const {
    +
    192 return transform_adapter_closure(std::forward<F>(fn));
    +
    193 }
    +
    194};
    +
    195
    +
    196inline constexpr auto transform = transform_fn_{};
    +
    197} // namespace views
    +
    198
    +
    199} // namespace dr
    +
    200
    +
    201#if !defined(DR_SPEC)
    +
    202
    +
    203// Needed to satisfy rng::viewable_range
    +
    204template <rng::random_access_range V, std::copy_constructible F>
    +
    205inline constexpr bool rng::enable_borrowed_range<dr::transform_view<V, F>> =
    +
    206 true;
    +
    207
    +
    208#endif
    +
    Definition: transform.hpp:17
    +
    Definition: transform.hpp:122
    +
    Definition: transform.hpp:167
    +
    Definition: transform.hpp:184
    +
    Definition: concepts.hpp:20
    +
    Definition: ranges.hpp:242
    +
    Definition: concepts.hpp:16
    +
    + + + + diff --git a/doxygen/views_2views_8hpp_source.html b/doxygen/views_2views_8hpp_source.html new file mode 100644 index 0000000000..a69100fc8c --- /dev/null +++ b/doxygen/views_2views_8hpp_source.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/views/views.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    views.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/concepts/concepts.hpp>
    +
    8#include <dr/views/transform.hpp>
    +
    9
    +
    10namespace dr {
    +
    11
    +
    12// returns range: [(rank, element) ...]
    +
    13auto ranked_view(const dr::distributed_range auto &r) {
    +
    14 auto rank = [](auto &&v) { return dr::ranges::rank(&v); };
    +
    15 return rng::views::zip(rng::views::transform(r, rank), r);
    +
    16}
    +
    17
    +
    18} // namespace dr
    +
    Definition: concepts.hpp:20
    +
    + + + + diff --git a/doxygen/zip_8hpp_source.html b/doxygen/zip_8hpp_source.html new file mode 100644 index 0000000000..f4746acd4b --- /dev/null +++ b/doxygen/zip_8hpp_source.html @@ -0,0 +1,366 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/mp/views/zip.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    zip.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <cstddef>
    +
    8#include <iterator>
    +
    9#include <tuple>
    +
    10#include <type_traits>
    +
    11#include <utility>
    +
    12
    +
    13#include <dr/detail/ranges_shim.hpp>
    +
    14#include <dr/mp/alignment.hpp>
    +
    15#include <dr/mp/views/segmented.hpp>
    +
    16
    +
    17namespace dr::mp::__detail {
    +
    18
    +
    19template <typename R>
    +
    20concept zipable = rng::random_access_range<R> && rng::common_range<R>;
    +
    21
    +
    22} // namespace dr::mp::__detail
    +
    23
    +
    24namespace dr::mp {
    +
    25
    +
    26template <__detail::zipable... Rs> class zip_view;
    +
    27
    +
    28namespace views {
    +
    29
    +
    30template <typename... Rs> auto zip(Rs &&...rs) {
    +
    31 return zip_view(std::forward<Rs>(rs)...);
    +
    32}
    +
    33
    +
    34} // namespace views
    +
    35
    +
    36namespace __detail {
    +
    37
    +
    38template <typename T>
    + + +
    41
    +
    42template <typename T, typename... Rest>
    +
    43inline auto select_segments(T &&t, Rest &&...rest) {
    +
    44 if constexpr (is_distributed<T>) {
    +
    45 return dr::ranges::segments(std::forward<T>(t));
    +
    46 } else {
    +
    47 return select_segments(std::forward<Rest>(rest)...);
    +
    48 }
    +
    49}
    +
    50
    +
    51template <typename T, typename Seg> inline auto tpl_segments(T &&t, Seg &&tpl) {
    +
    52 if constexpr (is_distributed<T>) {
    +
    53 return dr::ranges::segments(std::forward<T>(t));
    +
    54 } else if constexpr (rng::forward_range<T>) {
    +
    55 return views::segmented(std::forward<T>(t), std::forward<Seg>(tpl));
    +
    56 } else if constexpr (rng::forward_iterator<T>) {
    +
    57 return views::segmented(rng::subrange(std::forward<T>(t), T{}),
    +
    58 std::forward<Seg>(tpl));
    +
    59 }
    +
    60}
    +
    61
    +
    62template <typename Base> auto base_to_segments(Base &&base) {
    +
    63 // Given segments, return elementwise zip
    +
    64 auto zip_segments = [](auto &&...segments) {
    +
    65 return views::zip(segments...);
    +
    66 };
    +
    67
    +
    68 // Given a tuple of segments, return a single segment by doing
    +
    69 // elementwise zip
    +
    70 auto zip_segment_tuple = [zip_segments](auto &&v) {
    +
    71 return std::apply(zip_segments, v);
    +
    72 };
    +
    73
    +
    74 // Given base ranges, return segments
    +
    75 auto bases_to_segments = [zip_segment_tuple](auto &&...bases) {
    +
    76 bool is_aligned = aligned(bases...);
    +
    77 auto tpl = select_segments(bases...);
    +
    78 return rng::views::zip(tpl_segments(bases, tpl)...) |
    +
    79 rng::views::transform(zip_segment_tuple) |
    +
    80 rng::views::filter([is_aligned](auto &&v) { return is_aligned; });
    +
    81 };
    +
    82
    +
    83 return std::apply(bases_to_segments, base);
    +
    84}
    +
    85
    +
    86} // namespace __detail
    +
    87
    +
    88template <std::random_access_iterator RngIter,
    +
    89 std::random_access_iterator... BaseIters>
    + +
    91public:
    +
    92 using value_type = rng::iter_value_t<RngIter>;
    +
    93 using difference_type = rng::iter_difference_t<RngIter>;
    +
    94
    +
    95 using iterator_category = std::random_access_iterator_tag;
    +
    96
    +
    97 zip_iterator() {}
    +
    98 zip_iterator(RngIter rng_iter, BaseIters... base_iters)
    +
    99 : rng_iter_(rng_iter), base_(base_iters...) {}
    +
    100
    +
    101 auto operator+(difference_type n) const {
    +
    102 auto iter(*this);
    +
    103 iter.rng_iter_ += n;
    +
    104 iter.offset_ += n;
    +
    105 return iter;
    +
    106 }
    +
    107 friend auto operator+(difference_type n, const zip_iterator &other) {
    +
    108 return other + n;
    +
    109 }
    +
    110 auto operator-(difference_type n) const {
    +
    111 auto iter(*this);
    +
    112 iter.rng_iter_ -= n;
    +
    113 iter.offset_ -= n;
    +
    114 return iter;
    +
    115 }
    +
    116 auto operator-(zip_iterator other) const {
    +
    117 return rng_iter_ - other.rng_iter_;
    +
    118 }
    +
    119
    +
    120 auto &operator+=(difference_type n) {
    +
    121 rng_iter_ += n;
    +
    122 offset_ += n;
    +
    123 return *this;
    +
    124 }
    +
    125 auto &operator-=(difference_type n) {
    +
    126 rng_iter_ -= n;
    +
    127 offset_ -= n;
    +
    128 return *this;
    +
    129 }
    +
    130 auto &operator++() {
    +
    131 rng_iter_++;
    +
    132 offset_++;
    +
    133 return *this;
    +
    134 }
    +
    135 auto operator++(int) {
    +
    136 auto iter(*this);
    +
    137 rng_iter_++;
    +
    138 offset_++;
    +
    139 return iter;
    +
    140 }
    +
    141 auto &operator--() {
    +
    142 rng_iter_--;
    +
    143 offset_--;
    +
    144 return *this;
    +
    145 }
    +
    146 auto operator--(int) {
    +
    147 auto iter(*this);
    +
    148 rng_iter_--;
    +
    149 offset_--;
    +
    150 return iter;
    +
    151 }
    +
    152
    +
    153 bool operator==(zip_iterator other) const {
    +
    154 return rng_iter_ == other.rng_iter_;
    +
    155 }
    +
    156 auto operator<=>(zip_iterator other) const {
    +
    157 return offset_ <=> other.offset_;
    +
    158 }
    +
    159
    +
    160 // Underlying zip_iterator does not return a reference
    +
    161 auto operator*() const { return *rng_iter_; }
    +
    162 auto operator[](difference_type n) const { return rng_iter_[n]; }
    +
    163
    +
    164 //
    +
    165 // Distributed Ranges support
    +
    166 //
    +
    167 auto segments() const
    +
    168 requires(distributed_iterator<BaseIters> || ...)
    +
    169 {
    +
    170 return dr::__detail::drop_segments(__detail::base_to_segments(base_),
    +
    171 offset_);
    +
    172 }
    +
    173
    +
    174 auto rank() const
    +
    175 requires(remote_iterator<BaseIters> || ...)
    +
    176 {
    +
    177 return dr::ranges::rank(std::get<0>(base_));
    +
    178 }
    +
    179
    +
    180 auto local() const
    + +
    182 {
    +
    183 // Create a temporary zip_view and return the iterator. This code
    +
    184 // assumes the iterator is valid even if the underlying zip_view
    +
    185 // is destroyed.
    +
    186 auto zip = [this]<typename... Iters>(Iters &&...iters) {
    +
    187 return rng::begin(rng::views::zip(
    +
    188 rng::subrange(base_local(std::forward<Iters>(iters)) + this->offset_,
    +
    189 decltype(base_local(iters)){})...));
    +
    190 };
    +
    191
    +
    192 return std::apply(zip, base_);
    +
    193 }
    +
    194
    +
    195private:
    +
    196 // If it is not a remote iterator, assume it is a local iterator
    +
    197 auto static base_local(auto iter) { return iter; }
    +
    198
    +
    199 auto static base_local(dr::ranges::__detail::has_local auto iter) {
    +
    200 return dr::ranges::local(iter);
    +
    201 }
    +
    202
    +
    203 RngIter rng_iter_;
    +
    204 std::tuple<BaseIters...> base_;
    +
    205 difference_type offset_ = 0;
    +
    206};
    +
    207
    +
    208template <__detail::zipable... Rs>
    +
    209class zip_view : public rng::view_interface<zip_view<Rs...>> {
    +
    210private:
    +
    211 using rng_zip = rng::zip_view<Rs...>;
    +
    212 using rng_zip_iterator = rng::iterator_t<rng_zip>;
    +
    213 using difference_type = std::iter_difference_t<rng_zip_iterator>;
    +
    214
    +
    215public:
    +
    216 zip_view(Rs... rs)
    +
    217 : rng_zip_(rng::views::all(rs)...), base_(rng::views::all(rs)...) {}
    +
    218
    +
    219 auto begin() const {
    +
    220 auto make_begin = [this](auto &&...bases) {
    +
    221 return zip_iterator(rng::begin(this->rng_zip_), rng::begin(bases)...);
    +
    222 };
    +
    223 return std::apply(make_begin, base_);
    +
    224 }
    +
    225 auto end() const
    +
    226 requires(rng::common_range<rng_zip>)
    +
    227 {
    +
    228 auto make_end = [this](auto &&...bases) {
    +
    229 return zip_iterator(rng::end(this->rng_zip_), rng::end(bases)...);
    +
    230 };
    +
    231 return std::apply(make_end, base_);
    +
    232 }
    +
    233 auto size() const { return rng::size(rng_zip_); }
    +
    234
    +
    235 auto operator[](difference_type n) const { return rng_zip_[n]; }
    +
    236
    +
    237 auto base() const { return base_; }
    +
    238
    +
    239 //
    +
    240 // Distributed Ranges support
    +
    241 //
    +
    242 auto segments() const
    +
    243 requires(distributed_range<Rs> || ...)
    +
    244 {
    +
    245 return __detail::base_to_segments(base_);
    +
    246 }
    +
    247
    +
    248 auto rank() const
    +
    249 requires(remote_range<Rs> || ...)
    +
    250 {
    +
    251 return dr::ranges::rank(std::get<0>(base_));
    +
    252 }
    +
    253
    +
    254 auto local() const
    +
    255 requires(remote_range<Rs> || ...)
    +
    256 {
    +
    257 auto zip = []<typename... Vs>(Vs &&...bases) {
    +
    258 return rng::views::zip(dr::ranges::local(std::forward<Vs>(bases))...);
    +
    259 };
    +
    260
    +
    261 return std::apply(zip, base_);
    +
    262 }
    +
    263
    +
    264private:
    +
    265 rng_zip rng_zip_;
    +
    266 std::tuple<rng::views::all_t<Rs>...> base_;
    +
    267};
    +
    268
    +
    269template <typename... Rs>
    + +
    271
    +
    272} // namespace dr::mp
    +
    Definition: zip.hpp:90
    +
    Definition: zip.hpp:209
    +
    Definition: concepts.hpp:31
    +
    Definition: concepts.hpp:20
    +
    Definition: zip.hpp:39
    +
    Definition: zip.hpp:20
    +
    Definition: ranges.hpp:242
    +
    Definition: concepts.hpp:12
    +
    Definition: concepts.hpp:16
    +
    + + + + diff --git a/doxygen/zip__view_8hpp_source.html b/doxygen/zip__view_8hpp_source.html new file mode 100644 index 0000000000..5d464ee9ed --- /dev/null +++ b/doxygen/zip__view_8hpp_source.html @@ -0,0 +1,442 @@ + + + + + + + +Distributed Ranges: /opt/actions-runner/_work/distributed-ranges/distributed-ranges/include/dr/sp/zip_view.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    zip_view.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <oneapi/dpl/iterator>
    +
    8
    +
    9#include <dr/detail/iterator_adaptor.hpp>
    +
    10#include <dr/detail/owning_view.hpp>
    +
    11#include <dr/detail/ranges_shim.hpp>
    +
    12#include <dr/detail/view_detectors.hpp>
    +
    13#include <dr/sp/device_span.hpp>
    +
    14
    +
    15namespace dr {
    +
    16
    +
    17template <typename T> struct is_owning_view : std::false_type {};
    +
    18// template <rng::range R>
    +
    19// struct is_owning_view<rng::owning_view<R>> : std::true_type {};
    +
    20
    +
    21template <typename T>
    +
    22inline constexpr bool is_owning_view_v = is_owning_view<T>{};
    +
    23
    +
    24}; // namespace dr
    +
    25
    +
    26namespace dr::sp {
    +
    27
    +
    28namespace __detail {
    +
    29
    +
    30template <typename... Args> struct tuple_or_pair {
    +
    31 using type = std::tuple<Args...>;
    +
    32};
    +
    33
    +
    34template <typename T, typename U> struct tuple_or_pair<T, U> {
    +
    35 using type = std::pair<T, U>;
    +
    36};
    +
    37
    +
    38template <typename... Args>
    +
    39using tuple_or_pair_t = typename tuple_or_pair<Args...>::type;
    +
    40
    +
    41}; // namespace __detail
    +
    42
    +
    43template <rng::random_access_iterator... Iters> class zip_accessor {
    +
    44public:
    +
    45 using element_type = __detail::tuple_or_pair_t<std::iter_value_t<Iters>...>;
    +
    46 using value_type = element_type;
    +
    47 using size_type = std::size_t;
    +
    48 using difference_type = std::ptrdiff_t;
    +
    49 using reference = __detail::tuple_or_pair_t<std::iter_reference_t<Iters>...>;
    +
    50
    +
    51 using iterator_category = std::random_access_iterator_tag;
    +
    52
    + + + +
    56
    +
    57 constexpr zip_accessor() noexcept = default;
    +
    58 constexpr ~zip_accessor() noexcept = default;
    +
    59 constexpr zip_accessor(const zip_accessor &) noexcept = default;
    +
    60 constexpr zip_accessor &operator=(const zip_accessor &) noexcept = default;
    +
    61
    +
    62 constexpr zip_accessor(Iters... iters) : iterators_(iters...) {}
    +
    63
    +
    64 zip_accessor &operator+=(difference_type offset) {
    +
    65 auto increment = [&](auto &&iter) { iter += offset; };
    +
    66 iterators_apply_impl_<0>(increment);
    +
    67 return *this;
    +
    68 }
    +
    69
    +
    70 constexpr bool operator==(const iterator_accessor &other) const noexcept {
    +
    71 return std::get<0>(iterators_) == std::get<0>(other.iterators_);
    +
    72 }
    +
    73
    +
    74 constexpr difference_type
    +
    75 operator-(const iterator_accessor &other) const noexcept {
    +
    76 return std::get<0>(iterators_) - std::get<0>(other.iterators_);
    +
    77 }
    +
    78
    +
    79 constexpr bool operator<(const iterator_accessor &other) const noexcept {
    +
    80 return std::get<0>(iterators_) < std::get<0>(other.iterators_);
    +
    81 }
    +
    82
    +
    83 constexpr reference operator*() const noexcept {
    +
    84 return get_impl_(std::make_index_sequence<sizeof...(Iters)>{});
    +
    85 }
    +
    86
    +
    87private:
    +
    88 template <std::size_t... Ints>
    +
    89 reference get_impl_(std::index_sequence<Ints...>) const noexcept {
    +
    90 return reference(*std::get<Ints>(iterators_)...);
    +
    91 }
    +
    92
    +
    93 template <std::size_t I, typename Fn> void iterators_apply_impl_(Fn &&fn) {
    +
    94 fn(std::get<I>(iterators_));
    +
    95 if constexpr (I + 1 < sizeof...(Iters)) {
    +
    96 iterators_apply_impl_<I + 1>(fn);
    +
    97 }
    +
    98 }
    +
    99
    +
    100 std::tuple<Iters...> iterators_;
    +
    101};
    +
    102
    +
    103template <rng::random_access_iterator... Iters>
    + +
    105
    +
    107template <rng::random_access_range... Rs>
    +
    108class zip_view : public rng::view_interface<zip_view<Rs...>> {
    +
    109public:
    +
    110 using size_type = std::size_t;
    +
    111 using difference_type = std::ptrdiff_t;
    +
    112
    +
    113 zip_view(Rs... rs) : views_(rng::views::all(std::forward<Rs>(rs))...) {
    +
    114 std::array<std::size_t, sizeof...(Rs)> sizes = {
    +
    115 std::size_t(rng::distance(rs))...};
    +
    116
    +
    117 // TODO: support zipped views with some ranges shorter than others
    +
    118 size_ = sizes[0];
    +
    119
    +
    120 for (auto &&size : sizes) {
    +
    121 size_ = std::min(size_, size);
    +
    122 }
    +
    123 }
    +
    124
    +
    125 std::size_t size() const noexcept { return size_; }
    +
    126
    +
    127 auto begin() const {
    +
    128 return begin_impl_(std::make_index_sequence<sizeof...(Rs)>{});
    +
    129 }
    +
    130
    +
    131 auto end() const { return begin() + size(); }
    +
    132
    +
    133 auto operator[](std::size_t idx) const { return *(begin() + idx); }
    +
    134
    +
    135 static constexpr bool num_views = sizeof...(Rs);
    +
    136
    +
    137 template <std::size_t I> decltype(auto) get_view() const {
    +
    138 auto &&view = std::get<I>(views_);
    +
    139
    +
    140 if constexpr (dr::is_ref_view_v<std::remove_cvref_t<decltype(view)>> ||
    +
    141 dr::is_owning_view_v<std::remove_cvref_t<decltype(view)>>) {
    +
    142 return view.base();
    +
    143 } else {
    +
    144 return view;
    +
    145 }
    +
    146 }
    +
    147
    +
    148 // If there is at least one distributed range, expose segments
    +
    149 // of overlapping remote ranges.
    +
    150 auto segments() const
    +
    151 requires(dr::distributed_range<Rs> || ...)
    +
    152 {
    +
    153 std::array<std::size_t, sizeof...(Rs)> segment_ids;
    +
    154 std::array<std::size_t, sizeof...(Rs)> local_idx;
    +
    155 segment_ids.fill(0);
    +
    156 local_idx.fill(0);
    +
    157
    +
    158 std::size_t cumulative_size = 0;
    +
    159
    +
    160 using segment_view_type = decltype(get_zipped_view_impl_(
    +
    161 segment_ids, local_idx, 0, std::make_index_sequence<sizeof...(Rs)>{}));
    +
    162 std::vector<segment_view_type> segment_views;
    +
    163
    +
    164 while (cumulative_size < size()) {
    +
    165 auto size = get_next_segment_size(segment_ids, local_idx);
    +
    166
    +
    167 cumulative_size += size;
    +
    168
    +
    169 // Create zipped segment with
    +
    170 // zip_view(segments()[Is].subspan(local_idx[Is], size)...) And some rank
    +
    171 // (e.g. get_view<0>.rank())
    +
    172 auto segment_view =
    +
    173 get_zipped_view_impl_(segment_ids, local_idx, size,
    +
    174 std::make_index_sequence<sizeof...(Rs)>{});
    +
    175
    +
    176 segment_views.push_back(std::move(segment_view));
    +
    177
    +
    178 increment_local_idx(segment_ids, local_idx, size);
    +
    179 }
    +
    180
    +
    181 return dr::__detail::owning_view(std::move(segment_views));
    +
    182 }
    +
    183
    +
    184 // Return a range corresponding to each segment in `segments()`,
    +
    185 // but with a tuple of the constituent ranges instead of a
    +
    186 // `zip_view` of the ranges.
    +
    187 auto zipped_segments() const
    +
    188 requires(dr::distributed_range<Rs> || ...)
    +
    189 {
    +
    190 std::array<std::size_t, sizeof...(Rs)> segment_ids;
    +
    191 std::array<std::size_t, sizeof...(Rs)> local_idx;
    +
    192 segment_ids.fill(0);
    +
    193 local_idx.fill(0);
    +
    194
    +
    195 std::size_t cumulative_size = 0;
    +
    196
    +
    197 using segment_view_type = decltype(get_zipped_segments_impl_(
    +
    198 segment_ids, local_idx, 0, std::make_index_sequence<sizeof...(Rs)>{}));
    +
    199 std::vector<segment_view_type> segment_views;
    +
    200
    +
    201 while (cumulative_size < size()) {
    +
    202 auto size = get_next_segment_size(segment_ids, local_idx);
    +
    203
    +
    204 cumulative_size += size;
    +
    205
    +
    206 // Get zipped segments with
    +
    207 // std::tuple(segments()[Is].subspan(local_idx[Is], size)...)
    +
    208 auto segment_view =
    +
    209 get_zipped_segments_impl_(segment_ids, local_idx, size,
    +
    210 std::make_index_sequence<sizeof...(Rs)>{});
    +
    211
    +
    212 segment_views.push_back(std::move(segment_view));
    +
    213
    +
    214 increment_local_idx(segment_ids, local_idx, size);
    +
    215 }
    +
    216
    +
    217 return dr::__detail::owning_view(std::move(segment_views));
    +
    218 }
    +
    219
    +
    220 auto local() const noexcept
    +
    221 requires(!(dr::distributed_range<Rs> || ...))
    +
    222 {
    +
    223 return local_impl_(std::make_index_sequence<sizeof...(Rs)>());
    +
    224 }
    +
    225
    +
    226 // If:
    +
    227 // - There is at least one remote range in the zip
    +
    228 // - There are no distributed ranges in the zip
    +
    229 // Expose a rank.
    +
    230 std::size_t rank() const
    +
    231 requires((dr::remote_range<Rs> || ...) &&
    + +
    233 {
    +
    234 return get_rank_impl_<0, Rs...>();
    +
    235 }
    +
    236
    +
    237private:
    +
    238 template <std::size_t... Ints>
    +
    239 auto local_impl_(std::index_sequence<Ints...>) const noexcept {
    +
    240 return rng::views::zip(__detail::local(std::get<Ints>(views_))...);
    +
    241 }
    +
    242
    +
    243 template <std::size_t I, typename R> std::size_t get_rank_impl_() const {
    +
    244 static_assert(I < sizeof...(Rs));
    +
    245 return dr::ranges::rank(get_view<I>());
    +
    246 }
    +
    247
    +
    248 template <std::size_t I, typename R, typename... Rs_>
    +
    249 requires(sizeof...(Rs_) > 0)
    +
    250 std::size_t get_rank_impl_() const {
    +
    251 static_assert(I < sizeof...(Rs));
    +
    252 if constexpr (dr::remote_range<R>) {
    +
    253 return dr::ranges::rank(get_view<I>());
    +
    254 } else {
    +
    255 return get_rank_impl_<I + 1, Rs_...>();
    +
    256 }
    +
    257 }
    +
    258
    +
    259 template <typename T> auto create_view_impl_(T &&t) const {
    +
    260 if constexpr (dr::remote_range<T>) {
    +
    261 return dr::sp::device_span(std::forward<T>(t));
    +
    262 } else {
    +
    263 return dr::sp::span(std::forward<T>(t));
    +
    264 }
    +
    265 }
    +
    266
    +
    267 template <std::size_t... Is>
    +
    268 auto get_zipped_view_impl_(auto &&segment_ids, auto &&local_idx,
    +
    269 std::size_t size,
    +
    270 std::index_sequence<Is...>) const {
    +
    271 return zip_view<decltype(create_view_impl_(
    +
    272 segment_or_orig_(get_view<Is>(),
    +
    273 segment_ids[Is]))
    +
    274 .subspan(local_idx[Is], size))...>(
    +
    275 create_view_impl_(segment_or_orig_(get_view<Is>(), segment_ids[Is]))
    +
    276 .subspan(local_idx[Is], size)...);
    +
    277 }
    +
    278
    +
    279 template <std::size_t... Is>
    +
    280 auto get_zipped_segments_impl_(auto &&segment_ids, auto &&local_idx,
    +
    281 std::size_t size,
    +
    282 std::index_sequence<Is...>) const {
    +
    283 return std::tuple(
    +
    284 create_view_impl_(segment_or_orig_(get_view<Is>(), segment_ids[Is]))
    +
    285 .subspan(local_idx[Is], size)...);
    +
    286 }
    +
    287
    +
    288 template <std::size_t I = 0>
    +
    289 void increment_local_idx(auto &&segment_ids, auto &&local_idx,
    +
    290 std::size_t size) const {
    +
    291 local_idx[I] += size;
    +
    292
    +
    293 if (local_idx[I] >=
    +
    294 rng::distance(segment_or_orig_(get_view<I>(), segment_ids[I]))) {
    +
    295 local_idx[I] = 0;
    +
    296 segment_ids[I]++;
    +
    297 }
    +
    298
    +
    299 if constexpr (I + 1 < sizeof...(Rs)) {
    +
    300 increment_local_idx<I + 1>(segment_ids, local_idx, size);
    +
    301 }
    +
    302 }
    +
    303
    +
    304 template <std::size_t... Is>
    +
    305 auto begin_impl_(std::index_sequence<Is...>) const {
    + +
    307 rng::begin(std::get<Is>(views_))...);
    +
    308 }
    +
    309
    +
    310 template <dr::distributed_range T>
    +
    311 decltype(auto) segment_or_orig_(T &&t, std::size_t idx) const {
    +
    312 return dr::ranges::segments(t)[idx];
    +
    313 }
    +
    314
    +
    315 template <typename T>
    +
    316 decltype(auto) segment_or_orig_(T &&t, std::size_t idx) const {
    +
    317 return t;
    +
    318 }
    +
    319
    +
    320 template <std::size_t... Is>
    +
    321 std::size_t get_next_segment_size_impl_(auto &&segment_ids, auto &&local_idx,
    +
    322 std::index_sequence<Is...>) const {
    +
    323 return std::min({std::size_t(rng::distance(
    +
    324 segment_or_orig_(get_view<Is>(), segment_ids[Is]))) -
    +
    325 local_idx[Is]...});
    +
    326 }
    +
    327
    +
    328 std::size_t get_next_segment_size(auto &&segment_ids,
    +
    329 auto &&local_idx) const {
    +
    330 return get_next_segment_size_impl_(
    +
    331 segment_ids, local_idx, std::make_index_sequence<sizeof...(Rs)>{});
    +
    332 }
    +
    333
    +
    334 std::tuple<rng::views::all_t<Rs>...> views_;
    +
    335 std::size_t size_;
    +
    336};
    +
    337
    +
    338template <typename... Rs> zip_view(Rs &&...rs) -> zip_view<Rs...>;
    +
    339
    +
    340namespace views {
    +
    341
    +
    343template <rng::random_access_range... Rs> auto zip(Rs &&...rs) {
    +
    344 return dr::sp::zip_view(std::forward<Rs>(rs)...);
    +
    345}
    +
    346
    +
    347} // namespace views
    +
    348
    +
    349} // namespace dr::sp
    +
    Definition: owning_view.hpp:18
    +
    Definition: iterator_adaptor.hpp:23
    +
    Definition: device_span.hpp:44
    +
    Definition: span.hpp:14
    +
    Definition: zip_view.hpp:43
    +
    zip
    Definition: zip_view.hpp:108
    +
    Definition: concepts.hpp:20
    +
    Definition: concepts.hpp:16
    +
    Definition: zip_view.hpp:17
    +
    Definition: zip_view.hpp:30
    +
    + + + + diff --git a/spec/.buildinfo b/spec/.buildinfo new file mode 100644 index 0000000000..61dcd95bfd --- /dev/null +++ b/spec/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 8f6231b2b4c9ad2472f3c61520fc42ec +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/spec/_sources/algorithms/algorithms.rst b/spec/_sources/algorithms/algorithms.rst new file mode 100644 index 0000000000..d721423c0d --- /dev/null +++ b/spec/_sources/algorithms/algorithms.rst @@ -0,0 +1,32 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +============ + Algorithms +============ + +Algorithms on distributed ranges. + +.. toctree:: + :maxdepth: 1 + + copy + exclusive_scan + fill + for_each + inclusive_scan + iota + reduce + sort + transform + +# transform_reduce + +Algorithms on matrices, dense and sparse + +.. toctree:: + :maxdepth: 1 + + sp_matrix_gemm + sp_matrix_gemv diff --git a/spec/_sources/algorithms/copy.rst b/spec/_sources/algorithms/copy.rst new file mode 100644 index 0000000000..5aeca76754 --- /dev/null +++ b/spec/_sources/algorithms/copy.rst @@ -0,0 +1,45 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _copy: + +========== + ``copy`` +========== + +Interface +========= + +MP +--- + +.. doxygenfunction:: dr::mp::copy(rng::forward_range auto &&in, dr::distributed_iterator auto out) + :outline: +.. doxygenfunction:: dr::mp::copy(DI_IN &&first, DI_IN &&last, dr::distributed_iterator auto &&out) + :outline: +.. doxygenfunction:: dr::mp::copy(std::size_t root, dr::distributed_contiguous_range auto &&in, std::contiguous_iterator auto out) + :outline: +.. doxygenfunction:: dr::mp::copy(std::size_t root, rng::contiguous_range auto &&in, dr::distributed_contiguous_iterator auto out) + :outline: + +SP +--- + +.. doxygenfunction:: dr::sp::copy(InputIt first, InputIt last, OutputIt d_first) + :outline: +.. doxygenfunction:: dr::sp::copy(device_ptr first, device_ptr last, Iter d_first) + :outline: + + +Description +=========== + +.. seealso:: + + `std::ranges::copy`_ + Standard C++ algorithm + `std::copy`_ + Standard C++ algorithm diff --git a/spec/_sources/algorithms/exclusive_scan.rst b/spec/_sources/algorithms/exclusive_scan.rst new file mode 100644 index 0000000000..915e43aece --- /dev/null +++ b/spec/_sources/algorithms/exclusive_scan.rst @@ -0,0 +1,46 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _exclusive_scan: + +============================ + ``exclusive_scan`` +============================ + +Interface +========= +MP +--- + +SP +--- + +.. doxygenfunction:: dr::sp::exclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o, T init, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::sp::exclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o, T init) + :outline: +.. doxygenfunction:: dr::sp::exclusive_scan(R &&r, O &&o, T init, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::sp::exclusive_scan(R &&r, O &&o, T init) + :outline: +.. doxygenfunction:: dr::sp::exclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last, OutputIter d_first, T init, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::sp::exclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last, OutputIter d_first, T init) + :outline: +.. doxygenfunction:: dr::sp::exclusive_scan(Iter first, Iter last, OutputIter d_first, T init, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::sp::exclusive_scan(Iter first, Iter last, OutputIter d_first, T init) + :outline + +Description +=========== + +.. seealso:: + + 'std::exclusive_scan'_ + +Examples +======== diff --git a/spec/_sources/algorithms/fill.rst b/spec/_sources/algorithms/fill.rst new file mode 100644 index 0000000000..d26cb53f86 --- /dev/null +++ b/spec/_sources/algorithms/fill.rst @@ -0,0 +1,57 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _fill: + +========== + ``fill`` +========== + +Interface +========= + +MP +--- + +.. doxygenfunction:: dr::mp::fill(dr::distributed_contiguous_range auto &&dr, auto value); + :outline: +.. doxygenfunction:: dr::mp::fill(DI first, DI last, auto value) + :outline: + +SP +--- + +.. doxygenfunction:: dr::sp::fill_async(Iter first, Iter last, const std::iter_value_t &value) + :outline: +.. doxygenfunction:: dr::sp::fill(Iter first, Iter last, const std::iter_value_t &value) + :outline: +.. doxygenfunction:: dr::sp::fill_async(device_ptr first, device_ptr last, const U &value) + :outline: +.. doxygenfunction:: dr::sp::fill(device_ptr first, device_ptr last, const U &value) + :outline: +.. doxygenfunction:: dr::sp::fill_async(R &&r, const T &value) + :outline: +.. doxygenfunction:: dr::sp::fill(R &&r, const T &value) + :outline: +.. doxygenfunction:: dr::sp::fill_async(DR &&r, const T &value) + :outline: +.. doxygenfunction:: dr::sp::fill(DR &&r, const T &value) + :outline: +.. doxygenfunction:: dr::sp::fill(Iter first, Iter last, const T &value) + :outline: + +Description +=========== + +.. seealso:: + + C++ model + `std::fill`_ + C++ model + `std::ranges::fill`_ + +Usage +===== diff --git a/spec/_sources/algorithms/for_each.rst b/spec/_sources/algorithms/for_each.rst new file mode 100644 index 0000000000..63947218d2 --- /dev/null +++ b/spec/_sources/algorithms/for_each.rst @@ -0,0 +1,45 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _for_each: + +============== + ``for_each`` +============== + +Interface +========= +MP +--- +.. doxygenfunction:: dr::mp::for_each(dr::distributed_range auto &&dr, auto op) + :outline: +.. doxygenfunction:: dr::mp::for_each(DI first, DI last, auto op) + :outline: + +SP +--- + +.. doxygenfunction:: dr::sp::for_each(ExecutionPolicy &&policy, R &&r, Fn &&fn) + :outline: +.. doxygenfunction:: dr::sp::for_each(ExecutionPolicy &&policy, Iter begin, Iter end, Fn &&fn) + :outline: +.. doxygenfunction:: dr::sp::for_each(R &&r, Fn &&fn) + :outline: +.. doxygenfunction:: dr::sp::for_each(Iter begin, Iter end, Fn &&fn) + :outline: + +Description +=========== + +.. seealso:: + + `std::ranges::for_each`_ + Standard C++ algorithm + `std::for_each`_ + Standard C++ algorithm + +Examples +======== diff --git a/spec/_sources/algorithms/inclusive_scan.rst b/spec/_sources/algorithms/inclusive_scan.rst new file mode 100644 index 0000000000..d46ad7f8f6 --- /dev/null +++ b/spec/_sources/algorithms/inclusive_scan.rst @@ -0,0 +1,61 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _inclusive_scan: + +============================ + ``inclusive_scan`` +============================ + +Interface +========= + +MP +--- + +SP +--- + +.. doxygenfunction:: dr::sp::inclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o, BinaryOp &&binary_op, T init) + :outline: +.. doxygenfunction:: dr::sp::inclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::sp::inclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o) + :outline: +.. doxygenfunction:: dr::sp::inclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last, OutputIter d_first, BinaryOp &&binary_op, T init) + :outline: +.. doxygenfunction:: dr::sp::inclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last, OutputIter d_first, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::sp::inclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last, OutputIter d_first) + :outline: + +Execution policy-less versions + +.. doxygenfunction:: dr::sp::inclusive_scan(R &&r, O &&o) + :outline: +.. doxygenfunction:: dr::sp::inclusive_scan(R &&r, O &&o, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::sp::inclusive_scan(R &&r, O &&o, BinaryOp &&binary_op, T init) + :outline: + +Distributed iterator versions + +.. doxygenfunction:: dr::sp::inclusive_scan(Iter first, Iter last, OutputIter d_first) + :outline: +.. doxygenfunction:: dr::sp::inclusive_scan(Iter first, Iter last, OutputIter d_first, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::sp::inclusive_scan(Iter first, Iter last, OutputIter d_first, BinaryOp &&binary_op, T init) + :outline: + +Description +=========== + +.. seealso:: + + 'std::inclusive_scan'_ + +Examples +======== diff --git a/spec/_sources/algorithms/iota.rst b/spec/_sources/algorithms/iota.rst new file mode 100644 index 0000000000..cfecdf01fe --- /dev/null +++ b/spec/_sources/algorithms/iota.rst @@ -0,0 +1,45 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _iota: + +========== + ``iota`` +========== + +Interface +========= + +MP +--- + +.. doxygenfunction:: dr::mp::iota(R &&r, T value) + :outline: +.. doxygenfunction:: dr::mp::iota(Iter begin, Iter end, T value) + :outline: + +SP +--- + +.. doxygenfunction:: dr::sp::iota(R &&r, T value) + :outline: +.. doxygenfunction:: dr::sp::iota(Iter begin, Iter end, T value) + :outline: + + + +Description +=========== + +.. seealso:: + + `std::ranges::iota`_ + Standard C++ algorithm + `std::iota`_ + Standard C++ algorithm + +Usage +===== diff --git a/spec/_sources/algorithms/reduce.rst b/spec/_sources/algorithms/reduce.rst new file mode 100644 index 0000000000..8cc4862f1c --- /dev/null +++ b/spec/_sources/algorithms/reduce.rst @@ -0,0 +1,78 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _reduce: + +============ + ``reduce`` +============ + +Interface +========= + +MP +--- + +.. doxygenfunction:: dr::mp::reduce(std::size_t root, DR &&dr, T init, auto &&binary_op) + :outline: +.. doxygenfunction:: dr::mp::reduce(DR &&dr, T init, auto &&binary_op) + :outline: +.. doxygenfunction:: dr::mp::reduce(std::size_t root, DR &&dr, T init) + :outline: +.. doxygenfunction:: dr::mp::reduce(DR &&dr, T init) + :outline: +.. doxygenfunction:: dr::mp::reduce(std::size_t root, DR &&dr) + :outline: +.. doxygenfunction:: dr::mp::reduce(DR &&dr) + :outline: +.. doxygenfunction:: dr::mp::reduce(std::size_t root, DI first, DI last, T init, auto &&binary_op) + :outline: +.. doxygenfunction:: dr::mp::reduce(DI first, DI last, T init, auto &&binary_op) + :outline: +.. doxygenfunction:: dr::mp::reduce(std::size_t root, DI first, DI last, T init) + :outline: +.. doxygenfunction:: dr::mp::reduce(DI first, DI last, T init) + :outline: +.. doxygenfunction:: dr::mp::reduce(std::size_t root, DI first, DI last) + :outline: +.. doxygenfunction:: dr::mp::reduce(DI first, DI last) + :outline: + +SP +--- + +.. doxygenfunction:: dr::sp::reduce(ExecutionPolicy &&policy, R &&r, T init, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::sp::reduce(ExecutionPolicy &&policy, R &&r, T init) + :outline: +.. doxygenfunction:: dr::sp::reduce(ExecutionPolicy &&policy, R &&r) + :outline: + +Iterator versions + +.. doxygenfunction:: dr::sp::reduce(ExecutionPolicy &&policy, Iter first, Iter last) + :outline: +.. doxygenfunction:: dr::sp::reduce(ExecutionPolicy &&policy, Iter first, Iter last, T init) + :outline: +.. doxygenfunction:: dr::sp::reduce(ExecutionPolicy &&policy, Iter first, Iter last, T init, BinaryOp &&binary_op) + :outline: + +Execution policy-less algorithms + +.. doxygenfunction:: dr::sp::reduce(R &&r) + :outline: +.. doxygenfunction:: dr::sp::reduce(R &&r, T init) + :outline: +.. doxygenfunction:: dr::sp::reduce(R &&r, T init, BinaryOp &&binary_op) + :outline: + +Description +=========== + +.. seealso:: `std::reduce`_ + +Examples +======== diff --git a/spec/_sources/algorithms/sort.rst b/spec/_sources/algorithms/sort.rst new file mode 100644 index 0000000000..689fb7bcd3 --- /dev/null +++ b/spec/_sources/algorithms/sort.rst @@ -0,0 +1,38 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _sort: + +========== + ``sort`` +========== + +Interface +========= + +MP +--- + +SP +--- + +.. doxygenfunction:: dr::sp::sort(R &&r, Compare comp = Compare()) + :outline: +.. doxygenfunction:: dr::sp::sort(RandomIt first, RandomIt last, Compare comp = Compare()) + :outline: + +Description +=========== + +.. seealso:: + + C++ model + `std::sort`_ + C++ model + `std::ranges::sort`_ + +Usage +===== diff --git a/spec/_sources/algorithms/sp_matrix_gemm.rst b/spec/_sources/algorithms/sp_matrix_gemm.rst new file mode 100644 index 0000000000..d5f16faded --- /dev/null +++ b/spec/_sources/algorithms/sp_matrix_gemm.rst @@ -0,0 +1,23 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _gemm: + +====================== + ``gemm`` +====================== + +Interface +========= + +.. doxygenfunction:: dr::sp::gemm(distributed_dense_matrix &a, distributed_dense_matrix &b, distributed_dense_matrix &c) + +Description +=========== + + +Examples +======== diff --git a/spec/_sources/algorithms/sp_matrix_gemv.rst b/spec/_sources/algorithms/sp_matrix_gemv.rst new file mode 100644 index 0000000000..d48ca1225f --- /dev/null +++ b/spec/_sources/algorithms/sp_matrix_gemv.rst @@ -0,0 +1,27 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _gemv: + +====================== + ``gemv`` +====================== + +Interface +========= + +.. doxygenfunction:: dr::sp::flat_gemv(C &&c, dr::sp::sparse_matrix &a, B &&b) +.. doxygenfunction:: dr::sp::gemv(C &&c, dr::sp::sparse_matrix &a, B &&b, sp::duplicated_vector> &scratch) +.. doxygenfunction:: dr::sp::gemv(C &&c, dr::sp::sparse_matrix &a, B &&b) +.. doxygenfunction:: dr::sp::gemv_square(C &&c, dr::sp::sparse_matrix &a, B &&b) +.. doxygenfunction:: dr::sp::gemv_square_copy(C &&c, dr::sp::sparse_matrix &a, B &&b) + +Description +=========== + + +Examples +======== diff --git a/spec/_sources/algorithms/transform.rst b/spec/_sources/algorithms/transform.rst new file mode 100644 index 0000000000..9cda409d86 --- /dev/null +++ b/spec/_sources/algorithms/transform.rst @@ -0,0 +1,44 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _transform: + +=============== + ``transform`` +=============== + +Interface +========= + +MP +--- + +.. doxygenfunction:: dr::mp::transform(rng::forward_range auto &&in, dr::distributed_iterator auto out, auto op) +.. doxygenfunction:: dr::mp::transform(DI_IN &&first, DI_IN &&last, dr::distributed_iterator auto &&out, auto op) + +SP +--- + +.. doxygenfunction:: dr::sp::transform(ExecutionPolicy &&policy, dr::distributed_range auto &&in, dr::distributed_iterator auto out, auto &&fn) +.. doxygenfunction:: dr::sp::transform(R &&in, Iter out, Fn &&fn) +.. doxygenfunction:: dr::sp::transform(ExecutionPolicy &&policy, Iter1 in_begin, Iter1 in_end, Iter2 out_end, Fn &&fn) +.. doxygenfunction:: dr::sp::transform(Iter1 in_begin, Iter1 in_end, Iter2 out_end, Fn &&fn) + + +Description +=========== + +.. seealso:: + + `std::transform`_ + C++ model + `std::ranges::transform`_ + C++ range-based model + :ref:`reduce` + related algorithm + +Usage +===== diff --git a/spec/_sources/arch.rst b/spec/_sources/arch.rst new file mode 100644 index 0000000000..464c8e9d45 --- /dev/null +++ b/spec/_sources/arch.rst @@ -0,0 +1,14 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +============== + Architecture +============== + +See `Distributed Ranges, why you need it`_ presentation +and all other materials listed in `Documentation`_ section +on Distributed Ranges repository main page. + +.. _`Distributed Ranges, why you need it`: https://github.com/oneapi-src/distributed-ranges/blob/main/doc/presentations/Distributed%20Ranges%2C%20why%20you%20need%20it.pdf +.. _`Documentation`: https://github.com/oneapi-src/distributed-ranges/blob/main/README.rst diff --git a/spec/_sources/concepts.rst b/spec/_sources/concepts.rst new file mode 100644 index 0000000000..cca429cc38 --- /dev/null +++ b/spec/_sources/concepts.rst @@ -0,0 +1,177 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. _concepts: + +======== +Concepts +======== + +``remote_iterator`` +=================== + +.. doxygenconcept:: dr::remote_iterator + +Defined in ``concepts.hpp`` +:: + + template + concept remote_iterator = + std::forward_iterator && requires(I &iter) { dr::ranges::rank(iter); }; + +Requirements +"""""""""""" +1. ``I`` fulfills ``std::forward_iterator`` +2. ``i`` has a method ``rank`` returning the rank on which the memory + ``i`` references is located. + +``remote_range`` +================ + +.. doxygenconcept:: dr::remote_range + +Defined in ``concepts.hpp`` +:: + + template + concept remote_range = + rng::forward_range && requires(R &r) { dr::ranges::rank(r); }; + +Requirements +"""""""""""" +1. ``R`` fulfills ``rng::forward_range`` +2. ``r`` has a method ``rank`` returning the rank on which the memory + ``r`` references is located. + +``distributed_range`` +===================== + +.. doxygenconcept:: dr::distributed_range + +Defined in ``concepts.hpp`` +:: + + template + concept distributed_range = + rng::forward_range && requires(R &r) { dr::ranges::segments(r); }; + +Requirements +"""""""""""" +1. ``R`` fulfills ``rng::forward_range`` +2. ``r`` has a method ``segments`` + +``remote_contiguous_iterator`` +============================== + +.. doxygenconcept:: dr::remote_contiguous_iterator + +A remote contiguous iterator acts as a pointer to some contiguous piece +of remote memory. + +Defined in ``concepts.hpp`` +:: + + template + concept remote_contiguous_iterator = std::random_access_iterator && + requires(I i) { + { i.rank() } -> std::convertible_to; + { i.local() } -> std::contiguous_iterator; + }; + + +Requirements +"""""""""""" + +An object `i` of type ``I`` fulfills ``remote_contiguous_iterator`` +if and only if: + +1. ``I`` fulfills ``std::random_access_iterator`` +2. ``i`` has a method ``rank`` returning the rank on which the memory + ``i`` references is located. +3. ``i`` has a method ``local`` returning an object ``l`` whose type + fulfills ``std::contiguous_iterator``. Dereferencing ``l`` is + well-defined if the current rank is equal ``i.rank()``. + +Remarks +""""""" +Instantiations of `remote_ptr`, `device_ptr`, and `BCL::GlobalPtr` should all +fulfill ``remote_contiguous_iterator``. + + +``remote_contiguous_range`` +=========================== + +.. doxygenconcept:: dr::remote_contiguous_range + +A remote contiguous range is a range located in a contiguous piece of remote +memory. + +Defined in ``concepts.hpp`` + +:: + + template + concept remote_contiguous_range = std::ranges::random_access_range && + remote_contiguous_iterator> && requires(T t) { + { t.rank() } -> std::convertible_to; + }; + + +Requirements +"""""""""""" + +An object `t` of type ``T`` fulfills ``remote_contiguous_range`` if and only +if: + +1. ``T`` fulfills ``std::ranges::random_access_range``. +2. ``T``'s iterator type fulfills ``remote_contiguous_iterator``. +3. ``t`` has a method ``rank`` returning the rank on which the range is + located. For all iterators ``iter`` ``t.rank() == t.begin().rank()``. + +Remarks +""""""" +All of the iterators in ``[begin(), end())`` should be contiguous iterators +with the same rank, and ``[begin().local(), end().local())`` should form a +contiguous range referencing the same memory, but locally. Not quite sure how +to express that concisely. + +``distributed_contiguous_range`` +================================ + +.. doxygenconcept:: dr::distributed_contiguous_range + +A distributed contiguous range is a range consisting of multiple segments +distributed over multiple processes, where each each segment is a +remote contiguous range. + +Defined in ``concepts.hpp`` + +:: + + template + concept distributed_contiguous_range = std::ranges::random_access_range && + requires(T t) { + { t.segments() } -> std::ranges::random_access_range; + { + std::declval>() + } -> remote_contiguous_range; + }; + + +Requirements +"""""""""""" + +An object ``t`` of type ``T`` fulfills ``distributed_contiguous_range`` if and +only if: + +1. ``T`` fulfills `std::ranges::random_access_range` +2. ``t`` has a method ``segments`` such that the ``t.segments()`` returns an + ``std::ranges::random_access_range`` where each element is a + ``remote_contiguous_range``. + +Remarks +""""""" +Should there be other requirements, other than ``segments``? Perhaps a +``distribution`` method to return an implementation-defined type describing the +distribution? diff --git a/spec/_sources/containers/containers.rst b/spec/_sources/containers/containers.rst new file mode 100644 index 0000000000..b05eabc258 --- /dev/null +++ b/spec/_sources/containers/containers.rst @@ -0,0 +1,22 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +============ + Containers +============ + +*Containers* own storage. + +The storage for a *distributed container* is divided over multiple +processes and can be accessed by any process in the team. + +.. toctree:: + :maxdepth: 1 + + mp_distributed_vector + mp_distributed_dense_matrix + + sp_distributed_vector + sp_dense_matrix + sp_sparse_matrix diff --git a/spec/_sources/containers/mp_distributed_dense_matrix.rst b/spec/_sources/containers/mp_distributed_dense_matrix.rst new file mode 100644 index 0000000000..01cfa11ec2 --- /dev/null +++ b/spec/_sources/containers/mp_distributed_dense_matrix.rst @@ -0,0 +1,26 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _distributed_dense_matrix: + +===================================== +``dr::mp::distributed_dense_matrix`` +===================================== + +Interface +========= + +.. code-block:: cpp + + template class distributed_dense_matrix; + +The class will be merged and documented soon + + +Description +=========== + +Dense matrix class, distributed over MPI nodes diff --git a/spec/_sources/containers/mp_distributed_vector.rst b/spec/_sources/containers/mp_distributed_vector.rst new file mode 100644 index 0000000000..63510b8bee --- /dev/null +++ b/spec/_sources/containers/mp_distributed_vector.rst @@ -0,0 +1,27 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _mp_distributed_vector: + +=============================== +``dr::mp::distributed_vector`` +=============================== + +Interface +========= + +.. doxygenclass:: dr::mp::distributed_vector + :members: + +Description +=========== + +Vector distributed among MPI nodes, with support +for data exchange at segment edges (halo) + +.. seealso:: + + `std::vector`_ diff --git a/spec/_sources/containers/sp_dense_matrix.rst b/spec/_sources/containers/sp_dense_matrix.rst new file mode 100644 index 0000000000..9c53ede378 --- /dev/null +++ b/spec/_sources/containers/sp_dense_matrix.rst @@ -0,0 +1,20 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _sp_dense_matrix: + +=============================== +``dr::sp::dense_matrix`` +=============================== + +Interface +========= + +.. doxygenclass:: dr::sp::dense_matrix + :members: + +Description +=========== diff --git a/spec/_sources/containers/sp_distributed_vector.rst b/spec/_sources/containers/sp_distributed_vector.rst new file mode 100644 index 0000000000..2c0f10aefc --- /dev/null +++ b/spec/_sources/containers/sp_distributed_vector.rst @@ -0,0 +1,24 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _sp_distributed_vector: + +=============================== +``dr::sp::distributed_vector`` +=============================== + +Interface +========= + +.. doxygenstruct:: dr::sp::distributed_vector + :members: + +Description +=========== + +.. seealso:: + + `std::vector`_ diff --git a/spec/_sources/containers/sp_sparse_matrix.rst b/spec/_sources/containers/sp_sparse_matrix.rst new file mode 100644 index 0000000000..f387e9ab02 --- /dev/null +++ b/spec/_sources/containers/sp_sparse_matrix.rst @@ -0,0 +1,20 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _sp_sparse_matrix: + +=============================== +``dr::sp::sparse_matrix`` +=============================== + +Interface +========= + +.. doxygenclass:: dr::sp::sparse_matrix + :members: + +Description +=========== diff --git a/spec/_sources/include/distributed-ranges.rst b/spec/_sources/include/distributed-ranges.rst new file mode 100644 index 0000000000..08da383a41 --- /dev/null +++ b/spec/_sources/include/distributed-ranges.rst @@ -0,0 +1,41 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. cppreference links + +.. _`C++ execution policies`: https://en.cppreference.com/w/cpp/algorithm/execution_policy_tag_t + +.. _`std::copy`: https://en.cppreference.com/w/cpp/algorithm/copy +.. _`std::exclusive_scan`: https://en.cppreference.com/w/cpp/algorithm/exclusive_scan +.. _`std::fill`: https://en.cppreference.com/w/cpp/algorithm/fill +.. _`std::for_each`: https://en.cppreference.com/w/cpp/algorithm/for_each +.. _`std::inclusive_scan`: https://en.cppreference.com/w/cpp/algorithm/inclusive_scan +.. _`std::iota`: https://en.cppreference.com/w/cpp/algorithm/iota +.. _`std::mdspan`: https://en.cppreference.com/w/cpp/container/mdspan +.. _`std::reduce`: https://en.cppreference.com/w/cpp/algorithm/reduce +.. _`std::span`: https://en.cppreference.com/w/cpp/container/span +.. _`std::sort`: https://en.cppreference.com/w/cpp/algorithm/sort +.. _`std::transform`: https://en.cppreference.com/w/cpp/algorithm/transform +.. _`std::transform_reduce`: https://en.cppreference.com/w/cpp/algorithm/transform_reduce +.. _`std::vector`: https://en.cppreference.com/w/cpp/container/vector + +.. _`std::ranges::copy`: https://en.cppreference.com/w/cpp/algorithm/ranges/copy +.. _`std::ranges::fill`: https://en.cppreference.com/w/cpp/algorithm/ranges/fill +.. _`std::ranges::for_each`: https://en.cppreference.com/w/cpp/algorithm/ranges/for_each +.. _`std::ranges::iota`: https://en.cppreference.com/w/cpp/algorithm/ranges/iota +.. _`std::ranges::sort`: https://en.cppreference.com/w/cpp/algorithm/ranges/sort +.. _`std::ranges::transform`: https://en.cppreference.com/w/cpp/algorithm/ranges/transform + +.. _`std::ranges::views::all`: https://en.cppreference.com/w/cpp/ranges/all_view +.. _`std::ranges::views::counted`: https://en.cppreference.com/w/cpp/ranges/view_counted +.. _`std::ranges::views::drop`: https://en.cppreference.com/w/cpp/ranges/drop_view +.. _`std::ranges::views::iota`: https://en.cppreference.com/w/cpp/ranges/iota_view +.. _`std::ranges::views::slide`: https://en.cppreference.com/w/cpp/ranges/slide_view +.. _`std::ranges::views::take`: https://en.cppreference.com/w/cpp/ranges/take_view +.. _`std::ranges::views::transform`: https://en.cppreference.com/w/cpp/ranges/transform_view +.. _`std::ranges::views::zip`: https://en.cppreference.com/w/cpp/ranges/zip_view + +.. C++ paper links + +.. _`std::mdarray`: https://www.open-std.org/JTC1/SC22/WG21/docs/papers/2022/p1684r2.html diff --git a/spec/_sources/index.rst b/spec/_sources/index.rst new file mode 100644 index 0000000000..f580e54175 --- /dev/null +++ b/spec/_sources/index.rst @@ -0,0 +1,31 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. distributed-ranges documentation master file, created by + sphinx-quickstart on Wed Sep 7 15:21:53 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Distributed Ranges +================== + +Welcome to the Distributed Ranges Specification. + +.. toctree:: + :maxdepth: 1 + + intro + arch + concepts + containers/containers + algorithms/algorithms + views/views + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/spec/_sources/intro.rst b/spec/_sources/intro.rst new file mode 100644 index 0000000000..1888a4f154 --- /dev/null +++ b/spec/_sources/intro.rst @@ -0,0 +1,14 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +============== + Introduction +============== + +Distributed Ranges is a productivity library for distributed and partitioned memory based on C++ ranges. +It offers a collection of data structures, views, and algorithms for building generic abstractions +and provides interoperability with MPI, SHMEM, SYCL and OpenMP and portability on CPUs and GPUs. +NUMA-aware allocators and distributed data structures facilitate development of C++ applications +on heterogeneous nodes with multiple devices and achieve excellent performance and parallel scalability +by exploiting local compute and data access. diff --git a/spec/_sources/views/all_view.rst b/spec/_sources/views/all_view.rst new file mode 100644 index 0000000000..97bdc59209 --- /dev/null +++ b/spec/_sources/views/all_view.rst @@ -0,0 +1,21 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _all_view: + +============= + ``all_view`` +============= + +Interface +========= + +.. code-block:: cpp + + dr::mp::views::all + dr::sp::views::all + +For interface, see `std::ranges::views::all`_ diff --git a/spec/_sources/views/counted_view.rst b/spec/_sources/views/counted_view.rst new file mode 100644 index 0000000000..041b1138be --- /dev/null +++ b/spec/_sources/views/counted_view.rst @@ -0,0 +1,21 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _counted_view: + +================= + ``counted_view`` +================= + +Interface +========= + +.. code-block:: cpp + + dr::mp::views::counted + dr::sp::views::counted + +For interface, see `std::ranges::views::counted`_ diff --git a/spec/_sources/views/drop_view.rst b/spec/_sources/views/drop_view.rst new file mode 100644 index 0000000000..ad55422fad --- /dev/null +++ b/spec/_sources/views/drop_view.rst @@ -0,0 +1,21 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _drop_view: + +============== + ``drop_view`` +============== + +Interface +========= + +.. code-block:: cpp + + dr::mp::views::drop + dr::sp::views::drop + +For interface, see `std::ranges::views::drop`_ diff --git a/spec/_sources/views/iota_view.rst b/spec/_sources/views/iota_view.rst new file mode 100644 index 0000000000..e0aa6c790e --- /dev/null +++ b/spec/_sources/views/iota_view.rst @@ -0,0 +1,21 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _iota_view: + +============== + ``iota_view`` +============== + +Interface +========= + +.. code-block:: cpp + + dr::mp::views::all + dr::sp::views::all + +For interface, see `std::ranges::views::all`_ diff --git a/spec/_sources/views/sliding_view.rst b/spec/_sources/views/sliding_view.rst new file mode 100644 index 0000000000..de1e7c295d --- /dev/null +++ b/spec/_sources/views/sliding_view.rst @@ -0,0 +1,28 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _sliding_view: + +================= + ``sliding_view`` +================= + +Interface +========= + + +.. code-block:: cpp + + dr::mp::views::sliding + dr::sp::views::sliding + +Description +=========== + +.. seealso:: + + `std::ranges::views::slide`_ + Standard C++ view diff --git a/spec/_sources/views/take_view.rst b/spec/_sources/views/take_view.rst new file mode 100644 index 0000000000..0cd30e5bb4 --- /dev/null +++ b/spec/_sources/views/take_view.rst @@ -0,0 +1,21 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _take_view: + +============== + ``take_view`` +============== + +Interface +========= + +.. code-block:: cpp + + dr::mp::views::take + dr::sp::views::take + +For interface, see `std::ranges::views::take`_ diff --git a/spec/_sources/views/transform_view.rst b/spec/_sources/views/transform_view.rst new file mode 100644 index 0000000000..b9649a1d74 --- /dev/null +++ b/spec/_sources/views/transform_view.rst @@ -0,0 +1,21 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _transform_view: + +=================== + ``transform_view`` +=================== + +Interface +========= + +.. code-block:: cpp + + dr::mp::views::transform + dr::sp::views::transform + +For interface, see `std::ranges::views::transform`_ diff --git a/spec/_sources/views/views.rst b/spec/_sources/views/views.rst new file mode 100644 index 0000000000..6dd677b7d4 --- /dev/null +++ b/spec/_sources/views/views.rst @@ -0,0 +1,21 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +======= + Views +======= + +Views can reference collections of objects but do not own the storage. + +.. toctree:: + :maxdepth: 1 + + all_view + counted_view + drop_view + iota_view + take_view + sliding_view + transform_view + zip_view diff --git a/spec/_sources/views/zip_view.rst b/spec/_sources/views/zip_view.rst new file mode 100644 index 0000000000..86e4316657 --- /dev/null +++ b/spec/_sources/views/zip_view.rst @@ -0,0 +1,39 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + + +.. include:: ../include/distributed-ranges.rst + +.. _zip_view: + +============= + ``zip_view`` +============= + +Interface +========= + +MP +--- + +.. doxygenclass:: dr::mp::zip_view + :members: +.. doxygenfunction:: dr::mp::views::zip + :outline: + +SP +--- + +.. doxygenclass:: dr::sp::zip_view + :members: +.. doxygenfunction:: dr::sp::views::zip + :outline: + +Description +=========== + +.. seealso:: + + `std::ranges::views::zip`_ + Standard C++ view diff --git a/spec/_static/basic.css b/spec/_static/basic.css new file mode 100644 index 0000000000..2af6139e6b --- /dev/null +++ b/spec/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 270px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/spec/_static/doctools.js b/spec/_static/doctools.js new file mode 100644 index 0000000000..4d67807d17 --- /dev/null +++ b/spec/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/spec/_static/documentation_options.js b/spec/_static/documentation_options.js new file mode 100644 index 0000000000..fcc0cede1f --- /dev/null +++ b/spec/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '', + NAVIGATION_WITH_KEYS: true, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/spec/_static/file.png b/spec/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/spec/_static/file.png differ diff --git a/spec/_static/images/logo_binder.svg b/spec/_static/images/logo_binder.svg new file mode 100644 index 0000000000..45fecf7511 --- /dev/null +++ b/spec/_static/images/logo_binder.svg @@ -0,0 +1,19 @@ + + + + +logo + + + + + + + + diff --git a/spec/_static/images/logo_colab.png b/spec/_static/images/logo_colab.png new file mode 100644 index 0000000000..b7560ec216 Binary files /dev/null and b/spec/_static/images/logo_colab.png differ diff --git a/spec/_static/images/logo_deepnote.svg b/spec/_static/images/logo_deepnote.svg new file mode 100644 index 0000000000..fa77ebfc25 --- /dev/null +++ b/spec/_static/images/logo_deepnote.svg @@ -0,0 +1 @@ + diff --git a/spec/_static/images/logo_jupyterhub.svg b/spec/_static/images/logo_jupyterhub.svg new file mode 100644 index 0000000000..60cfe9f222 --- /dev/null +++ b/spec/_static/images/logo_jupyterhub.svg @@ -0,0 +1 @@ +logo_jupyterhubHub diff --git a/spec/_static/language_data.js b/spec/_static/language_data.js new file mode 100644 index 0000000000..367b8ed81b --- /dev/null +++ b/spec/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/spec/_static/locales/ar/LC_MESSAGES/booktheme.mo b/spec/_static/locales/ar/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..15541a6a37 Binary files /dev/null and b/spec/_static/locales/ar/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/ar/LC_MESSAGES/booktheme.po b/spec/_static/locales/ar/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..34d404c6d0 --- /dev/null +++ b/spec/_static/locales/ar/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "طباعة إلى PDF" + +msgid "Theme by the" +msgstr "موضوع بواسطة" + +msgid "Download source file" +msgstr "تنزيل ملف المصدر" + +msgid "open issue" +msgstr "قضية مفتوحة" + +msgid "Contents" +msgstr "محتويات" + +msgid "previous page" +msgstr "الصفحة السابقة" + +msgid "Download notebook file" +msgstr "تنزيل ملف دفتر الملاحظات" + +msgid "Copyright" +msgstr "حقوق النشر" + +msgid "Download this page" +msgstr "قم بتنزيل هذه الصفحة" + +msgid "Source repository" +msgstr "مستودع المصدر" + +msgid "By" +msgstr "بواسطة" + +msgid "repository" +msgstr "مخزن" + +msgid "Last updated on" +msgstr "آخر تحديث في" + +msgid "Toggle navigation" +msgstr "تبديل التنقل" + +msgid "Sphinx Book Theme" +msgstr "موضوع كتاب أبو الهول" + +msgid "suggest edit" +msgstr "أقترح تحرير" + +msgid "Open an issue" +msgstr "افتح قضية" + +msgid "Launch" +msgstr "إطلاق" + +msgid "Fullscreen mode" +msgstr "وضع ملء الشاشة" + +msgid "Edit this page" +msgstr "قم بتحرير هذه الصفحة" + +msgid "By the" +msgstr "بواسطة" + +msgid "next page" +msgstr "الصفحة التالية" diff --git a/spec/_static/locales/bg/LC_MESSAGES/booktheme.mo b/spec/_static/locales/bg/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..da95120037 Binary files /dev/null and b/spec/_static/locales/bg/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/bg/LC_MESSAGES/booktheme.po b/spec/_static/locales/bg/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..7420c19eb0 --- /dev/null +++ b/spec/_static/locales/bg/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Печат в PDF" + +msgid "Theme by the" +msgstr "Тема от" + +msgid "Download source file" +msgstr "Изтеглете изходния файл" + +msgid "open issue" +msgstr "отворен брой" + +msgid "Contents" +msgstr "Съдържание" + +msgid "previous page" +msgstr "предишна страница" + +msgid "Download notebook file" +msgstr "Изтеглете файла на бележника" + +msgid "Copyright" +msgstr "Авторско право" + +msgid "Download this page" +msgstr "Изтеглете тази страница" + +msgid "Source repository" +msgstr "Хранилище на източника" + +msgid "By" +msgstr "От" + +msgid "repository" +msgstr "хранилище" + +msgid "Last updated on" +msgstr "Последна актуализация на" + +msgid "Toggle navigation" +msgstr "Превключване на навигацията" + +msgid "Sphinx Book Theme" +msgstr "Тема на книгата Sphinx" + +msgid "suggest edit" +msgstr "предложи редактиране" + +msgid "Open an issue" +msgstr "Отворете проблем" + +msgid "Launch" +msgstr "Стартиране" + +msgid "Fullscreen mode" +msgstr "Режим на цял екран" + +msgid "Edit this page" +msgstr "Редактирайте тази страница" + +msgid "By the" +msgstr "По" + +msgid "next page" +msgstr "Следваща страница" diff --git a/spec/_static/locales/bn/LC_MESSAGES/booktheme.mo b/spec/_static/locales/bn/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..6b96639b72 Binary files /dev/null and b/spec/_static/locales/bn/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/bn/LC_MESSAGES/booktheme.po b/spec/_static/locales/bn/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..63a07c3627 --- /dev/null +++ b/spec/_static/locales/bn/LC_MESSAGES/booktheme.po @@ -0,0 +1,63 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "পিডিএফ প্রিন্ট করুন" + +msgid "Theme by the" +msgstr "থিম দ্বারা" + +msgid "Download source file" +msgstr "উত্স ফাইল ডাউনলোড করুন" + +msgid "open issue" +msgstr "খোলা সমস্যা" + +msgid "previous page" +msgstr "আগের পৃষ্ঠা" + +msgid "Download notebook file" +msgstr "নোটবুক ফাইল ডাউনলোড করুন" + +msgid "Copyright" +msgstr "কপিরাইট" + +msgid "Download this page" +msgstr "এই পৃষ্ঠাটি ডাউনলোড করুন" + +msgid "Source repository" +msgstr "উত্স সংগ্রহস্থল" + +msgid "By" +msgstr "দ্বারা" + +msgid "Last updated on" +msgstr "সর্বশেষ আপডেট" + +msgid "Toggle navigation" +msgstr "নেভিগেশন টগল করুন" + +msgid "Sphinx Book Theme" +msgstr "স্পিনিক্স বুক থিম" + +msgid "Open an issue" +msgstr "একটি সমস্যা খুলুন" + +msgid "Launch" +msgstr "শুরু করা" + +msgid "Edit this page" +msgstr "এই পৃষ্ঠাটি সম্পাদনা করুন" + +msgid "By the" +msgstr "দ্বারা" + +msgid "next page" +msgstr "পরবর্তী পৃষ্ঠা" diff --git a/spec/_static/locales/ca/LC_MESSAGES/booktheme.mo b/spec/_static/locales/ca/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..a4dd30e9bd Binary files /dev/null and b/spec/_static/locales/ca/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/ca/LC_MESSAGES/booktheme.po b/spec/_static/locales/ca/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..8fb358bf1d --- /dev/null +++ b/spec/_static/locales/ca/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimeix a PDF" + +msgid "Theme by the" +msgstr "Tema del" + +msgid "Download source file" +msgstr "Baixeu el fitxer font" + +msgid "open issue" +msgstr "número obert" + +msgid "previous page" +msgstr "Pàgina anterior" + +msgid "Download notebook file" +msgstr "Descarregar fitxer de quadern" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download this page" +msgstr "Descarregueu aquesta pàgina" + +msgid "Source repository" +msgstr "Dipòsit de fonts" + +msgid "By" +msgstr "Per" + +msgid "Last updated on" +msgstr "Darrera actualització el" + +msgid "Toggle navigation" +msgstr "Commuta la navegació" + +msgid "Sphinx Book Theme" +msgstr "Tema del llibre Esfinx" + +msgid "suggest edit" +msgstr "suggerir edició" + +msgid "Open an issue" +msgstr "Obriu un número" + +msgid "Launch" +msgstr "Llançament" + +msgid "Edit this page" +msgstr "Editeu aquesta pàgina" + +msgid "By the" +msgstr "Per la" + +msgid "next page" +msgstr "pàgina següent" diff --git a/spec/_static/locales/cs/LC_MESSAGES/booktheme.mo b/spec/_static/locales/cs/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..c39e01a6ae Binary files /dev/null and b/spec/_static/locales/cs/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/cs/LC_MESSAGES/booktheme.po b/spec/_static/locales/cs/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..c6ef469082 --- /dev/null +++ b/spec/_static/locales/cs/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Tisk do PDF" + +msgid "Theme by the" +msgstr "Téma od" + +msgid "Download source file" +msgstr "Stáhněte si zdrojový soubor" + +msgid "open issue" +msgstr "otevřené číslo" + +msgid "Contents" +msgstr "Obsah" + +msgid "previous page" +msgstr "předchozí stránka" + +msgid "Download notebook file" +msgstr "Stáhnout soubor poznámkového bloku" + +msgid "Copyright" +msgstr "autorská práva" + +msgid "Download this page" +msgstr "Stáhněte si tuto stránku" + +msgid "Source repository" +msgstr "Zdrojové úložiště" + +msgid "By" +msgstr "Podle" + +msgid "repository" +msgstr "úložiště" + +msgid "Last updated on" +msgstr "Naposledy aktualizováno" + +msgid "Toggle navigation" +msgstr "Přepnout navigaci" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "suggest edit" +msgstr "navrhnout úpravy" + +msgid "Open an issue" +msgstr "Otevřete problém" + +msgid "Launch" +msgstr "Zahájení" + +msgid "Fullscreen mode" +msgstr "Režim celé obrazovky" + +msgid "Edit this page" +msgstr "Upravit tuto stránku" + +msgid "By the" +msgstr "Podle" + +msgid "next page" +msgstr "další strana" diff --git a/spec/_static/locales/da/LC_MESSAGES/booktheme.mo b/spec/_static/locales/da/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..f43157d70c Binary files /dev/null and b/spec/_static/locales/da/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/da/LC_MESSAGES/booktheme.po b/spec/_static/locales/da/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..306a38e52d --- /dev/null +++ b/spec/_static/locales/da/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Udskriv til PDF" + +msgid "Theme by the" +msgstr "Tema af" + +msgid "Download source file" +msgstr "Download kildefil" + +msgid "open issue" +msgstr "åbent nummer" + +msgid "Contents" +msgstr "Indhold" + +msgid "previous page" +msgstr "forrige side" + +msgid "Download notebook file" +msgstr "Download notesbog-fil" + +msgid "Copyright" +msgstr "ophavsret" + +msgid "Download this page" +msgstr "Download denne side" + +msgid "Source repository" +msgstr "Kildelager" + +msgid "By" +msgstr "Ved" + +msgid "repository" +msgstr "lager" + +msgid "Last updated on" +msgstr "Sidst opdateret den" + +msgid "Toggle navigation" +msgstr "Skift navigation" + +msgid "Sphinx Book Theme" +msgstr "Sphinx bogtema" + +msgid "suggest edit" +msgstr "foreslå redigering" + +msgid "Open an issue" +msgstr "Åbn et problem" + +msgid "Launch" +msgstr "Start" + +msgid "Fullscreen mode" +msgstr "Fuldskærmstilstand" + +msgid "Edit this page" +msgstr "Rediger denne side" + +msgid "By the" +msgstr "Ved" + +msgid "next page" +msgstr "Næste side" diff --git a/spec/_static/locales/de/LC_MESSAGES/booktheme.mo b/spec/_static/locales/de/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..648b565c78 Binary files /dev/null and b/spec/_static/locales/de/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/de/LC_MESSAGES/booktheme.po b/spec/_static/locales/de/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..4925360d43 --- /dev/null +++ b/spec/_static/locales/de/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "In PDF drucken" + +msgid "Theme by the" +msgstr "Thema von der" + +msgid "Download source file" +msgstr "Quelldatei herunterladen" + +msgid "open issue" +msgstr "offenes Thema" + +msgid "Contents" +msgstr "Inhalt" + +msgid "previous page" +msgstr "vorherige Seite" + +msgid "Download notebook file" +msgstr "Notebook-Datei herunterladen" + +msgid "Copyright" +msgstr "Urheberrechte ©" + +msgid "Download this page" +msgstr "Laden Sie diese Seite herunter" + +msgid "Source repository" +msgstr "Quell-Repository" + +msgid "By" +msgstr "Durch" + +msgid "repository" +msgstr "Repository" + +msgid "Last updated on" +msgstr "Zuletzt aktualisiert am" + +msgid "Toggle navigation" +msgstr "Navigation umschalten" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-Buch-Thema" + +msgid "suggest edit" +msgstr "vorschlagen zu bearbeiten" + +msgid "Open an issue" +msgstr "Öffnen Sie ein Problem" + +msgid "Launch" +msgstr "Starten" + +msgid "Fullscreen mode" +msgstr "Vollbildmodus" + +msgid "Edit this page" +msgstr "Bearbeite diese Seite" + +msgid "By the" +msgstr "Bis zum" + +msgid "next page" +msgstr "Nächste Seite" diff --git a/spec/_static/locales/el/LC_MESSAGES/booktheme.mo b/spec/_static/locales/el/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..fca6e9355f Binary files /dev/null and b/spec/_static/locales/el/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/el/LC_MESSAGES/booktheme.po b/spec/_static/locales/el/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..3e01acbd9a --- /dev/null +++ b/spec/_static/locales/el/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Εκτύπωση σε PDF" + +msgid "Theme by the" +msgstr "Θέμα από το" + +msgid "Download source file" +msgstr "Λήψη αρχείου προέλευσης" + +msgid "open issue" +msgstr "ανοιχτό ζήτημα" + +msgid "Contents" +msgstr "Περιεχόμενα" + +msgid "previous page" +msgstr "προηγούμενη σελίδα" + +msgid "Download notebook file" +msgstr "Λήψη αρχείου σημειωματάριου" + +msgid "Copyright" +msgstr "Πνευματική ιδιοκτησία" + +msgid "Download this page" +msgstr "Λήψη αυτής της σελίδας" + +msgid "Source repository" +msgstr "Αποθήκη πηγής" + +msgid "By" +msgstr "Με" + +msgid "repository" +msgstr "αποθήκη" + +msgid "Last updated on" +msgstr "Τελευταία ενημέρωση στις" + +msgid "Toggle navigation" +msgstr "Εναλλαγή πλοήγησης" + +msgid "Sphinx Book Theme" +msgstr "Θέμα βιβλίου Sphinx" + +msgid "suggest edit" +msgstr "προτείνω επεξεργασία" + +msgid "Open an issue" +msgstr "Ανοίξτε ένα ζήτημα" + +msgid "Launch" +msgstr "Εκτόξευση" + +msgid "Fullscreen mode" +msgstr "ΛΕΙΤΟΥΡΓΙΑ ΠΛΗΡΟΥΣ ΟΘΟΝΗΣ" + +msgid "Edit this page" +msgstr "Επεξεργαστείτε αυτήν τη σελίδα" + +msgid "By the" +msgstr "Από το" + +msgid "next page" +msgstr "επόμενη σελίδα" diff --git a/spec/_static/locales/eo/LC_MESSAGES/booktheme.mo b/spec/_static/locales/eo/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..d1072bbec6 Binary files /dev/null and b/spec/_static/locales/eo/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/eo/LC_MESSAGES/booktheme.po b/spec/_static/locales/eo/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..f7ed2262d1 --- /dev/null +++ b/spec/_static/locales/eo/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Presi al PDF" + +msgid "Theme by the" +msgstr "Temo de la" + +msgid "Download source file" +msgstr "Elŝutu fontodosieron" + +msgid "open issue" +msgstr "malferma numero" + +msgid "Contents" +msgstr "Enhavo" + +msgid "previous page" +msgstr "antaŭa paĝo" + +msgid "Download notebook file" +msgstr "Elŝutu kajeran dosieron" + +msgid "Copyright" +msgstr "Kopirajto" + +msgid "Download this page" +msgstr "Elŝutu ĉi tiun paĝon" + +msgid "Source repository" +msgstr "Fonto-deponejo" + +msgid "By" +msgstr "De" + +msgid "repository" +msgstr "deponejo" + +msgid "Last updated on" +msgstr "Laste ĝisdatigita la" + +msgid "Toggle navigation" +msgstr "Ŝalti navigadon" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa Libro-Temo" + +msgid "suggest edit" +msgstr "sugesti redaktadon" + +msgid "Open an issue" +msgstr "Malfermu numeron" + +msgid "Launch" +msgstr "Lanĉo" + +msgid "Fullscreen mode" +msgstr "Plenekrana reĝimo" + +msgid "Edit this page" +msgstr "Redaktu ĉi tiun paĝon" + +msgid "By the" +msgstr "Per la" + +msgid "next page" +msgstr "sekva paĝo" diff --git a/spec/_static/locales/es/LC_MESSAGES/booktheme.mo b/spec/_static/locales/es/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..ba2ee4dc22 Binary files /dev/null and b/spec/_static/locales/es/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/es/LC_MESSAGES/booktheme.po b/spec/_static/locales/es/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..5e0029e5f7 --- /dev/null +++ b/spec/_static/locales/es/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimir en PDF" + +msgid "Theme by the" +msgstr "Tema por el" + +msgid "Download source file" +msgstr "Descargar archivo fuente" + +msgid "open issue" +msgstr "Tema abierto" + +msgid "Contents" +msgstr "Contenido" + +msgid "previous page" +msgstr "pagina anterior" + +msgid "Download notebook file" +msgstr "Descargar archivo de cuaderno" + +msgid "Copyright" +msgstr "Derechos de autor" + +msgid "Download this page" +msgstr "Descarga esta pagina" + +msgid "Source repository" +msgstr "Repositorio de origen" + +msgid "By" +msgstr "Por" + +msgid "repository" +msgstr "repositorio" + +msgid "Last updated on" +msgstr "Ultima actualización en" + +msgid "Toggle navigation" +msgstr "Navegación de palanca" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro de la esfinge" + +msgid "suggest edit" +msgstr "sugerir editar" + +msgid "Open an issue" +msgstr "Abrir un problema" + +msgid "Launch" +msgstr "Lanzamiento" + +msgid "Fullscreen mode" +msgstr "Modo de pantalla completa" + +msgid "Edit this page" +msgstr "Edita esta página" + +msgid "By the" +msgstr "Por el" + +msgid "next page" +msgstr "siguiente página" diff --git a/spec/_static/locales/et/LC_MESSAGES/booktheme.mo b/spec/_static/locales/et/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..983b82391f Binary files /dev/null and b/spec/_static/locales/et/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/et/LC_MESSAGES/booktheme.po b/spec/_static/locales/et/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..8680982a97 --- /dev/null +++ b/spec/_static/locales/et/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Prindi PDF-i" + +msgid "Theme by the" +msgstr "Teema" + +msgid "Download source file" +msgstr "Laadige alla lähtefail" + +msgid "open issue" +msgstr "avatud küsimus" + +msgid "Contents" +msgstr "Sisu" + +msgid "previous page" +msgstr "eelmine leht" + +msgid "Download notebook file" +msgstr "Laadige sülearvuti fail alla" + +msgid "Copyright" +msgstr "Autoriõigus" + +msgid "Download this page" +msgstr "Laadige see leht alla" + +msgid "Source repository" +msgstr "Allikahoidla" + +msgid "By" +msgstr "Kõrval" + +msgid "repository" +msgstr "hoidla" + +msgid "Last updated on" +msgstr "Viimati uuendatud" + +msgid "Toggle navigation" +msgstr "Lülita navigeerimine sisse" + +msgid "Sphinx Book Theme" +msgstr "Sfinksiraamatu teema" + +msgid "suggest edit" +msgstr "soovita muuta" + +msgid "Open an issue" +msgstr "Avage probleem" + +msgid "Launch" +msgstr "Käivitage" + +msgid "Fullscreen mode" +msgstr "Täisekraanirežiim" + +msgid "Edit this page" +msgstr "Muutke seda lehte" + +msgid "By the" +msgstr "Autor" + +msgid "next page" +msgstr "järgmine leht" diff --git a/spec/_static/locales/fi/LC_MESSAGES/booktheme.mo b/spec/_static/locales/fi/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..d8ac054597 Binary files /dev/null and b/spec/_static/locales/fi/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/fi/LC_MESSAGES/booktheme.po b/spec/_static/locales/fi/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..34dac21839 --- /dev/null +++ b/spec/_static/locales/fi/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Tulosta PDF-tiedostoon" + +msgid "Theme by the" +msgstr "Teeman tekijä" + +msgid "Download source file" +msgstr "Lataa lähdetiedosto" + +msgid "open issue" +msgstr "avoin ongelma" + +msgid "Contents" +msgstr "Sisällys" + +msgid "previous page" +msgstr "Edellinen sivu" + +msgid "Download notebook file" +msgstr "Lataa muistikirjatiedosto" + +msgid "Copyright" +msgstr "Tekijänoikeus" + +msgid "Download this page" +msgstr "Lataa tämä sivu" + +msgid "Source repository" +msgstr "Lähteen arkisto" + +msgid "By" +msgstr "Tekijä" + +msgid "repository" +msgstr "arkisto" + +msgid "Last updated on" +msgstr "Viimeksi päivitetty" + +msgid "Toggle navigation" +msgstr "Vaihda navigointia" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-kirjan teema" + +msgid "suggest edit" +msgstr "ehdottaa muokkausta" + +msgid "Open an issue" +msgstr "Avaa ongelma" + +msgid "Launch" +msgstr "Tuoda markkinoille" + +msgid "Fullscreen mode" +msgstr "Koko näytön tila" + +msgid "Edit this page" +msgstr "Muokkaa tätä sivua" + +msgid "By the" +msgstr "Mukaan" + +msgid "next page" +msgstr "seuraava sivu" diff --git a/spec/_static/locales/fr/LC_MESSAGES/booktheme.mo b/spec/_static/locales/fr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..f663d39f0f Binary files /dev/null and b/spec/_static/locales/fr/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/fr/LC_MESSAGES/booktheme.po b/spec/_static/locales/fr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..8991a1b87b --- /dev/null +++ b/spec/_static/locales/fr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimer au format PDF" + +msgid "Theme by the" +msgstr "Thème par le" + +msgid "Download source file" +msgstr "Télécharger le fichier source" + +msgid "open issue" +msgstr "signaler un problème" + +msgid "Contents" +msgstr "Contenu" + +msgid "previous page" +msgstr "page précédente" + +msgid "Download notebook file" +msgstr "Télécharger le fichier notebook" + +msgid "Copyright" +msgstr "droits d'auteur" + +msgid "Download this page" +msgstr "Téléchargez cette page" + +msgid "Source repository" +msgstr "Dépôt source" + +msgid "By" +msgstr "Par" + +msgid "repository" +msgstr "dépôt" + +msgid "Last updated on" +msgstr "Dernière mise à jour le" + +msgid "Toggle navigation" +msgstr "Basculer la navigation" + +msgid "Sphinx Book Theme" +msgstr "Thème du livre Sphinx" + +msgid "suggest edit" +msgstr "suggestion de modification" + +msgid "Open an issue" +msgstr "Ouvrez un problème" + +msgid "Launch" +msgstr "lancement" + +msgid "Fullscreen mode" +msgstr "Mode plein écran" + +msgid "Edit this page" +msgstr "Modifier cette page" + +msgid "By the" +msgstr "Par le" + +msgid "next page" +msgstr "page suivante" diff --git a/spec/_static/locales/hr/LC_MESSAGES/booktheme.mo b/spec/_static/locales/hr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..eca4a1a284 Binary files /dev/null and b/spec/_static/locales/hr/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/hr/LC_MESSAGES/booktheme.po b/spec/_static/locales/hr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..42c4233d07 --- /dev/null +++ b/spec/_static/locales/hr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Ispis u PDF" + +msgid "Theme by the" +msgstr "Tema autora" + +msgid "Download source file" +msgstr "Preuzmi izvornu datoteku" + +msgid "open issue" +msgstr "otvoreno izdanje" + +msgid "Contents" +msgstr "Sadržaj" + +msgid "previous page" +msgstr "Prethodna stranica" + +msgid "Download notebook file" +msgstr "Preuzmi datoteku bilježnice" + +msgid "Copyright" +msgstr "Autorska prava" + +msgid "Download this page" +msgstr "Preuzmite ovu stranicu" + +msgid "Source repository" +msgstr "Izvorno spremište" + +msgid "By" +msgstr "Po" + +msgid "repository" +msgstr "spremište" + +msgid "Last updated on" +msgstr "Posljednje ažuriranje:" + +msgid "Toggle navigation" +msgstr "Uključi / isključi navigaciju" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "suggest edit" +msgstr "predloži uređivanje" + +msgid "Open an issue" +msgstr "Otvorite izdanje" + +msgid "Launch" +msgstr "Pokrenite" + +msgid "Fullscreen mode" +msgstr "Način preko cijelog zaslona" + +msgid "Edit this page" +msgstr "Uredite ovu stranicu" + +msgid "By the" +msgstr "Od strane" + +msgid "next page" +msgstr "sljedeća stranica" diff --git a/spec/_static/locales/id/LC_MESSAGES/booktheme.mo b/spec/_static/locales/id/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..d07a06a9d2 Binary files /dev/null and b/spec/_static/locales/id/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/id/LC_MESSAGES/booktheme.po b/spec/_static/locales/id/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..b8d8d898ee --- /dev/null +++ b/spec/_static/locales/id/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "Theme by the" +msgstr "Tema oleh" + +msgid "Download source file" +msgstr "Unduh file sumber" + +msgid "open issue" +msgstr "masalah terbuka" + +msgid "Contents" +msgstr "Isi" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "Download notebook file" +msgstr "Unduh file notebook" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Download this page" +msgstr "Unduh halaman ini" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "By" +msgstr "Oleh" + +msgid "repository" +msgstr "gudang" + +msgid "Last updated on" +msgstr "Terakhir diperbarui saat" + +msgid "Toggle navigation" +msgstr "Alihkan navigasi" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "suggest edit" +msgstr "menyarankan edit" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "Launch" +msgstr "Meluncurkan" + +msgid "Fullscreen mode" +msgstr "Mode layar penuh" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "By the" +msgstr "Oleh" + +msgid "next page" +msgstr "halaman selanjutnya" diff --git a/spec/_static/locales/it/LC_MESSAGES/booktheme.mo b/spec/_static/locales/it/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..53ba476edd Binary files /dev/null and b/spec/_static/locales/it/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/it/LC_MESSAGES/booktheme.po b/spec/_static/locales/it/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..36fca59f88 --- /dev/null +++ b/spec/_static/locales/it/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Stampa in PDF" + +msgid "Theme by the" +msgstr "Tema di" + +msgid "Download source file" +msgstr "Scarica il file sorgente" + +msgid "open issue" +msgstr "questione aperta" + +msgid "Contents" +msgstr "Contenuti" + +msgid "previous page" +msgstr "pagina precedente" + +msgid "Download notebook file" +msgstr "Scarica il file del taccuino" + +msgid "Copyright" +msgstr "Diritto d'autore" + +msgid "Download this page" +msgstr "Scarica questa pagina" + +msgid "Source repository" +msgstr "Repository di origine" + +msgid "By" +msgstr "Di" + +msgid "repository" +msgstr "repository" + +msgid "Last updated on" +msgstr "Ultimo aggiornamento il" + +msgid "Toggle navigation" +msgstr "Attiva / disattiva la navigazione" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro della Sfinge" + +msgid "suggest edit" +msgstr "suggerisci modifica" + +msgid "Open an issue" +msgstr "Apri un problema" + +msgid "Launch" +msgstr "Lanciare" + +msgid "Fullscreen mode" +msgstr "Modalità schermo intero" + +msgid "Edit this page" +msgstr "Modifica questa pagina" + +msgid "By the" +msgstr "Dal" + +msgid "next page" +msgstr "pagina successiva" diff --git a/spec/_static/locales/iw/LC_MESSAGES/booktheme.mo b/spec/_static/locales/iw/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..a45c6575e4 Binary files /dev/null and b/spec/_static/locales/iw/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/iw/LC_MESSAGES/booktheme.po b/spec/_static/locales/iw/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..dede9cb086 --- /dev/null +++ b/spec/_static/locales/iw/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: iw\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "הדפס לקובץ PDF" + +msgid "Theme by the" +msgstr "נושא מאת" + +msgid "Download source file" +msgstr "הורד את קובץ המקור" + +msgid "open issue" +msgstr "בעיה פתוחה" + +msgid "Contents" +msgstr "תוכן" + +msgid "previous page" +msgstr "עמוד קודם" + +msgid "Download notebook file" +msgstr "הורד קובץ מחברת" + +msgid "Copyright" +msgstr "זכויות יוצרים" + +msgid "Download this page" +msgstr "הורד דף זה" + +msgid "Source repository" +msgstr "מאגר המקורות" + +msgid "By" +msgstr "על ידי" + +msgid "repository" +msgstr "מאגר" + +msgid "Last updated on" +msgstr "עודכן לאחרונה ב" + +msgid "Toggle navigation" +msgstr "החלף ניווט" + +msgid "Sphinx Book Theme" +msgstr "נושא ספר ספינקס" + +msgid "suggest edit" +msgstr "מציע לערוך" + +msgid "Open an issue" +msgstr "פתח גיליון" + +msgid "Launch" +msgstr "לְהַשִׁיק" + +msgid "Fullscreen mode" +msgstr "מצב מסך מלא" + +msgid "Edit this page" +msgstr "ערוך דף זה" + +msgid "By the" +msgstr "דרך" + +msgid "next page" +msgstr "עמוד הבא" diff --git a/spec/_static/locales/ja/LC_MESSAGES/booktheme.mo b/spec/_static/locales/ja/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..1cefd29ce3 Binary files /dev/null and b/spec/_static/locales/ja/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/ja/LC_MESSAGES/booktheme.po b/spec/_static/locales/ja/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..2615f0d874 --- /dev/null +++ b/spec/_static/locales/ja/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDFに印刷" + +msgid "Theme by the" +msgstr "のテーマ" + +msgid "Download source file" +msgstr "ソースファイルをダウンロード" + +msgid "open issue" +msgstr "未解決の問題" + +msgid "Contents" +msgstr "目次" + +msgid "previous page" +msgstr "前のページ" + +msgid "Download notebook file" +msgstr "ノートブックファイルをダウンロード" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download this page" +msgstr "このページをダウンロード" + +msgid "Source repository" +msgstr "ソースリポジトリ" + +msgid "By" +msgstr "著者" + +msgid "repository" +msgstr "リポジトリ" + +msgid "Last updated on" +msgstr "最終更新日" + +msgid "Toggle navigation" +msgstr "ナビゲーションを切り替え" + +msgid "Sphinx Book Theme" +msgstr "スフィンクスの本のテーマ" + +msgid "suggest edit" +msgstr "編集を提案する" + +msgid "Open an issue" +msgstr "問題を報告" + +msgid "Launch" +msgstr "起動" + +msgid "Fullscreen mode" +msgstr "全画面モード" + +msgid "Edit this page" +msgstr "このページを編集" + +msgid "By the" +msgstr "によって" + +msgid "next page" +msgstr "次のページ" diff --git a/spec/_static/locales/ko/LC_MESSAGES/booktheme.mo b/spec/_static/locales/ko/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..06c7ec938b Binary files /dev/null and b/spec/_static/locales/ko/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/ko/LC_MESSAGES/booktheme.po b/spec/_static/locales/ko/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..c9e13a427b --- /dev/null +++ b/spec/_static/locales/ko/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF로 인쇄" + +msgid "Theme by the" +msgstr "테마별" + +msgid "Download source file" +msgstr "소스 파일 다운로드" + +msgid "open issue" +msgstr "열린 문제" + +msgid "Contents" +msgstr "내용" + +msgid "previous page" +msgstr "이전 페이지" + +msgid "Download notebook file" +msgstr "노트북 파일 다운로드" + +msgid "Copyright" +msgstr "저작권" + +msgid "Download this page" +msgstr "이 페이지 다운로드" + +msgid "Source repository" +msgstr "소스 저장소" + +msgid "By" +msgstr "으로" + +msgid "repository" +msgstr "저장소" + +msgid "Last updated on" +msgstr "마지막 업데이트" + +msgid "Toggle navigation" +msgstr "탐색 전환" + +msgid "Sphinx Book Theme" +msgstr "스핑크스 도서 테마" + +msgid "suggest edit" +msgstr "편집 제안" + +msgid "Open an issue" +msgstr "이슈 열기" + +msgid "Launch" +msgstr "시작하다" + +msgid "Fullscreen mode" +msgstr "전체 화면으로보기" + +msgid "Edit this page" +msgstr "이 페이지 편집" + +msgid "By the" +msgstr "에 의해" + +msgid "next page" +msgstr "다음 페이지" diff --git a/spec/_static/locales/lt/LC_MESSAGES/booktheme.mo b/spec/_static/locales/lt/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..4468ba04bc Binary files /dev/null and b/spec/_static/locales/lt/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/lt/LC_MESSAGES/booktheme.po b/spec/_static/locales/lt/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..35eabd955f --- /dev/null +++ b/spec/_static/locales/lt/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Spausdinti į PDF" + +msgid "Theme by the" +msgstr "Tema" + +msgid "Download source file" +msgstr "Atsisiųsti šaltinio failą" + +msgid "open issue" +msgstr "atviras klausimas" + +msgid "Contents" +msgstr "Turinys" + +msgid "previous page" +msgstr "Ankstesnis puslapis" + +msgid "Download notebook file" +msgstr "Atsisiųsti nešiojamojo kompiuterio failą" + +msgid "Copyright" +msgstr "Autorių teisės" + +msgid "Download this page" +msgstr "Atsisiųskite šį puslapį" + +msgid "Source repository" +msgstr "Šaltinio saugykla" + +msgid "By" +msgstr "Iki" + +msgid "repository" +msgstr "saugykla" + +msgid "Last updated on" +msgstr "Paskutinį kartą atnaujinta" + +msgid "Toggle navigation" +msgstr "Perjungti naršymą" + +msgid "Sphinx Book Theme" +msgstr "Sfinkso knygos tema" + +msgid "suggest edit" +msgstr "pasiūlyti redaguoti" + +msgid "Open an issue" +msgstr "Atidarykite problemą" + +msgid "Launch" +msgstr "Paleiskite" + +msgid "Fullscreen mode" +msgstr "Pilno ekrano režimas" + +msgid "Edit this page" +msgstr "Redaguoti šį puslapį" + +msgid "By the" +msgstr "Prie" + +msgid "next page" +msgstr "Kitas puslapis" diff --git a/spec/_static/locales/lv/LC_MESSAGES/booktheme.mo b/spec/_static/locales/lv/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..74aa4d8985 Binary files /dev/null and b/spec/_static/locales/lv/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/lv/LC_MESSAGES/booktheme.po b/spec/_static/locales/lv/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..ee1bd08dfe --- /dev/null +++ b/spec/_static/locales/lv/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Drukāt PDF formātā" + +msgid "Theme by the" +msgstr "Autora tēma" + +msgid "Download source file" +msgstr "Lejupielādēt avota failu" + +msgid "open issue" +msgstr "atklāts jautājums" + +msgid "Contents" +msgstr "Saturs" + +msgid "previous page" +msgstr "iepriekšējā lapa" + +msgid "Download notebook file" +msgstr "Lejupielādēt piezīmju grāmatiņu" + +msgid "Copyright" +msgstr "Autortiesības" + +msgid "Download this page" +msgstr "Lejupielādējiet šo lapu" + +msgid "Source repository" +msgstr "Avota krātuve" + +msgid "By" +msgstr "Autors" + +msgid "repository" +msgstr "krātuve" + +msgid "Last updated on" +msgstr "Pēdējoreiz atjaunināts" + +msgid "Toggle navigation" +msgstr "Pārslēgt navigāciju" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa grāmatas tēma" + +msgid "suggest edit" +msgstr "ieteikt rediģēt" + +msgid "Open an issue" +msgstr "Atveriet problēmu" + +msgid "Launch" +msgstr "Uzsākt" + +msgid "Fullscreen mode" +msgstr "Pilnekrāna režīms" + +msgid "Edit this page" +msgstr "Rediģēt šo lapu" + +msgid "By the" +msgstr "Ar" + +msgid "next page" +msgstr "nākamā lapaspuse" diff --git a/spec/_static/locales/ml/LC_MESSAGES/booktheme.mo b/spec/_static/locales/ml/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..2736e8fcf6 Binary files /dev/null and b/spec/_static/locales/ml/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/ml/LC_MESSAGES/booktheme.po b/spec/_static/locales/ml/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..d471277d60 --- /dev/null +++ b/spec/_static/locales/ml/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ml\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF- ലേക്ക് പ്രിന്റുചെയ്യുക" + +msgid "Theme by the" +msgstr "പ്രമേയം" + +msgid "Download source file" +msgstr "ഉറവിട ഫയൽ ഡൗൺലോഡുചെയ്യുക" + +msgid "open issue" +msgstr "തുറന്ന പ്രശ്നം" + +msgid "previous page" +msgstr "മുൻപത്തെ താൾ" + +msgid "Download notebook file" +msgstr "നോട്ട്ബുക്ക് ഫയൽ ഡൺലോഡ് ചെയ്യുക" + +msgid "Copyright" +msgstr "പകർപ്പവകാശം" + +msgid "Download this page" +msgstr "ഈ പേജ് ഡൗൺലോഡുചെയ്യുക" + +msgid "Source repository" +msgstr "ഉറവിട ശേഖരം" + +msgid "By" +msgstr "എഴുതിയത്" + +msgid "Last updated on" +msgstr "അവസാനം അപ്‌ഡേറ്റുചെയ്‌തത്" + +msgid "Toggle navigation" +msgstr "നാവിഗേഷൻ ടോഗിൾ ചെയ്യുക" + +msgid "Sphinx Book Theme" +msgstr "സ്ഫിങ്ക്സ് പുസ്തക തീം" + +msgid "suggest edit" +msgstr "എഡിറ്റുചെയ്യാൻ നിർദ്ദേശിക്കുക" + +msgid "Open an issue" +msgstr "ഒരു പ്രശ്നം തുറക്കുക" + +msgid "Launch" +msgstr "സമാരംഭിക്കുക" + +msgid "Edit this page" +msgstr "ഈ പേജ് എഡിറ്റുചെയ്യുക" + +msgid "By the" +msgstr "എഴുതിയത്" + +msgid "next page" +msgstr "അടുത്ത പേജ്" diff --git a/spec/_static/locales/mr/LC_MESSAGES/booktheme.mo b/spec/_static/locales/mr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..fe530100d7 Binary files /dev/null and b/spec/_static/locales/mr/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/mr/LC_MESSAGES/booktheme.po b/spec/_static/locales/mr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..f3694acfa5 --- /dev/null +++ b/spec/_static/locales/mr/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "पीडीएफवर मुद्रित करा" + +msgid "Theme by the" +msgstr "द्वारा थीम" + +msgid "Download source file" +msgstr "स्त्रोत फाइल डाउनलोड करा" + +msgid "open issue" +msgstr "खुला मुद्दा" + +msgid "previous page" +msgstr "मागील पान" + +msgid "Download notebook file" +msgstr "नोटबुक फाईल डाउनलोड करा" + +msgid "Copyright" +msgstr "कॉपीराइट" + +msgid "Download this page" +msgstr "हे पृष्ठ डाउनलोड करा" + +msgid "Source repository" +msgstr "स्त्रोत भांडार" + +msgid "By" +msgstr "द्वारा" + +msgid "Last updated on" +msgstr "अखेरचे अद्यतनित" + +msgid "Toggle navigation" +msgstr "नेव्हिगेशन टॉगल करा" + +msgid "Sphinx Book Theme" +msgstr "स्फिंक्स बुक थीम" + +msgid "suggest edit" +msgstr "संपादन सुचवा" + +msgid "Open an issue" +msgstr "एक मुद्दा उघडा" + +msgid "Launch" +msgstr "लाँच करा" + +msgid "Edit this page" +msgstr "हे पृष्ठ संपादित करा" + +msgid "By the" +msgstr "द्वारा" + +msgid "next page" +msgstr "पुढील पृष्ठ" diff --git a/spec/_static/locales/ms/LC_MESSAGES/booktheme.mo b/spec/_static/locales/ms/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..f02603fa25 Binary files /dev/null and b/spec/_static/locales/ms/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/ms/LC_MESSAGES/booktheme.po b/spec/_static/locales/ms/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..65b7c6026a --- /dev/null +++ b/spec/_static/locales/ms/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "Theme by the" +msgstr "Tema oleh" + +msgid "Download source file" +msgstr "Muat turun fail sumber" + +msgid "open issue" +msgstr "isu terbuka" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "Download notebook file" +msgstr "Muat turun fail buku nota" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Download this page" +msgstr "Muat turun halaman ini" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "By" +msgstr "Oleh" + +msgid "Last updated on" +msgstr "Terakhir dikemas kini pada" + +msgid "Toggle navigation" +msgstr "Togol navigasi" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "suggest edit" +msgstr "cadangkan edit" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "Launch" +msgstr "Lancarkan" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "By the" +msgstr "Oleh" + +msgid "next page" +msgstr "muka surat seterusnya" diff --git a/spec/_static/locales/nl/LC_MESSAGES/booktheme.mo b/spec/_static/locales/nl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..e59e7ecb30 Binary files /dev/null and b/spec/_static/locales/nl/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/nl/LC_MESSAGES/booktheme.po b/spec/_static/locales/nl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..71bd1cda70 --- /dev/null +++ b/spec/_static/locales/nl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Afdrukken naar pdf" + +msgid "Theme by the" +msgstr "Thema door de" + +msgid "Download source file" +msgstr "Download het bronbestand" + +msgid "open issue" +msgstr "open probleem" + +msgid "Contents" +msgstr "Inhoud" + +msgid "previous page" +msgstr "vorige pagina" + +msgid "Download notebook file" +msgstr "Download notebookbestand" + +msgid "Copyright" +msgstr "auteursrechten" + +msgid "Download this page" +msgstr "Download deze pagina" + +msgid "Source repository" +msgstr "Bronopslagplaats" + +msgid "By" +msgstr "Door" + +msgid "repository" +msgstr "repository" + +msgid "Last updated on" +msgstr "Laatst geupdate op" + +msgid "Toggle navigation" +msgstr "Schakel navigatie" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-boekthema" + +msgid "suggest edit" +msgstr "suggereren bewerken" + +msgid "Open an issue" +msgstr "Open een probleem" + +msgid "Launch" +msgstr "Lancering" + +msgid "Fullscreen mode" +msgstr "Volledig scherm" + +msgid "Edit this page" +msgstr "bewerk deze pagina" + +msgid "By the" +msgstr "Door de" + +msgid "next page" +msgstr "volgende bladzijde" diff --git a/spec/_static/locales/no/LC_MESSAGES/booktheme.mo b/spec/_static/locales/no/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..6cd15c88de Binary files /dev/null and b/spec/_static/locales/no/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/no/LC_MESSAGES/booktheme.po b/spec/_static/locales/no/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..b21346a512 --- /dev/null +++ b/spec/_static/locales/no/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Skriv ut til PDF" + +msgid "Theme by the" +msgstr "Tema av" + +msgid "Download source file" +msgstr "Last ned kildefilen" + +msgid "open issue" +msgstr "åpent nummer" + +msgid "Contents" +msgstr "Innhold" + +msgid "previous page" +msgstr "forrige side" + +msgid "Download notebook file" +msgstr "Last ned notatbokfilen" + +msgid "Copyright" +msgstr "opphavsrett" + +msgid "Download this page" +msgstr "Last ned denne siden" + +msgid "Source repository" +msgstr "Kildedepot" + +msgid "By" +msgstr "Av" + +msgid "repository" +msgstr "oppbevaringssted" + +msgid "Last updated on" +msgstr "Sist oppdatert den" + +msgid "Toggle navigation" +msgstr "Bytt navigasjon" + +msgid "Sphinx Book Theme" +msgstr "Sphinx boktema" + +msgid "suggest edit" +msgstr "foreslå redigering" + +msgid "Open an issue" +msgstr "Åpne et problem" + +msgid "Launch" +msgstr "Start" + +msgid "Fullscreen mode" +msgstr "Fullskjerm-modus" + +msgid "Edit this page" +msgstr "Rediger denne siden" + +msgid "By the" +msgstr "Ved" + +msgid "next page" +msgstr "neste side" diff --git a/spec/_static/locales/pl/LC_MESSAGES/booktheme.mo b/spec/_static/locales/pl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..9ebb584f77 Binary files /dev/null and b/spec/_static/locales/pl/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/pl/LC_MESSAGES/booktheme.po b/spec/_static/locales/pl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..1b7233f4ff --- /dev/null +++ b/spec/_static/locales/pl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Drukuj do PDF" + +msgid "Theme by the" +msgstr "Motyw autorstwa" + +msgid "Download source file" +msgstr "Pobierz plik źródłowy" + +msgid "open issue" +msgstr "otwarty problem" + +msgid "Contents" +msgstr "Zawartość" + +msgid "previous page" +msgstr "Poprzednia strona" + +msgid "Download notebook file" +msgstr "Pobierz plik notatnika" + +msgid "Copyright" +msgstr "prawa autorskie" + +msgid "Download this page" +msgstr "Pobierz tę stronę" + +msgid "Source repository" +msgstr "Repozytorium źródłowe" + +msgid "By" +msgstr "Przez" + +msgid "repository" +msgstr "magazyn" + +msgid "Last updated on" +msgstr "Ostatnia aktualizacja" + +msgid "Toggle navigation" +msgstr "Przełącz nawigację" + +msgid "Sphinx Book Theme" +msgstr "Motyw książki Sphinx" + +msgid "suggest edit" +msgstr "zaproponuj edycję" + +msgid "Open an issue" +msgstr "Otwórz problem" + +msgid "Launch" +msgstr "Uruchomić" + +msgid "Fullscreen mode" +msgstr "Pełny ekran" + +msgid "Edit this page" +msgstr "Edytuj tę strone" + +msgid "By the" +msgstr "Przez" + +msgid "next page" +msgstr "Następna strona" diff --git a/spec/_static/locales/pt/LC_MESSAGES/booktheme.mo b/spec/_static/locales/pt/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..d0ddb8728e Binary files /dev/null and b/spec/_static/locales/pt/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/pt/LC_MESSAGES/booktheme.po b/spec/_static/locales/pt/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..1b27314d69 --- /dev/null +++ b/spec/_static/locales/pt/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimir em PDF" + +msgid "Theme by the" +msgstr "Tema por" + +msgid "Download source file" +msgstr "Baixar arquivo fonte" + +msgid "open issue" +msgstr "questão aberta" + +msgid "Contents" +msgstr "Conteúdo" + +msgid "previous page" +msgstr "página anterior" + +msgid "Download notebook file" +msgstr "Baixar arquivo de notebook" + +msgid "Copyright" +msgstr "direito autoral" + +msgid "Download this page" +msgstr "Baixe esta página" + +msgid "Source repository" +msgstr "Repositório fonte" + +msgid "By" +msgstr "De" + +msgid "repository" +msgstr "repositório" + +msgid "Last updated on" +msgstr "Última atualização em" + +msgid "Toggle navigation" +msgstr "Alternar de navegação" + +msgid "Sphinx Book Theme" +msgstr "Tema do livro Sphinx" + +msgid "suggest edit" +msgstr "sugerir edição" + +msgid "Open an issue" +msgstr "Abra um problema" + +msgid "Launch" +msgstr "Lançamento" + +msgid "Fullscreen mode" +msgstr "Modo tela cheia" + +msgid "Edit this page" +msgstr "Edite essa página" + +msgid "By the" +msgstr "Pelo" + +msgid "next page" +msgstr "próxima página" diff --git a/spec/_static/locales/ro/LC_MESSAGES/booktheme.mo b/spec/_static/locales/ro/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..3c36ab1df7 Binary files /dev/null and b/spec/_static/locales/ro/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/ro/LC_MESSAGES/booktheme.po b/spec/_static/locales/ro/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..1783ad2c4f --- /dev/null +++ b/spec/_static/locales/ro/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimați în PDF" + +msgid "Theme by the" +msgstr "Tema de" + +msgid "Download source file" +msgstr "Descărcați fișierul sursă" + +msgid "open issue" +msgstr "problema deschisă" + +msgid "Contents" +msgstr "Cuprins" + +msgid "previous page" +msgstr "pagina anterioară" + +msgid "Download notebook file" +msgstr "Descărcați fișierul notebook" + +msgid "Copyright" +msgstr "Drepturi de autor" + +msgid "Download this page" +msgstr "Descarcă această pagină" + +msgid "Source repository" +msgstr "Depozit sursă" + +msgid "By" +msgstr "De" + +msgid "repository" +msgstr "repertoriu" + +msgid "Last updated on" +msgstr "Ultima actualizare la" + +msgid "Toggle navigation" +msgstr "Comutare navigare" + +msgid "Sphinx Book Theme" +msgstr "Tema Sphinx Book" + +msgid "suggest edit" +msgstr "sugerează editare" + +msgid "Open an issue" +msgstr "Deschideți o problemă" + +msgid "Launch" +msgstr "Lansa" + +msgid "Fullscreen mode" +msgstr "Modul ecran întreg" + +msgid "Edit this page" +msgstr "Editați această pagină" + +msgid "By the" +msgstr "Langa" + +msgid "next page" +msgstr "pagina următoare" diff --git a/spec/_static/locales/ru/LC_MESSAGES/booktheme.mo b/spec/_static/locales/ru/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..6b8ca41f36 Binary files /dev/null and b/spec/_static/locales/ru/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/ru/LC_MESSAGES/booktheme.po b/spec/_static/locales/ru/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..b1176b7ae7 --- /dev/null +++ b/spec/_static/locales/ru/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Распечатать в PDF" + +msgid "Theme by the" +msgstr "Тема от" + +msgid "Download source file" +msgstr "Скачать исходный файл" + +msgid "open issue" +msgstr "открытый вопрос" + +msgid "Contents" +msgstr "Содержание" + +msgid "previous page" +msgstr "Предыдущая страница" + +msgid "Download notebook file" +msgstr "Скачать файл записной книжки" + +msgid "Copyright" +msgstr "авторское право" + +msgid "Download this page" +msgstr "Загрузите эту страницу" + +msgid "Source repository" +msgstr "Исходный репозиторий" + +msgid "By" +msgstr "По" + +msgid "repository" +msgstr "хранилище" + +msgid "Last updated on" +msgstr "Последнее обновление" + +msgid "Toggle navigation" +msgstr "Переключить навигацию" + +msgid "Sphinx Book Theme" +msgstr "Тема книги Сфинкс" + +msgid "suggest edit" +msgstr "предложить редактировать" + +msgid "Open an issue" +msgstr "Открыть вопрос" + +msgid "Launch" +msgstr "Запуск" + +msgid "Fullscreen mode" +msgstr "Полноэкранный режим" + +msgid "Edit this page" +msgstr "Редактировать эту страницу" + +msgid "By the" +msgstr "Посредством" + +msgid "next page" +msgstr "Следующая страница" diff --git a/spec/_static/locales/sk/LC_MESSAGES/booktheme.mo b/spec/_static/locales/sk/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..59bd0ddfa3 Binary files /dev/null and b/spec/_static/locales/sk/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/sk/LC_MESSAGES/booktheme.po b/spec/_static/locales/sk/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..650128817a --- /dev/null +++ b/spec/_static/locales/sk/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Tlač do PDF" + +msgid "Theme by the" +msgstr "Téma od" + +msgid "Download source file" +msgstr "Stiahnite si zdrojový súbor" + +msgid "open issue" +msgstr "otvorené vydanie" + +msgid "Contents" +msgstr "Obsah" + +msgid "previous page" +msgstr "predchádzajúca strana" + +msgid "Download notebook file" +msgstr "Stiahnite si zošit" + +msgid "Copyright" +msgstr "Autorské práva" + +msgid "Download this page" +msgstr "Stiahnite si túto stránku" + +msgid "Source repository" +msgstr "Zdrojové úložisko" + +msgid "By" +msgstr "Autor:" + +msgid "repository" +msgstr "Úložisko" + +msgid "Last updated on" +msgstr "Posledná aktualizácia dňa" + +msgid "Toggle navigation" +msgstr "Prepnúť navigáciu" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "suggest edit" +msgstr "navrhnúť úpravu" + +msgid "Open an issue" +msgstr "Otvorte problém" + +msgid "Launch" +msgstr "Spustiť" + +msgid "Fullscreen mode" +msgstr "Režim celej obrazovky" + +msgid "Edit this page" +msgstr "Upraviť túto stránku" + +msgid "By the" +msgstr "Podľa" + +msgid "next page" +msgstr "ďalšia strana" diff --git a/spec/_static/locales/sl/LC_MESSAGES/booktheme.mo b/spec/_static/locales/sl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..87bf26de68 Binary files /dev/null and b/spec/_static/locales/sl/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/sl/LC_MESSAGES/booktheme.po b/spec/_static/locales/sl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..3c7e3a8665 --- /dev/null +++ b/spec/_static/locales/sl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Natisni v PDF" + +msgid "Theme by the" +msgstr "Tema avtorja" + +msgid "Download source file" +msgstr "Prenesite izvorno datoteko" + +msgid "open issue" +msgstr "odprto vprašanje" + +msgid "Contents" +msgstr "Vsebina" + +msgid "previous page" +msgstr "Prejšnja stran" + +msgid "Download notebook file" +msgstr "Prenesite datoteko zvezka" + +msgid "Copyright" +msgstr "avtorske pravice" + +msgid "Download this page" +msgstr "Prenesite to stran" + +msgid "Source repository" +msgstr "Izvorno skladišče" + +msgid "By" +msgstr "Avtor" + +msgid "repository" +msgstr "odlagališče" + +msgid "Last updated on" +msgstr "Nazadnje posodobljeno dne" + +msgid "Toggle navigation" +msgstr "Preklopi navigacijo" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "suggest edit" +msgstr "predlagajte urejanje" + +msgid "Open an issue" +msgstr "Odprite številko" + +msgid "Launch" +msgstr "Kosilo" + +msgid "Fullscreen mode" +msgstr "Celozaslonski način" + +msgid "Edit this page" +msgstr "Uredite to stran" + +msgid "By the" +msgstr "Avtor" + +msgid "next page" +msgstr "Naslednja stran" diff --git a/spec/_static/locales/sr/LC_MESSAGES/booktheme.mo b/spec/_static/locales/sr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..ec740f4852 Binary files /dev/null and b/spec/_static/locales/sr/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/sr/LC_MESSAGES/booktheme.po b/spec/_static/locales/sr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..773b8adae8 --- /dev/null +++ b/spec/_static/locales/sr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Испис у ПДФ" + +msgid "Theme by the" +msgstr "Тхеме би" + +msgid "Download source file" +msgstr "Преузми изворну датотеку" + +msgid "open issue" +msgstr "отворено издање" + +msgid "Contents" +msgstr "Садржај" + +msgid "previous page" +msgstr "Претходна страница" + +msgid "Download notebook file" +msgstr "Преузмите датотеку бележнице" + +msgid "Copyright" +msgstr "Ауторско право" + +msgid "Download this page" +msgstr "Преузмите ову страницу" + +msgid "Source repository" +msgstr "Изворно спремиште" + +msgid "By" +msgstr "Од стране" + +msgid "repository" +msgstr "спремиште" + +msgid "Last updated on" +msgstr "Последње ажурирање" + +msgid "Toggle navigation" +msgstr "Укључи / искључи навигацију" + +msgid "Sphinx Book Theme" +msgstr "Тема књиге Спхинк" + +msgid "suggest edit" +msgstr "предложи уређивање" + +msgid "Open an issue" +msgstr "Отворите издање" + +msgid "Launch" +msgstr "Лансирање" + +msgid "Fullscreen mode" +msgstr "Режим целог екрана" + +msgid "Edit this page" +msgstr "Уредите ову страницу" + +msgid "By the" +msgstr "Од" + +msgid "next page" +msgstr "Следећа страна" diff --git a/spec/_static/locales/sv/LC_MESSAGES/booktheme.mo b/spec/_static/locales/sv/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..b07dc76ff2 Binary files /dev/null and b/spec/_static/locales/sv/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/sv/LC_MESSAGES/booktheme.po b/spec/_static/locales/sv/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..bcac54c07b --- /dev/null +++ b/spec/_static/locales/sv/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Skriv ut till PDF" + +msgid "Theme by the" +msgstr "Tema av" + +msgid "Download source file" +msgstr "Ladda ner källfil" + +msgid "open issue" +msgstr "öppna problemrapport" + +msgid "Contents" +msgstr "Innehåll" + +msgid "previous page" +msgstr "föregående sida" + +msgid "Download notebook file" +msgstr "Ladda ner notebook-fil" + +msgid "Copyright" +msgstr "Upphovsrätt" + +msgid "Download this page" +msgstr "Ladda ner den här sidan" + +msgid "Source repository" +msgstr "Källkodsrepositorium" + +msgid "By" +msgstr "Av" + +msgid "repository" +msgstr "repositorium" + +msgid "Last updated on" +msgstr "Senast uppdaterad den" + +msgid "Toggle navigation" +msgstr "Växla navigering" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Boktema" + +msgid "suggest edit" +msgstr "föreslå ändring" + +msgid "Open an issue" +msgstr "Öppna en problemrapport" + +msgid "Launch" +msgstr "Öppna" + +msgid "Fullscreen mode" +msgstr "Fullskärmsläge" + +msgid "Edit this page" +msgstr "Redigera den här sidan" + +msgid "By the" +msgstr "Av den" + +msgid "next page" +msgstr "nästa sida" diff --git a/spec/_static/locales/ta/LC_MESSAGES/booktheme.mo b/spec/_static/locales/ta/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..29f52e1f6f Binary files /dev/null and b/spec/_static/locales/ta/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/ta/LC_MESSAGES/booktheme.po b/spec/_static/locales/ta/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..b48bdfaf17 --- /dev/null +++ b/spec/_static/locales/ta/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF இல் அச்சிடுக" + +msgid "Theme by the" +msgstr "வழங்கிய தீம்" + +msgid "Download source file" +msgstr "மூல கோப்பைப் பதிவிறக்குக" + +msgid "open issue" +msgstr "திறந்த பிரச்சினை" + +msgid "previous page" +msgstr "முந்தைய பக்கம்" + +msgid "Download notebook file" +msgstr "நோட்புக் கோப்பைப் பதிவிறக்கவும்" + +msgid "Copyright" +msgstr "பதிப்புரிமை" + +msgid "Download this page" +msgstr "இந்தப் பக்கத்தைப் பதிவிறக்கவும்" + +msgid "Source repository" +msgstr "மூல களஞ்சியம்" + +msgid "By" +msgstr "வழங்கியவர்" + +msgid "Last updated on" +msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" + +msgid "Toggle navigation" +msgstr "வழிசெலுத்தலை நிலைமாற்று" + +msgid "Sphinx Book Theme" +msgstr "ஸ்பிங்க்ஸ் புத்தக தீம்" + +msgid "suggest edit" +msgstr "திருத்த பரிந்துரைக்கவும்" + +msgid "Open an issue" +msgstr "சிக்கலைத் திறக்கவும்" + +msgid "Launch" +msgstr "தொடங்க" + +msgid "Edit this page" +msgstr "இந்தப் பக்கத்தைத் திருத்தவும்" + +msgid "By the" +msgstr "மூலம்" + +msgid "next page" +msgstr "அடுத்த பக்கம்" diff --git a/spec/_static/locales/te/LC_MESSAGES/booktheme.mo b/spec/_static/locales/te/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..0a5f4b46ad Binary files /dev/null and b/spec/_static/locales/te/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/te/LC_MESSAGES/booktheme.po b/spec/_static/locales/te/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..952278f5f7 --- /dev/null +++ b/spec/_static/locales/te/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF కి ముద్రించండి" + +msgid "Theme by the" +msgstr "ద్వారా థీమ్" + +msgid "Download source file" +msgstr "మూల ఫైల్‌ను డౌన్‌లోడ్ చేయండి" + +msgid "open issue" +msgstr "ఓపెన్ ఇష్యూ" + +msgid "previous page" +msgstr "ముందు పేజి" + +msgid "Download notebook file" +msgstr "నోట్బుక్ ఫైల్ను డౌన్లోడ్ చేయండి" + +msgid "Copyright" +msgstr "కాపీరైట్" + +msgid "Download this page" +msgstr "ఈ పేజీని డౌన్‌లోడ్ చేయండి" + +msgid "Source repository" +msgstr "మూల రిపోజిటరీ" + +msgid "By" +msgstr "ద్వారా" + +msgid "Last updated on" +msgstr "చివరిగా నవీకరించబడింది" + +msgid "Toggle navigation" +msgstr "నావిగేషన్‌ను టోగుల్ చేయండి" + +msgid "Sphinx Book Theme" +msgstr "సింహిక పుస్తక థీమ్" + +msgid "suggest edit" +msgstr "సవరించమని సూచించండి" + +msgid "Open an issue" +msgstr "సమస్యను తెరవండి" + +msgid "Launch" +msgstr "ప్రారంభించండి" + +msgid "Edit this page" +msgstr "ఈ పేజీని సవరించండి" + +msgid "By the" +msgstr "ద్వారా" + +msgid "next page" +msgstr "తరువాతి పేజీ" diff --git a/spec/_static/locales/tg/LC_MESSAGES/booktheme.mo b/spec/_static/locales/tg/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..b21c6c6340 Binary files /dev/null and b/spec/_static/locales/tg/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/tg/LC_MESSAGES/booktheme.po b/spec/_static/locales/tg/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..c33dc42172 --- /dev/null +++ b/spec/_static/locales/tg/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Чоп ба PDF" + +msgid "Theme by the" +msgstr "Мавзӯъи аз" + +msgid "Download source file" +msgstr "Файли манбаъро зеркашӣ кунед" + +msgid "open issue" +msgstr "барориши кушод" + +msgid "Contents" +msgstr "Мундариҷа" + +msgid "previous page" +msgstr "саҳифаи қаблӣ" + +msgid "Download notebook file" +msgstr "Файли дафтарро зеркашӣ кунед" + +msgid "Copyright" +msgstr "Ҳуқуқи муаллиф" + +msgid "Download this page" +msgstr "Ин саҳифаро зеркашӣ кунед" + +msgid "Source repository" +msgstr "Анбори манбаъ" + +msgid "By" +msgstr "Бо" + +msgid "repository" +msgstr "анбор" + +msgid "Last updated on" +msgstr "Last навсозӣ дар" + +msgid "Toggle navigation" +msgstr "Гузаришро иваз кунед" + +msgid "Sphinx Book Theme" +msgstr "Сфинкс Мавзӯи китоб" + +msgid "suggest edit" +msgstr "пешниҳод вироиш" + +msgid "Open an issue" +msgstr "Масъаларо кушоед" + +msgid "Launch" +msgstr "Оғоз" + +msgid "Fullscreen mode" +msgstr "Ҳолати экрани пурра" + +msgid "Edit this page" +msgstr "Ин саҳифаро таҳрир кунед" + +msgid "By the" +msgstr "Бо" + +msgid "next page" +msgstr "саҳифаи оянда" diff --git a/spec/_static/locales/th/LC_MESSAGES/booktheme.mo b/spec/_static/locales/th/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..abede98aa1 Binary files /dev/null and b/spec/_static/locales/th/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/th/LC_MESSAGES/booktheme.po b/spec/_static/locales/th/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..9d24294a7f --- /dev/null +++ b/spec/_static/locales/th/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "พิมพ์เป็น PDF" + +msgid "Theme by the" +msgstr "ธีมโดย" + +msgid "Download source file" +msgstr "ดาวน์โหลดไฟล์ต้นฉบับ" + +msgid "open issue" +msgstr "เปิดปัญหา" + +msgid "Contents" +msgstr "สารบัญ" + +msgid "previous page" +msgstr "หน้าที่แล้ว" + +msgid "Download notebook file" +msgstr "ดาวน์โหลดไฟล์สมุดบันทึก" + +msgid "Copyright" +msgstr "ลิขสิทธิ์" + +msgid "Download this page" +msgstr "ดาวน์โหลดหน้านี้" + +msgid "Source repository" +msgstr "ที่เก็บซอร์ส" + +msgid "By" +msgstr "โดย" + +msgid "repository" +msgstr "ที่เก็บ" + +msgid "Last updated on" +msgstr "ปรับปรุงล่าสุดเมื่อ" + +msgid "Toggle navigation" +msgstr "ไม่ต้องสลับช่องทาง" + +msgid "Sphinx Book Theme" +msgstr "ธีมหนังสือสฟิงซ์" + +msgid "suggest edit" +msgstr "แนะนำแก้ไข" + +msgid "Open an issue" +msgstr "เปิดปัญหา" + +msgid "Launch" +msgstr "เปิด" + +msgid "Fullscreen mode" +msgstr "โหมดเต็มหน้าจอ" + +msgid "Edit this page" +msgstr "แก้ไขหน้านี้" + +msgid "By the" +msgstr "โดย" + +msgid "next page" +msgstr "หน้าต่อไป" diff --git a/spec/_static/locales/tl/LC_MESSAGES/booktheme.mo b/spec/_static/locales/tl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..8df1b73310 Binary files /dev/null and b/spec/_static/locales/tl/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/tl/LC_MESSAGES/booktheme.po b/spec/_static/locales/tl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..20e0d07ce5 --- /dev/null +++ b/spec/_static/locales/tl/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "I-print sa PDF" + +msgid "Theme by the" +msgstr "Tema ng" + +msgid "Download source file" +msgstr "Mag-download ng file ng pinagmulan" + +msgid "open issue" +msgstr "bukas na isyu" + +msgid "previous page" +msgstr "Nakaraang pahina" + +msgid "Download notebook file" +msgstr "Mag-download ng file ng notebook" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download this page" +msgstr "I-download ang pahinang ito" + +msgid "Source repository" +msgstr "Pinagmulan ng imbakan" + +msgid "By" +msgstr "Ni" + +msgid "Last updated on" +msgstr "Huling na-update noong" + +msgid "Toggle navigation" +msgstr "I-toggle ang pag-navigate" + +msgid "Sphinx Book Theme" +msgstr "Tema ng Sphinx Book" + +msgid "suggest edit" +msgstr "iminumungkahi i-edit" + +msgid "Open an issue" +msgstr "Magbukas ng isyu" + +msgid "Launch" +msgstr "Ilunsad" + +msgid "Edit this page" +msgstr "I-edit ang pahinang ito" + +msgid "By the" +msgstr "Sa pamamagitan ng" + +msgid "next page" +msgstr "Susunod na pahina" diff --git a/spec/_static/locales/tr/LC_MESSAGES/booktheme.mo b/spec/_static/locales/tr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..029ae18afb Binary files /dev/null and b/spec/_static/locales/tr/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/tr/LC_MESSAGES/booktheme.po b/spec/_static/locales/tr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..a77eb0273f --- /dev/null +++ b/spec/_static/locales/tr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF olarak yazdır" + +msgid "Theme by the" +msgstr "Tarafından tema" + +msgid "Download source file" +msgstr "Kaynak dosyayı indirin" + +msgid "open issue" +msgstr "Açık konu" + +msgid "Contents" +msgstr "İçindekiler" + +msgid "previous page" +msgstr "önceki sayfa" + +msgid "Download notebook file" +msgstr "Defter dosyasını indirin" + +msgid "Copyright" +msgstr "Telif hakkı" + +msgid "Download this page" +msgstr "Bu sayfayı indirin" + +msgid "Source repository" +msgstr "Kaynak kod deposu" + +msgid "By" +msgstr "Tarafından" + +msgid "repository" +msgstr "depo" + +msgid "Last updated on" +msgstr "Son güncelleme tarihi" + +msgid "Toggle navigation" +msgstr "Gezinmeyi değiştir" + +msgid "Sphinx Book Theme" +msgstr "Sfenks Kitap Teması" + +msgid "suggest edit" +msgstr "düzenleme öner" + +msgid "Open an issue" +msgstr "Bir sorunu açın" + +msgid "Launch" +msgstr "Başlatmak" + +msgid "Fullscreen mode" +msgstr "Tam ekran modu" + +msgid "Edit this page" +msgstr "Bu sayfayı düzenle" + +msgid "By the" +msgstr "Tarafından" + +msgid "next page" +msgstr "sonraki Sayfa" diff --git a/spec/_static/locales/uk/LC_MESSAGES/booktheme.mo b/spec/_static/locales/uk/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..16ab78909c Binary files /dev/null and b/spec/_static/locales/uk/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/uk/LC_MESSAGES/booktheme.po b/spec/_static/locales/uk/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..993dd07810 --- /dev/null +++ b/spec/_static/locales/uk/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Друк у форматі PDF" + +msgid "Theme by the" +msgstr "Тема від" + +msgid "Download source file" +msgstr "Завантажити вихідний файл" + +msgid "open issue" +msgstr "відкритий випуск" + +msgid "Contents" +msgstr "Зміст" + +msgid "previous page" +msgstr "Попередня сторінка" + +msgid "Download notebook file" +msgstr "Завантажте файл блокнота" + +msgid "Copyright" +msgstr "Авторське право" + +msgid "Download this page" +msgstr "Завантажте цю сторінку" + +msgid "Source repository" +msgstr "Джерело сховища" + +msgid "By" +msgstr "Автор" + +msgid "repository" +msgstr "сховище" + +msgid "Last updated on" +msgstr "Останнє оновлення:" + +msgid "Toggle navigation" +msgstr "Переключити навігацію" + +msgid "Sphinx Book Theme" +msgstr "Тема книги \"Сфінкс\"" + +msgid "suggest edit" +msgstr "запропонувати редагувати" + +msgid "Open an issue" +msgstr "Відкрийте випуск" + +msgid "Launch" +msgstr "Запуск" + +msgid "Fullscreen mode" +msgstr "Повноекранний режим" + +msgid "Edit this page" +msgstr "Редагувати цю сторінку" + +msgid "By the" +msgstr "По" + +msgid "next page" +msgstr "Наступна сторінка" diff --git a/spec/_static/locales/ur/LC_MESSAGES/booktheme.mo b/spec/_static/locales/ur/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..de8c84b935 Binary files /dev/null and b/spec/_static/locales/ur/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/ur/LC_MESSAGES/booktheme.po b/spec/_static/locales/ur/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..2f774267f8 --- /dev/null +++ b/spec/_static/locales/ur/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "پی ڈی ایف پرنٹ کریں" + +msgid "Theme by the" +msgstr "کے ذریعہ تھیم" + +msgid "Download source file" +msgstr "سورس فائل ڈاؤن لوڈ کریں" + +msgid "open issue" +msgstr "کھلا مسئلہ" + +msgid "previous page" +msgstr "سابقہ ​​صفحہ" + +msgid "Download notebook file" +msgstr "نوٹ بک فائل ڈاؤن لوڈ کریں" + +msgid "Copyright" +msgstr "کاپی رائٹ" + +msgid "Download this page" +msgstr "اس صفحے کو ڈاؤن لوڈ کریں" + +msgid "Source repository" +msgstr "ماخذ ذخیرہ" + +msgid "By" +msgstr "بذریعہ" + +msgid "Last updated on" +msgstr "آخری بار تازہ کاری ہوئی" + +msgid "Toggle navigation" +msgstr "نیویگیشن ٹوگل کریں" + +msgid "Sphinx Book Theme" +msgstr "سپنکس بک تھیم" + +msgid "suggest edit" +msgstr "ترمیم کی تجویز کریں" + +msgid "Open an issue" +msgstr "ایک مسئلہ کھولیں" + +msgid "Launch" +msgstr "لانچ کریں" + +msgid "Edit this page" +msgstr "اس صفحے میں ترمیم کریں" + +msgid "By the" +msgstr "کی طرف" + +msgid "next page" +msgstr "اگلا صفحہ" diff --git a/spec/_static/locales/vi/LC_MESSAGES/booktheme.mo b/spec/_static/locales/vi/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..2bb32555c3 Binary files /dev/null and b/spec/_static/locales/vi/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/vi/LC_MESSAGES/booktheme.po b/spec/_static/locales/vi/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..33159f3efc --- /dev/null +++ b/spec/_static/locales/vi/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "In sang PDF" + +msgid "Theme by the" +msgstr "Chủ đề của" + +msgid "Download source file" +msgstr "Tải xuống tệp nguồn" + +msgid "open issue" +msgstr "vấn đề mở" + +msgid "Contents" +msgstr "Nội dung" + +msgid "previous page" +msgstr "trang trước" + +msgid "Download notebook file" +msgstr "Tải xuống tệp sổ tay" + +msgid "Copyright" +msgstr "Bản quyền" + +msgid "Download this page" +msgstr "Tải xuống trang này" + +msgid "Source repository" +msgstr "Kho nguồn" + +msgid "By" +msgstr "Bởi" + +msgid "repository" +msgstr "kho" + +msgid "Last updated on" +msgstr "Cập nhật lần cuối vào" + +msgid "Toggle navigation" +msgstr "Chuyển đổi điều hướng thành" + +msgid "Sphinx Book Theme" +msgstr "Chủ đề sách nhân sư" + +msgid "suggest edit" +msgstr "đề nghị chỉnh sửa" + +msgid "Open an issue" +msgstr "Mở một vấn đề" + +msgid "Launch" +msgstr "Phóng" + +msgid "Fullscreen mode" +msgstr "Chế độ toàn màn hình" + +msgid "Edit this page" +msgstr "chỉnh sửa trang này" + +msgid "By the" +msgstr "Bằng" + +msgid "next page" +msgstr "Trang tiếp theo" diff --git a/spec/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo b/spec/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..0e3235d090 Binary files /dev/null and b/spec/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/zh_CN/LC_MESSAGES/booktheme.po b/spec/_static/locales/zh_CN/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..2e519ef455 --- /dev/null +++ b/spec/_static/locales/zh_CN/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "Theme by the" +msgstr "主题作者:" + +msgid "Download source file" +msgstr "下载源文件" + +msgid "open issue" +msgstr "创建议题" + +msgid "Contents" +msgstr "目录" + +msgid "previous page" +msgstr "上一页" + +msgid "Download notebook file" +msgstr "下载笔记本文件" + +msgid "Copyright" +msgstr "版权" + +msgid "Download this page" +msgstr "下载此页面" + +msgid "Source repository" +msgstr "源码库" + +msgid "By" +msgstr "作者:" + +msgid "repository" +msgstr "仓库" + +msgid "Last updated on" +msgstr "上次更新时间:" + +msgid "Toggle navigation" +msgstr "显示或隐藏导航栏" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 主题" + +msgid "suggest edit" +msgstr "提出修改建议" + +msgid "Open an issue" +msgstr "创建议题" + +msgid "Launch" +msgstr "启动" + +msgid "Fullscreen mode" +msgstr "全屏模式" + +msgid "Edit this page" +msgstr "编辑此页面" + +msgid "By the" +msgstr "作者:" + +msgid "next page" +msgstr "下一页" diff --git a/spec/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo b/spec/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000..9116fa95d0 Binary files /dev/null and b/spec/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo differ diff --git a/spec/_static/locales/zh_TW/LC_MESSAGES/booktheme.po b/spec/_static/locales/zh_TW/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000..beecb076b1 --- /dev/null +++ b/spec/_static/locales/zh_TW/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "Theme by the" +msgstr "佈景主題作者:" + +msgid "Download source file" +msgstr "下載原始檔" + +msgid "open issue" +msgstr "公開的問題" + +msgid "Contents" +msgstr "目錄" + +msgid "previous page" +msgstr "上一頁" + +msgid "Download notebook file" +msgstr "下載 Notebook 檔案" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download this page" +msgstr "下載此頁面" + +msgid "Source repository" +msgstr "來源儲存庫" + +msgid "By" +msgstr "作者:" + +msgid "repository" +msgstr "儲存庫" + +msgid "Last updated on" +msgstr "最後更新時間:" + +msgid "Toggle navigation" +msgstr "顯示或隱藏導覽列" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 佈景主題" + +msgid "suggest edit" +msgstr "提出修改建議" + +msgid "Open an issue" +msgstr "開啟議題" + +msgid "Launch" +msgstr "啟動" + +msgid "Fullscreen mode" +msgstr "全螢幕模式" + +msgid "Edit this page" +msgstr "編輯此頁面" + +msgid "By the" +msgstr "作者:" + +msgid "next page" +msgstr "下一頁" diff --git a/spec/_static/minus.png b/spec/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/spec/_static/minus.png differ diff --git a/spec/_static/plus.png b/spec/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/spec/_static/plus.png differ diff --git a/spec/_static/pygments.css b/spec/_static/pygments.css new file mode 100644 index 0000000000..012e6a00a4 --- /dev/null +++ b/spec/_static/pygments.css @@ -0,0 +1,152 @@ +html[data-theme="light"] .highlight pre { line-height: 125%; } +html[data-theme="light"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight .hll { background-color: #fae4c2 } +html[data-theme="light"] .highlight { background: #fefefe; color: #080808 } +html[data-theme="light"] .highlight .c { color: #515151 } /* Comment */ +html[data-theme="light"] .highlight .err { color: #a12236 } /* Error */ +html[data-theme="light"] .highlight .k { color: #6730c5 } /* Keyword */ +html[data-theme="light"] .highlight .l { color: #7f4707 } /* Literal */ +html[data-theme="light"] .highlight .n { color: #080808 } /* Name */ +html[data-theme="light"] .highlight .o { color: #00622f } /* Operator */ +html[data-theme="light"] .highlight .p { color: #080808 } /* Punctuation */ +html[data-theme="light"] .highlight .ch { color: #515151 } /* Comment.Hashbang */ +html[data-theme="light"] .highlight .cm { color: #515151 } /* Comment.Multiline */ +html[data-theme="light"] .highlight .cp { color: #515151 } /* Comment.Preproc */ +html[data-theme="light"] .highlight .cpf { color: #515151 } /* Comment.PreprocFile */ +html[data-theme="light"] .highlight .c1 { color: #515151 } /* Comment.Single */ +html[data-theme="light"] .highlight .cs { color: #515151 } /* Comment.Special */ +html[data-theme="light"] .highlight .gd { color: #005b82 } /* Generic.Deleted */ +html[data-theme="light"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="light"] .highlight .gh { color: #005b82 } /* Generic.Heading */ +html[data-theme="light"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="light"] .highlight .gu { color: #005b82 } /* Generic.Subheading */ +html[data-theme="light"] .highlight .kc { color: #6730c5 } /* Keyword.Constant */ +html[data-theme="light"] .highlight .kd { color: #6730c5 } /* Keyword.Declaration */ +html[data-theme="light"] .highlight .kn { color: #6730c5 } /* Keyword.Namespace */ +html[data-theme="light"] .highlight .kp { color: #6730c5 } /* Keyword.Pseudo */ +html[data-theme="light"] .highlight .kr { color: #6730c5 } /* Keyword.Reserved */ +html[data-theme="light"] .highlight .kt { color: #7f4707 } /* Keyword.Type */ +html[data-theme="light"] .highlight .ld { color: #7f4707 } /* Literal.Date */ +html[data-theme="light"] .highlight .m { color: #7f4707 } /* Literal.Number */ +html[data-theme="light"] .highlight .s { color: #00622f } /* Literal.String */ +html[data-theme="light"] .highlight .na { color: #912583 } /* Name.Attribute */ +html[data-theme="light"] .highlight .nb { color: #7f4707 } /* Name.Builtin */ +html[data-theme="light"] .highlight .nc { color: #005b82 } /* Name.Class */ +html[data-theme="light"] .highlight .no { color: #005b82 } /* Name.Constant */ +html[data-theme="light"] .highlight .nd { color: #7f4707 } /* Name.Decorator */ +html[data-theme="light"] .highlight .ni { color: #00622f } /* Name.Entity */ +html[data-theme="light"] .highlight .ne { color: #6730c5 } /* Name.Exception */ +html[data-theme="light"] .highlight .nf { color: #005b82 } /* Name.Function */ +html[data-theme="light"] .highlight .nl { color: #7f4707 } /* Name.Label */ +html[data-theme="light"] .highlight .nn { color: #080808 } /* Name.Namespace */ +html[data-theme="light"] .highlight .nx { color: #080808 } /* Name.Other */ +html[data-theme="light"] .highlight .py { color: #005b82 } /* Name.Property */ +html[data-theme="light"] .highlight .nt { color: #005b82 } /* Name.Tag */ +html[data-theme="light"] .highlight .nv { color: #a12236 } /* Name.Variable */ +html[data-theme="light"] .highlight .ow { color: #6730c5 } /* Operator.Word */ +html[data-theme="light"] .highlight .pm { color: #080808 } /* Punctuation.Marker */ +html[data-theme="light"] .highlight .w { color: #080808 } /* Text.Whitespace */ +html[data-theme="light"] .highlight .mb { color: #7f4707 } /* Literal.Number.Bin */ +html[data-theme="light"] .highlight .mf { color: #7f4707 } /* Literal.Number.Float */ +html[data-theme="light"] .highlight .mh { color: #7f4707 } /* Literal.Number.Hex */ +html[data-theme="light"] .highlight .mi { color: #7f4707 } /* Literal.Number.Integer */ +html[data-theme="light"] .highlight .mo { color: #7f4707 } /* Literal.Number.Oct */ +html[data-theme="light"] .highlight .sa { color: #00622f } /* Literal.String.Affix */ +html[data-theme="light"] .highlight .sb { color: #00622f } /* Literal.String.Backtick */ +html[data-theme="light"] .highlight .sc { color: #00622f } /* Literal.String.Char */ +html[data-theme="light"] .highlight .dl { color: #00622f } /* Literal.String.Delimiter */ +html[data-theme="light"] .highlight .sd { color: #00622f } /* Literal.String.Doc */ +html[data-theme="light"] .highlight .s2 { color: #00622f } /* Literal.String.Double */ +html[data-theme="light"] .highlight .se { color: #00622f } /* Literal.String.Escape */ +html[data-theme="light"] .highlight .sh { color: #00622f } /* Literal.String.Heredoc */ +html[data-theme="light"] .highlight .si { color: #00622f } /* Literal.String.Interpol */ +html[data-theme="light"] .highlight .sx { color: #00622f } /* Literal.String.Other */ +html[data-theme="light"] .highlight .sr { color: #a12236 } /* Literal.String.Regex */ +html[data-theme="light"] .highlight .s1 { color: #00622f } /* Literal.String.Single */ +html[data-theme="light"] .highlight .ss { color: #005b82 } /* Literal.String.Symbol */ +html[data-theme="light"] .highlight .bp { color: #7f4707 } /* Name.Builtin.Pseudo */ +html[data-theme="light"] .highlight .fm { color: #005b82 } /* Name.Function.Magic */ +html[data-theme="light"] .highlight .vc { color: #a12236 } /* Name.Variable.Class */ +html[data-theme="light"] .highlight .vg { color: #a12236 } /* Name.Variable.Global */ +html[data-theme="light"] .highlight .vi { color: #a12236 } /* Name.Variable.Instance */ +html[data-theme="light"] .highlight .vm { color: #7f4707 } /* Name.Variable.Magic */ +html[data-theme="light"] .highlight .il { color: #7f4707 } /* Literal.Number.Integer.Long */ +html[data-theme="dark"] .highlight pre { line-height: 125%; } +html[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight .hll { background-color: #ffd9002e } +html[data-theme="dark"] .highlight { background: #2b2b2b; color: #f8f8f2 } +html[data-theme="dark"] .highlight .c { color: #ffd900 } /* Comment */ +html[data-theme="dark"] .highlight .err { color: #ffa07a } /* Error */ +html[data-theme="dark"] .highlight .k { color: #dcc6e0 } /* Keyword */ +html[data-theme="dark"] .highlight .l { color: #ffd900 } /* Literal */ +html[data-theme="dark"] .highlight .n { color: #f8f8f2 } /* Name */ +html[data-theme="dark"] .highlight .o { color: #abe338 } /* Operator */ +html[data-theme="dark"] .highlight .p { color: #f8f8f2 } /* Punctuation */ +html[data-theme="dark"] .highlight .ch { color: #ffd900 } /* Comment.Hashbang */ +html[data-theme="dark"] .highlight .cm { color: #ffd900 } /* Comment.Multiline */ +html[data-theme="dark"] .highlight .cp { color: #ffd900 } /* Comment.Preproc */ +html[data-theme="dark"] .highlight .cpf { color: #ffd900 } /* Comment.PreprocFile */ +html[data-theme="dark"] .highlight .c1 { color: #ffd900 } /* Comment.Single */ +html[data-theme="dark"] .highlight .cs { color: #ffd900 } /* Comment.Special */ +html[data-theme="dark"] .highlight .gd { color: #00e0e0 } /* Generic.Deleted */ +html[data-theme="dark"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="dark"] .highlight .gh { color: #00e0e0 } /* Generic.Heading */ +html[data-theme="dark"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="dark"] .highlight .gu { color: #00e0e0 } /* Generic.Subheading */ +html[data-theme="dark"] .highlight .kc { color: #dcc6e0 } /* Keyword.Constant */ +html[data-theme="dark"] .highlight .kd { color: #dcc6e0 } /* Keyword.Declaration */ +html[data-theme="dark"] .highlight .kn { color: #dcc6e0 } /* Keyword.Namespace */ +html[data-theme="dark"] .highlight .kp { color: #dcc6e0 } /* Keyword.Pseudo */ +html[data-theme="dark"] .highlight .kr { color: #dcc6e0 } /* Keyword.Reserved */ +html[data-theme="dark"] .highlight .kt { color: #ffd900 } /* Keyword.Type */ +html[data-theme="dark"] .highlight .ld { color: #ffd900 } /* Literal.Date */ +html[data-theme="dark"] .highlight .m { color: #ffd900 } /* Literal.Number */ +html[data-theme="dark"] .highlight .s { color: #abe338 } /* Literal.String */ +html[data-theme="dark"] .highlight .na { color: #ffd900 } /* Name.Attribute */ +html[data-theme="dark"] .highlight .nb { color: #ffd900 } /* Name.Builtin */ +html[data-theme="dark"] .highlight .nc { color: #00e0e0 } /* Name.Class */ +html[data-theme="dark"] .highlight .no { color: #00e0e0 } /* Name.Constant */ +html[data-theme="dark"] .highlight .nd { color: #ffd900 } /* Name.Decorator */ +html[data-theme="dark"] .highlight .ni { color: #abe338 } /* Name.Entity */ +html[data-theme="dark"] .highlight .ne { color: #dcc6e0 } /* Name.Exception */ +html[data-theme="dark"] .highlight .nf { color: #00e0e0 } /* Name.Function */ +html[data-theme="dark"] .highlight .nl { color: #ffd900 } /* Name.Label */ +html[data-theme="dark"] .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ +html[data-theme="dark"] .highlight .nx { color: #f8f8f2 } /* Name.Other */ +html[data-theme="dark"] .highlight .py { color: #00e0e0 } /* Name.Property */ +html[data-theme="dark"] .highlight .nt { color: #00e0e0 } /* Name.Tag */ +html[data-theme="dark"] .highlight .nv { color: #ffa07a } /* Name.Variable */ +html[data-theme="dark"] .highlight .ow { color: #dcc6e0 } /* Operator.Word */ +html[data-theme="dark"] .highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */ +html[data-theme="dark"] .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ +html[data-theme="dark"] .highlight .mb { color: #ffd900 } /* Literal.Number.Bin */ +html[data-theme="dark"] .highlight .mf { color: #ffd900 } /* Literal.Number.Float */ +html[data-theme="dark"] .highlight .mh { color: #ffd900 } /* Literal.Number.Hex */ +html[data-theme="dark"] .highlight .mi { color: #ffd900 } /* Literal.Number.Integer */ +html[data-theme="dark"] .highlight .mo { color: #ffd900 } /* Literal.Number.Oct */ +html[data-theme="dark"] .highlight .sa { color: #abe338 } /* Literal.String.Affix */ +html[data-theme="dark"] .highlight .sb { color: #abe338 } /* Literal.String.Backtick */ +html[data-theme="dark"] .highlight .sc { color: #abe338 } /* Literal.String.Char */ +html[data-theme="dark"] .highlight .dl { color: #abe338 } /* Literal.String.Delimiter */ +html[data-theme="dark"] .highlight .sd { color: #abe338 } /* Literal.String.Doc */ +html[data-theme="dark"] .highlight .s2 { color: #abe338 } /* Literal.String.Double */ +html[data-theme="dark"] .highlight .se { color: #abe338 } /* Literal.String.Escape */ +html[data-theme="dark"] .highlight .sh { color: #abe338 } /* Literal.String.Heredoc */ +html[data-theme="dark"] .highlight .si { color: #abe338 } /* Literal.String.Interpol */ +html[data-theme="dark"] .highlight .sx { color: #abe338 } /* Literal.String.Other */ +html[data-theme="dark"] .highlight .sr { color: #ffa07a } /* Literal.String.Regex */ +html[data-theme="dark"] .highlight .s1 { color: #abe338 } /* Literal.String.Single */ +html[data-theme="dark"] .highlight .ss { color: #00e0e0 } /* Literal.String.Symbol */ +html[data-theme="dark"] .highlight .bp { color: #ffd900 } /* Name.Builtin.Pseudo */ +html[data-theme="dark"] .highlight .fm { color: #00e0e0 } /* Name.Function.Magic */ +html[data-theme="dark"] .highlight .vc { color: #ffa07a } /* Name.Variable.Class */ +html[data-theme="dark"] .highlight .vg { color: #ffa07a } /* Name.Variable.Global */ +html[data-theme="dark"] .highlight .vi { color: #ffa07a } /* Name.Variable.Instance */ +html[data-theme="dark"] .highlight .vm { color: #ffd900 } /* Name.Variable.Magic */ +html[data-theme="dark"] .highlight .il { color: #ffd900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/spec/_static/sbt-webpack-macros.html b/spec/_static/sbt-webpack-macros.html new file mode 100644 index 0000000000..6cbf559faa --- /dev/null +++ b/spec/_static/sbt-webpack-macros.html @@ -0,0 +1,11 @@ + +{% macro head_pre_bootstrap() %} + +{% endmacro %} + +{% macro body_post() %} + +{% endmacro %} diff --git a/spec/_static/scripts/bootstrap.js b/spec/_static/scripts/bootstrap.js new file mode 100644 index 0000000000..c8178debbc --- /dev/null +++ b/spec/_static/scripts/bootstrap.js @@ -0,0 +1,3 @@ +/*! For license information please see bootstrap.js.LICENSE.txt */ +(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>E,afterRead:()=>v,afterWrite:()=>C,applyStyles:()=>$,arrow:()=>J,auto:()=>a,basePlacements:()=>l,beforeMain:()=>y,beforeRead:()=>_,beforeWrite:()=>A,bottom:()=>s,clippingParents:()=>d,computeStyles:()=>it,createPopper:()=>Dt,createPopperBase:()=>St,createPopperLite:()=>$t,detectOverflow:()=>_t,end:()=>h,eventListeners:()=>st,flip:()=>bt,hide:()=>wt,left:()=>r,main:()=>w,modifierPhases:()=>O,offset:()=>Et,placements:()=>g,popper:()=>f,popperGenerator:()=>Lt,popperOffsets:()=>At,preventOverflow:()=>Tt,read:()=>b,reference:()=>p,right:()=>o,start:()=>c,top:()=>n,variationPlacements:()=>m,viewport:()=>u,write:()=>T});var i={};t.r(i),t.d(i,{Alert:()=>Oe,Button:()=>ke,Carousel:()=>li,Collapse:()=>Ei,Dropdown:()=>Ki,Modal:()=>Ln,Offcanvas:()=>Kn,Popover:()=>bs,ScrollSpy:()=>Ls,Tab:()=>Js,Toast:()=>po,Tooltip:()=>fs});var n="top",s="bottom",o="right",r="left",a="auto",l=[n,s,o,r],c="start",h="end",d="clippingParents",u="viewport",f="popper",p="reference",m=l.reduce((function(t,e){return t.concat([e+"-"+c,e+"-"+h])}),[]),g=[].concat(l,[a]).reduce((function(t,e){return t.concat([e,e+"-"+c,e+"-"+h])}),[]),_="beforeRead",b="read",v="afterRead",y="beforeMain",w="main",E="afterMain",A="beforeWrite",T="write",C="afterWrite",O=[_,b,v,y,w,E,A,T,C];function x(t){return t?(t.nodeName||"").toLowerCase():null}function k(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function L(t){return t instanceof k(t).Element||t instanceof Element}function S(t){return t instanceof k(t).HTMLElement||t instanceof HTMLElement}function D(t){return"undefined"!=typeof ShadowRoot&&(t instanceof k(t).ShadowRoot||t instanceof ShadowRoot)}const $={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];S(s)&&x(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});S(n)&&x(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function I(t){return t.split("-")[0]}var N=Math.max,P=Math.min,M=Math.round;function j(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function F(){return!/^((?!chrome|android).)*safari/i.test(j())}function H(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&S(t)&&(s=t.offsetWidth>0&&M(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&M(n.height)/t.offsetHeight||1);var r=(L(t)?k(t):window).visualViewport,a=!F()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function B(t){var e=H(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function W(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&D(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function z(t){return k(t).getComputedStyle(t)}function R(t){return["table","td","th"].indexOf(x(t))>=0}function q(t){return((L(t)?t.ownerDocument:t.document)||window.document).documentElement}function V(t){return"html"===x(t)?t:t.assignedSlot||t.parentNode||(D(t)?t.host:null)||q(t)}function Y(t){return S(t)&&"fixed"!==z(t).position?t.offsetParent:null}function K(t){for(var e=k(t),i=Y(t);i&&R(i)&&"static"===z(i).position;)i=Y(i);return i&&("html"===x(i)||"body"===x(i)&&"static"===z(i).position)?e:i||function(t){var e=/firefox/i.test(j());if(/Trident/i.test(j())&&S(t)&&"fixed"===z(t).position)return null;var i=V(t);for(D(i)&&(i=i.host);S(i)&&["html","body"].indexOf(x(i))<0;){var n=z(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Q(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function X(t,e,i){return N(t,P(e,i))}function U(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function G(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const J={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,a=t.name,c=t.options,h=i.elements.arrow,d=i.modifiersData.popperOffsets,u=I(i.placement),f=Q(u),p=[r,o].indexOf(u)>=0?"height":"width";if(h&&d){var m=function(t,e){return U("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:G(t,l))}(c.padding,i),g=B(h),_="y"===f?n:r,b="y"===f?s:o,v=i.rects.reference[p]+i.rects.reference[f]-d[f]-i.rects.popper[p],y=d[f]-i.rects.reference[f],w=K(h),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,A=v/2-y/2,T=m[_],C=E-g[p]-m[b],O=E/2-g[p]/2+A,x=X(T,O,C),k=f;i.modifiersData[a]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&W(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Z(t){return t.split("-")[1]}var tt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function et(t){var e,i=t.popper,a=t.popperRect,l=t.placement,c=t.variation,d=t.offsets,u=t.position,f=t.gpuAcceleration,p=t.adaptive,m=t.roundOffsets,g=t.isFixed,_=d.x,b=void 0===_?0:_,v=d.y,y=void 0===v?0:v,w="function"==typeof m?m({x:b,y}):{x:b,y};b=w.x,y=w.y;var E=d.hasOwnProperty("x"),A=d.hasOwnProperty("y"),T=r,C=n,O=window;if(p){var x=K(i),L="clientHeight",S="clientWidth";x===k(i)&&"static"!==z(x=q(i)).position&&"absolute"===u&&(L="scrollHeight",S="scrollWidth"),(l===n||(l===r||l===o)&&c===h)&&(C=s,y-=(g&&x===O&&O.visualViewport?O.visualViewport.height:x[L])-a.height,y*=f?1:-1),l!==r&&(l!==n&&l!==s||c!==h)||(T=o,b-=(g&&x===O&&O.visualViewport?O.visualViewport.width:x[S])-a.width,b*=f?1:-1)}var D,$=Object.assign({position:u},p&&tt),I=!0===m?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:M(i*s)/s||0,y:M(n*s)/s||0}}({x:b,y},k(i)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},$,((D={})[C]=A?"0":"",D[T]=E?"0":"",D.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",D)):Object.assign({},$,((e={})[C]=A?y+"px":"",e[T]=E?b+"px":"",e.transform="",e))}const it={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:I(e.placement),variation:Z(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,et(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,et(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var nt={passive:!0};const st={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=k(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,nt)})),a&&l.addEventListener("resize",i.update,nt),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,nt)})),a&&l.removeEventListener("resize",i.update,nt)}},data:{}};var ot={left:"right",right:"left",bottom:"top",top:"bottom"};function rt(t){return t.replace(/left|right|bottom|top/g,(function(t){return ot[t]}))}var at={start:"end",end:"start"};function lt(t){return t.replace(/start|end/g,(function(t){return at[t]}))}function ct(t){var e=k(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ht(t){return H(q(t)).left+ct(t).scrollLeft}function dt(t){var e=z(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ut(t){return["html","body","#document"].indexOf(x(t))>=0?t.ownerDocument.body:S(t)&&dt(t)?t:ut(V(t))}function ft(t,e){var i;void 0===e&&(e=[]);var n=ut(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=k(n),r=s?[o].concat(o.visualViewport||[],dt(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ft(V(r)))}function pt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function mt(t,e,i){return e===u?pt(function(t,e){var i=k(t),n=q(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=F();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ht(t),y:l}}(t,i)):L(e)?function(t,e){var i=H(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):pt(function(t){var e,i=q(t),n=ct(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=N(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=N(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ht(t),l=-n.scrollTop;return"rtl"===z(s||i).direction&&(a+=N(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(q(t)))}function gt(t){var e,i=t.reference,a=t.element,l=t.placement,d=l?I(l):null,u=l?Z(l):null,f=i.x+i.width/2-a.width/2,p=i.y+i.height/2-a.height/2;switch(d){case n:e={x:f,y:i.y-a.height};break;case s:e={x:f,y:i.y+i.height};break;case o:e={x:i.x+i.width,y:p};break;case r:e={x:i.x-a.width,y:p};break;default:e={x:i.x,y:i.y}}var m=d?Q(d):null;if(null!=m){var g="y"===m?"height":"width";switch(u){case c:e[m]=e[m]-(i[g]/2-a[g]/2);break;case h:e[m]=e[m]+(i[g]/2-a[g]/2)}}return e}function _t(t,e){void 0===e&&(e={});var i=e,r=i.placement,a=void 0===r?t.placement:r,c=i.strategy,h=void 0===c?t.strategy:c,m=i.boundary,g=void 0===m?d:m,_=i.rootBoundary,b=void 0===_?u:_,v=i.elementContext,y=void 0===v?f:v,w=i.altBoundary,E=void 0!==w&&w,A=i.padding,T=void 0===A?0:A,C=U("number"!=typeof T?T:G(T,l)),O=y===f?p:f,k=t.rects.popper,D=t.elements[E?O:y],$=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ft(V(t)),i=["absolute","fixed"].indexOf(z(t).position)>=0&&S(t)?K(t):t;return L(i)?e.filter((function(t){return L(t)&&W(t,i)&&"body"!==x(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=mt(t,i,n);return e.top=N(s.top,e.top),e.right=P(s.right,e.right),e.bottom=P(s.bottom,e.bottom),e.left=N(s.left,e.left),e}),mt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(L(D)?D:D.contextElement||q(t.elements.popper),g,b,h),I=H(t.elements.reference),M=gt({reference:I,element:k,strategy:"absolute",placement:a}),j=pt(Object.assign({},k,M)),F=y===f?j:I,B={top:$.top-F.top+C.top,bottom:F.bottom-$.bottom+C.bottom,left:$.left-F.left+C.left,right:F.right-$.right+C.right},R=t.modifiersData.offset;if(y===f&&R){var Y=R[a];Object.keys(B).forEach((function(t){var e=[o,s].indexOf(t)>=0?1:-1,i=[n,s].indexOf(t)>=0?"y":"x";B[t]+=Y[i]*e}))}return B}const bt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var d=i.mainAxis,u=void 0===d||d,f=i.altAxis,p=void 0===f||f,_=i.fallbackPlacements,b=i.padding,v=i.boundary,y=i.rootBoundary,w=i.altBoundary,E=i.flipVariations,A=void 0===E||E,T=i.allowedAutoPlacements,C=e.options.placement,O=I(C),x=_||(O!==C&&A?function(t){if(I(t)===a)return[];var e=rt(t);return[lt(t),e,lt(e)]}(C):[rt(C)]),k=[C].concat(x).reduce((function(t,i){return t.concat(I(i)===a?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?g:c,d=Z(n),u=d?a?m:m.filter((function(t){return Z(t)===d})):l,f=u.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=u);var p=f.reduce((function(e,i){return e[i]=_t(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[I(i)],e}),{});return Object.keys(p).sort((function(t,e){return p[t]-p[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:A,allowedAutoPlacements:T}):i)}),[]),L=e.rects.reference,S=e.rects.popper,D=new Map,$=!0,N=k[0],P=0;P=0,B=H?"width":"height",W=_t(e,{placement:M,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=H?F?o:r:F?s:n;L[B]>S[B]&&(z=rt(z));var R=rt(z),q=[];if(u&&q.push(W[j]<=0),p&&q.push(W[z]<=0,W[R]<=0),q.every((function(t){return t}))){N=M,$=!1;break}D.set(M,q)}if($)for(var V=function(t){var e=k.find((function(e){var i=D.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return N=e,"break"},Y=A?3:1;Y>0&&"break"!==V(Y);Y--);e.placement!==N&&(e.modifiersData[h]._skip=!0,e.placement=N,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function vt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function yt(t){return[n,o,s,r].some((function(e){return t[e]>=0}))}const wt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=_t(e,{elementContext:"reference"}),a=_t(e,{altBoundary:!0}),l=vt(r,n),c=vt(a,s,o),h=yt(l),d=yt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Et={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,s=t.name,a=i.offset,l=void 0===a?[0,0]:a,c=g.reduce((function(t,i){return t[i]=function(t,e,i){var s=I(t),a=[r,n].indexOf(s)>=0?-1:1,l="function"==typeof i?i(Object.assign({},e,{placement:t})):i,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[r,o].indexOf(s)>=0?{x:h,y:c}:{x:c,y:h}}(i,e.rects,l),t}),{}),h=c[e.placement],d=h.x,u=h.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=d,e.modifiersData.popperOffsets.y+=u),e.modifiersData[s]=c}},At={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=gt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Tt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,a=t.name,l=i.mainAxis,h=void 0===l||l,d=i.altAxis,u=void 0!==d&&d,f=i.boundary,p=i.rootBoundary,m=i.altBoundary,g=i.padding,_=i.tether,b=void 0===_||_,v=i.tetherOffset,y=void 0===v?0:v,w=_t(e,{boundary:f,rootBoundary:p,padding:g,altBoundary:m}),E=I(e.placement),A=Z(e.placement),T=!A,C=Q(E),O="x"===C?"y":"x",x=e.modifiersData.popperOffsets,k=e.rects.reference,L=e.rects.popper,S="function"==typeof y?y(Object.assign({},e.rects,{placement:e.placement})):y,D="number"==typeof S?{mainAxis:S,altAxis:S}:Object.assign({mainAxis:0,altAxis:0},S),$=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,M={x:0,y:0};if(x){if(h){var j,F="y"===C?n:r,H="y"===C?s:o,W="y"===C?"height":"width",z=x[C],R=z+w[F],q=z-w[H],V=b?-L[W]/2:0,Y=A===c?k[W]:L[W],U=A===c?-L[W]:-k[W],G=e.elements.arrow,J=b&&G?B(G):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[F],it=tt[H],nt=X(0,k[W],J[W]),st=T?k[W]/2-V-nt-et-D.mainAxis:Y-nt-et-D.mainAxis,ot=T?-k[W]/2+V+nt+it+D.mainAxis:U+nt+it+D.mainAxis,rt=e.elements.arrow&&K(e.elements.arrow),at=rt?"y"===C?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(j=null==$?void 0:$[C])?j:0,ct=z+ot-lt,ht=X(b?P(R,z+st-lt-at):R,z,b?N(q,ct):q);x[C]=ht,M[C]=ht-z}if(u){var dt,ut="x"===C?n:r,ft="x"===C?s:o,pt=x[O],mt="y"===O?"height":"width",gt=pt+w[ut],bt=pt-w[ft],vt=-1!==[n,r].indexOf(E),yt=null!=(dt=null==$?void 0:$[O])?dt:0,wt=vt?gt:pt-k[mt]-L[mt]-yt+D.altAxis,Et=vt?pt+k[mt]+L[mt]-yt-D.altAxis:bt,At=b&&vt?function(t,e,i){var n=X(t,e,i);return n>i?i:n}(wt,pt,Et):X(b?wt:gt,pt,b?Et:bt);x[O]=At,M[O]=At-pt}e.modifiersData[a]=M}},requiresIfExists:["offset"]};function Ct(t,e,i){void 0===i&&(i=!1);var n,s,o=S(e),r=S(e)&&function(t){var e=t.getBoundingClientRect(),i=M(e.width)/t.offsetWidth||1,n=M(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=q(e),l=H(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==x(e)||dt(a))&&(c=(n=e)!==k(n)&&S(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ct(n)),S(e)?((h=H(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ht(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Ot(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var xt={placement:"bottom",modifiers:[],strategy:"absolute"};function kt(){for(var t=arguments.length,e=new Array(t),i=0;iIt.has(t)&&It.get(t).get(e)||null,remove(t,e){if(!It.has(t))return;const i=It.get(t);i.delete(e),0===i.size&&It.delete(t)}},Pt="transitionend",Mt=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),jt=t=>{t.dispatchEvent(new Event(Pt))},Ft=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ht=t=>Ft(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(Mt(t)):null,Bt=t=>{if(!Ft(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},Wt=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),zt=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?zt(t.parentNode):null},Rt=()=>{},qt=t=>{t.offsetHeight},Vt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Yt=[],Kt=()=>"rtl"===document.documentElement.dir,Qt=t=>{var e;e=()=>{const e=Vt();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(Yt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Yt)t()})),Yt.push(e)):e()},Xt=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,Ut=(t,e,i=!0)=>{if(!i)return void Xt(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const o=({target:i})=>{i===e&&(s=!0,e.removeEventListener(Pt,o),Xt(t))};e.addEventListener(Pt,o),setTimeout((()=>{s||jt(e)}),n)},Gt=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},Jt=/[^.]*(?=\..*)\.|.*/,Zt=/\..*/,te=/::\d+$/,ee={};let ie=1;const ne={mouseenter:"mouseover",mouseleave:"mouseout"},se=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function oe(t,e){return e&&`${e}::${ie++}`||t.uidEvent||ie++}function re(t){const e=oe(t);return t.uidEvent=e,ee[e]=ee[e]||{},ee[e]}function ae(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function le(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=ue(t);return se.has(o)||(o=t),[n,s,o]}function ce(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=le(e,i,n);if(e in ne){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=re(t),c=l[a]||(l[a]={}),h=ae(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=oe(r,e.replace(Jt,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return pe(s,{delegateTarget:r}),n.oneOff&&fe.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return pe(n,{delegateTarget:t}),i.oneOff&&fe.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function he(t,e,i,n,s){const o=ae(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function de(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&he(t,e,i,r.callable,r.delegationSelector)}function ue(t){return t=t.replace(Zt,""),ne[t]||t}const fe={on(t,e,i,n){ce(t,e,i,n,!1)},one(t,e,i,n){ce(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=le(e,i,n),a=r!==e,l=re(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))de(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(te,"");a&&!e.includes(s)||he(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;he(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=Vt();let s=null,o=!0,r=!0,a=!1;e!==ue(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=pe(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function pe(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function me(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function ge(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const _e={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${ge(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${ge(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=me(t.dataset[n])}return e},getDataAttribute:(t,e)=>me(t.getAttribute(`data-bs-${ge(e)}`))};class be{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=Ft(e)?_e.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...Ft(e)?_e.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],o=Ft(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${o}" but expected type "${s}".`)}var i}}class ve extends be{constructor(t,e){super(),(t=Ht(t))&&(this._element=t,this._config=this._getConfig(e),Nt.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Nt.remove(this._element,this.constructor.DATA_KEY),fe.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Ut(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return Nt.get(Ht(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const ye=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map((t=>Mt(t))).join(","):null},we={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!Wt(t)&&Bt(t)))},getSelectorFromElement(t){const e=ye(t);return e&&we.findOne(e)?e:null},getElementFromSelector(t){const e=ye(t);return e?we.findOne(e):null},getMultipleElementsFromSelector(t){const e=ye(t);return e?we.find(e):[]}},Ee=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;fe.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Wt(this))return;const s=we.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ae=".bs.alert",Te=`close${Ae}`,Ce=`closed${Ae}`;class Oe extends ve{static get NAME(){return"alert"}close(){if(fe.trigger(this._element,Te).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),fe.trigger(this._element,Ce),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Oe.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}Ee(Oe,"close"),Qt(Oe);const xe='[data-bs-toggle="button"]';class ke extends ve{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=ke.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}fe.on(document,"click.bs.button.data-api",xe,(t=>{t.preventDefault();const e=t.target.closest(xe);ke.getOrCreateInstance(e).toggle()})),Qt(ke);const Le=".bs.swipe",Se=`touchstart${Le}`,De=`touchmove${Le}`,$e=`touchend${Le}`,Ie=`pointerdown${Le}`,Ne=`pointerup${Le}`,Pe={endCallback:null,leftCallback:null,rightCallback:null},Me={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class je extends be{constructor(t,e){super(),this._element=t,t&&je.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Pe}static get DefaultType(){return Me}static get NAME(){return"swipe"}dispose(){fe.off(this._element,Le)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),Xt(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&Xt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(fe.on(this._element,Ie,(t=>this._start(t))),fe.on(this._element,Ne,(t=>this._end(t))),this._element.classList.add("pointer-event")):(fe.on(this._element,Se,(t=>this._start(t))),fe.on(this._element,De,(t=>this._move(t))),fe.on(this._element,$e,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const Fe=".bs.carousel",He=".data-api",Be="ArrowLeft",We="ArrowRight",ze="next",Re="prev",qe="left",Ve="right",Ye=`slide${Fe}`,Ke=`slid${Fe}`,Qe=`keydown${Fe}`,Xe=`mouseenter${Fe}`,Ue=`mouseleave${Fe}`,Ge=`dragstart${Fe}`,Je=`load${Fe}${He}`,Ze=`click${Fe}${He}`,ti="carousel",ei="active",ii=".active",ni=".carousel-item",si=ii+ni,oi={[Be]:Ve,[We]:qe},ri={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},ai={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class li extends ve{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=we.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===ti&&this.cycle()}static get Default(){return ri}static get DefaultType(){return ai}static get NAME(){return"carousel"}next(){this._slide(ze)}nextWhenVisible(){!document.hidden&&Bt(this._element)&&this.next()}prev(){this._slide(Re)}pause(){this._isSliding&&jt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?fe.one(this._element,Ke,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void fe.one(this._element,Ke,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?ze:Re;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&fe.on(this._element,Qe,(t=>this._keydown(t))),"hover"===this._config.pause&&(fe.on(this._element,Xe,(()=>this.pause())),fe.on(this._element,Ue,(()=>this._maybeEnableCycle()))),this._config.touch&&je.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of we.find(".carousel-item img",this._element))fe.on(t,Ge,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(qe)),rightCallback:()=>this._slide(this._directionToOrder(Ve)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new je(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=oi[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=we.findOne(ii,this._indicatorsElement);e.classList.remove(ei),e.removeAttribute("aria-current");const i=we.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(ei),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===ze,s=e||Gt(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>fe.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Ye).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),qt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(ei),i.classList.remove(ei,c,l),this._isSliding=!1,r(Ke)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return we.findOne(si,this._element)}_getItems(){return we.find(ni,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Kt()?t===qe?Re:ze:t===qe?ze:Re}_orderToDirection(t){return Kt()?t===Re?qe:Ve:t===Re?Ve:qe}static jQueryInterface(t){return this.each((function(){const e=li.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}fe.on(document,Ze,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=we.getElementFromSelector(this);if(!e||!e.classList.contains(ti))return;t.preventDefault();const i=li.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===_e.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),fe.on(window,Je,(()=>{const t=we.find('[data-bs-ride="carousel"]');for(const e of t)li.getOrCreateInstance(e)})),Qt(li);const ci=".bs.collapse",hi=`show${ci}`,di=`shown${ci}`,ui=`hide${ci}`,fi=`hidden${ci}`,pi=`click${ci}.data-api`,mi="show",gi="collapse",_i="collapsing",bi=`:scope .${gi} .${gi}`,vi='[data-bs-toggle="collapse"]',yi={parent:null,toggle:!0},wi={parent:"(null|element)",toggle:"boolean"};class Ei extends ve{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=we.find(vi);for(const t of i){const e=we.getSelectorFromElement(t),i=we.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return yi}static get DefaultType(){return wi}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Ei.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(fe.trigger(this._element,hi).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(gi),this._element.classList.add(_i),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(_i),this._element.classList.add(gi,mi),this._element.style[e]="",fe.trigger(this._element,di)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(fe.trigger(this._element,ui).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,qt(this._element),this._element.classList.add(_i),this._element.classList.remove(gi,mi);for(const t of this._triggerArray){const e=we.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(_i),this._element.classList.add(gi),fe.trigger(this._element,fi)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(mi)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ht(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(vi);for(const e of t){const t=we.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=we.find(bi,this._config.parent);return we.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Ei.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}fe.on(document,pi,vi,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of we.getMultipleElementsFromSelector(this))Ei.getOrCreateInstance(t,{toggle:!1}).toggle()})),Qt(Ei);const Ai="dropdown",Ti=".bs.dropdown",Ci=".data-api",Oi="ArrowUp",xi="ArrowDown",ki=`hide${Ti}`,Li=`hidden${Ti}`,Si=`show${Ti}`,Di=`shown${Ti}`,$i=`click${Ti}${Ci}`,Ii=`keydown${Ti}${Ci}`,Ni=`keyup${Ti}${Ci}`,Pi="show",Mi='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',ji=`${Mi}.${Pi}`,Fi=".dropdown-menu",Hi=Kt()?"top-end":"top-start",Bi=Kt()?"top-start":"top-end",Wi=Kt()?"bottom-end":"bottom-start",zi=Kt()?"bottom-start":"bottom-end",Ri=Kt()?"left-start":"right-start",qi=Kt()?"right-start":"left-start",Vi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Yi={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Ki extends ve{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=we.next(this._element,Fi)[0]||we.prev(this._element,Fi)[0]||we.findOne(Fi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Vi}static get DefaultType(){return Yi}static get NAME(){return Ai}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Wt(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!fe.trigger(this._element,Si,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Pi),this._element.classList.add(Pi),fe.trigger(this._element,Di,t)}}hide(){if(Wt(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!fe.trigger(this._element,ki,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._popper&&this._popper.destroy(),this._menu.classList.remove(Pi),this._element.classList.remove(Pi),this._element.setAttribute("aria-expanded","false"),_e.removeDataAttribute(this._menu,"popper"),fe.trigger(this._element,Li,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!Ft(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ai.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===e)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:Ft(this._config.reference)?t=Ht(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=Dt(t,this._menu,i)}_isShown(){return this._menu.classList.contains(Pi)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Ri;if(t.classList.contains("dropstart"))return qi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Bi:Hi:e?zi:Wi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(_e.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...Xt(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=we.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Bt(t)));i.length&&Gt(i,e,t===xi,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Ki.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=we.find(ji);for(const i of e){const e=Ki.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Oi,xi].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Mi)?this:we.prev(this,Mi)[0]||we.next(this,Mi)[0]||we.findOne(Mi,t.delegateTarget.parentNode),o=Ki.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}fe.on(document,Ii,Mi,Ki.dataApiKeydownHandler),fe.on(document,Ii,Fi,Ki.dataApiKeydownHandler),fe.on(document,$i,Ki.clearMenus),fe.on(document,Ni,Ki.clearMenus),fe.on(document,$i,Mi,(function(t){t.preventDefault(),Ki.getOrCreateInstance(this).toggle()})),Qt(Ki);const Qi="backdrop",Xi="show",Ui=`mousedown.bs.${Qi}`,Gi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ji={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Zi extends be{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Gi}static get DefaultType(){return Ji}static get NAME(){return Qi}show(t){if(!this._config.isVisible)return void Xt(t);this._append();const e=this._getElement();this._config.isAnimated&&qt(e),e.classList.add(Xi),this._emulateAnimation((()=>{Xt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Xi),this._emulateAnimation((()=>{this.dispose(),Xt(t)}))):Xt(t)}dispose(){this._isAppended&&(fe.off(this._element,Ui),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=Ht(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),fe.on(t,Ui,(()=>{Xt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Ut(t,this._getElement(),this._config.isAnimated)}}const tn=".bs.focustrap",en=`focusin${tn}`,nn=`keydown.tab${tn}`,sn="backward",on={autofocus:!0,trapElement:null},rn={autofocus:"boolean",trapElement:"element"};class an extends be{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return on}static get DefaultType(){return rn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),fe.off(document,tn),fe.on(document,en,(t=>this._handleFocusin(t))),fe.on(document,nn,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,fe.off(document,tn))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=we.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===sn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?sn:"forward")}}const ln=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",cn=".sticky-top",hn="padding-right",dn="margin-right";class un{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,hn,(e=>e+t)),this._setElementAttributes(ln,hn,(e=>e+t)),this._setElementAttributes(cn,dn,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,hn),this._resetElementAttributes(ln,hn),this._resetElementAttributes(cn,dn)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&_e.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=_e.getDataAttribute(t,e);null!==i?(_e.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(Ft(t))e(t);else for(const i of we.find(t,this._element))e(i)}}const fn=".bs.modal",pn=`hide${fn}`,mn=`hidePrevented${fn}`,gn=`hidden${fn}`,_n=`show${fn}`,bn=`shown${fn}`,vn=`resize${fn}`,yn=`click.dismiss${fn}`,wn=`mousedown.dismiss${fn}`,En=`keydown.dismiss${fn}`,An=`click${fn}.data-api`,Tn="modal-open",Cn="show",On="modal-static",xn={backdrop:!0,focus:!0,keyboard:!0},kn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ln extends ve{constructor(t,e){super(t,e),this._dialog=we.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new un,this._addEventListeners()}static get Default(){return xn}static get DefaultType(){return kn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||fe.trigger(this._element,_n,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Tn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(fe.trigger(this._element,pn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Cn),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){fe.off(window,fn),fe.off(this._dialog,fn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Zi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new an({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=we.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),qt(this._element),this._element.classList.add(Cn),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,fe.trigger(this._element,bn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){fe.on(this._element,En,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),fe.on(window,vn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),fe.on(this._element,wn,(t=>{fe.one(this._element,yn,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(Tn),this._resetAdjustments(),this._scrollBar.reset(),fe.trigger(this._element,gn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(fe.trigger(this._element,mn).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(On)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(On),this._queueCallback((()=>{this._element.classList.remove(On),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=Kt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Kt()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ln.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}fe.on(document,An,'[data-bs-toggle="modal"]',(function(t){const e=we.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),fe.one(e,_n,(t=>{t.defaultPrevented||fe.one(e,gn,(()=>{Bt(this)&&this.focus()}))}));const i=we.findOne(".modal.show");i&&Ln.getInstance(i).hide(),Ln.getOrCreateInstance(e).toggle(this)})),Ee(Ln),Qt(Ln);const Sn=".bs.offcanvas",Dn=".data-api",$n=`load${Sn}${Dn}`,In="show",Nn="showing",Pn="hiding",Mn=".offcanvas.show",jn=`show${Sn}`,Fn=`shown${Sn}`,Hn=`hide${Sn}`,Bn=`hidePrevented${Sn}`,Wn=`hidden${Sn}`,zn=`resize${Sn}`,Rn=`click${Sn}${Dn}`,qn=`keydown.dismiss${Sn}`,Vn={backdrop:!0,keyboard:!0,scroll:!1},Yn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Kn extends ve{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Vn}static get DefaultType(){return Yn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||fe.trigger(this._element,jn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new un).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Nn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(In),this._element.classList.remove(Nn),fe.trigger(this._element,Fn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(fe.trigger(this._element,Hn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Pn),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(In,Pn),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new un).reset(),fe.trigger(this._element,Wn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Zi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():fe.trigger(this._element,Bn)}:null})}_initializeFocusTrap(){return new an({trapElement:this._element})}_addEventListeners(){fe.on(this._element,qn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():fe.trigger(this._element,Bn))}))}static jQueryInterface(t){return this.each((function(){const e=Kn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}fe.on(document,Rn,'[data-bs-toggle="offcanvas"]',(function(t){const e=we.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this))return;fe.one(e,Wn,(()=>{Bt(this)&&this.focus()}));const i=we.findOne(Mn);i&&i!==e&&Kn.getInstance(i).hide(),Kn.getOrCreateInstance(e).toggle(this)})),fe.on(window,$n,(()=>{for(const t of we.find(Mn))Kn.getOrCreateInstance(t).show()})),fe.on(window,zn,(()=>{for(const t of we.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Kn.getOrCreateInstance(t).hide()})),Ee(Kn),Qt(Kn);const Qn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Xn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Un=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Gn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Xn.has(i)||Boolean(Un.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Jn={allowList:Qn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
    "},Zn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ts={entry:"(string|element|function|null)",selector:"(string|element)"};class es extends be{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Jn}static get DefaultType(){return Zn}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},ts)}_setContent(t,e,i){const n=we.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?Ft(e)?this._putElementInTemplate(Ht(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Gn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return Xt(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const is=new Set(["sanitize","allowList","sanitizeFn"]),ns="fade",ss="show",os=".tooltip-inner",rs=".modal",as="hide.bs.modal",ls="hover",cs="focus",hs={AUTO:"auto",TOP:"top",RIGHT:Kt()?"left":"right",BOTTOM:"bottom",LEFT:Kt()?"right":"left"},ds={allowList:Qn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},us={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class fs extends ve{constructor(t,i){if(void 0===e)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return ds}static get DefaultType(){return us}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),fe.off(this._element.closest(rs),as,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=fe.trigger(this._element,this.constructor.eventName("show")),e=(zt(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),fe.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._queueCallback((()=>{fe.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!fe.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._activeTrigger.click=!1,this._activeTrigger[cs]=!1,this._activeTrigger[ls]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),fe.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ns,ss),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ns),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new es({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[os]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ns)}_isShown(){return this.tip&&this.tip.classList.contains(ss)}_createPopper(t){const e=Xt(this._config.placement,[this,t,this._element]),i=hs[e.toUpperCase()];return Dt(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return Xt(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...Xt(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)fe.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ls?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ls?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");fe.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?cs:ls]=!0,e._enter()})),fe.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?cs:ls]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},fe.on(this._element.closest(rs),as,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=_e.getDataAttributes(this._element);for(const t of Object.keys(e))is.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:Ht(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=fs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(fs);const ps=".popover-header",ms=".popover-body",gs={...fs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},_s={...fs.DefaultType,content:"(null|string|element|function)"};class bs extends fs{static get Default(){return gs}static get DefaultType(){return _s}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[ps]:this._getTitle(),[ms]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=bs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(bs);const vs=".bs.scrollspy",ys=`activate${vs}`,ws=`click${vs}`,Es=`load${vs}.data-api`,As="active",Ts="[href]",Cs=".nav-link",Os=`${Cs}, .nav-item > ${Cs}, .list-group-item`,xs={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},ks={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ls extends ve{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return xs}static get DefaultType(){return ks}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=Ht(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(fe.off(this._config.target,ws),fe.on(this._config.target,ws,Ts,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=we.find(Ts,this._config.target);for(const e of t){if(!e.hash||Wt(e))continue;const t=we.findOne(decodeURI(e.hash),this._element);Bt(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(As),this._activateParents(t),fe.trigger(this._element,ys,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))we.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(As);else for(const e of we.parents(t,".nav, .list-group"))for(const t of we.prev(e,Os))t.classList.add(As)}_clearActiveClass(t){t.classList.remove(As);const e=we.find(`${Ts}.${As}`,t);for(const t of e)t.classList.remove(As)}static jQueryInterface(t){return this.each((function(){const e=Ls.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(window,Es,(()=>{for(const t of we.find('[data-bs-spy="scroll"]'))Ls.getOrCreateInstance(t)})),Qt(Ls);const Ss=".bs.tab",Ds=`hide${Ss}`,$s=`hidden${Ss}`,Is=`show${Ss}`,Ns=`shown${Ss}`,Ps=`click${Ss}`,Ms=`keydown${Ss}`,js=`load${Ss}`,Fs="ArrowLeft",Hs="ArrowRight",Bs="ArrowUp",Ws="ArrowDown",zs="Home",Rs="End",qs="active",Vs="fade",Ys="show",Ks=".dropdown-toggle",Qs=`:not(${Ks})`,Xs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Us=`.nav-link${Qs}, .list-group-item${Qs}, [role="tab"]${Qs}, ${Xs}`,Gs=`.${qs}[data-bs-toggle="tab"], .${qs}[data-bs-toggle="pill"], .${qs}[data-bs-toggle="list"]`;class Js extends ve{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),fe.on(this._element,Ms,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?fe.trigger(e,Ds,{relatedTarget:t}):null;fe.trigger(t,Is,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(qs),this._activate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),fe.trigger(t,Ns,{relatedTarget:e})):t.classList.add(Ys)}),t,t.classList.contains(Vs)))}_deactivate(t,e){t&&(t.classList.remove(qs),t.blur(),this._deactivate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),fe.trigger(t,$s,{relatedTarget:e})):t.classList.remove(Ys)}),t,t.classList.contains(Vs)))}_keydown(t){if(![Fs,Hs,Bs,Ws,zs,Rs].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!Wt(t)));let i;if([zs,Rs].includes(t.key))i=e[t.key===zs?0:e.length-1];else{const n=[Hs,Ws].includes(t.key);i=Gt(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Js.getOrCreateInstance(i).show())}_getChildren(){return we.find(Us,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=we.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=we.findOne(t,i);s&&s.classList.toggle(n,e)};n(Ks,qs),n(".dropdown-menu",Ys),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(qs)}_getInnerElement(t){return t.matches(Us)?t:we.findOne(Us,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Js.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(document,Ps,Xs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this)||Js.getOrCreateInstance(this).show()})),fe.on(window,js,(()=>{for(const t of we.find(Gs))Js.getOrCreateInstance(t)})),Qt(Js);const Zs=".bs.toast",to=`mouseover${Zs}`,eo=`mouseout${Zs}`,io=`focusin${Zs}`,no=`focusout${Zs}`,so=`hide${Zs}`,oo=`hidden${Zs}`,ro=`show${Zs}`,ao=`shown${Zs}`,lo="hide",co="show",ho="showing",uo={animation:"boolean",autohide:"boolean",delay:"number"},fo={animation:!0,autohide:!0,delay:5e3};class po extends ve{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return fo}static get DefaultType(){return uo}static get NAME(){return"toast"}show(){fe.trigger(this._element,ro).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(lo),qt(this._element),this._element.classList.add(co,ho),this._queueCallback((()=>{this._element.classList.remove(ho),fe.trigger(this._element,ao),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(fe.trigger(this._element,so).defaultPrevented||(this._element.classList.add(ho),this._queueCallback((()=>{this._element.classList.add(lo),this._element.classList.remove(ho,co),fe.trigger(this._element,oo)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(co),super.dispose()}isShown(){return this._element.classList.contains(co)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){fe.on(this._element,to,(t=>this._onInteraction(t,!0))),fe.on(this._element,eo,(t=>this._onInteraction(t,!1))),fe.on(this._element,io,(t=>this._onInteraction(t,!0))),fe.on(this._element,no,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=po.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}function mo(t){"loading"!=document.readyState?t():document.addEventListener("DOMContentLoaded",t)}Ee(po),Qt(po),mo((function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new fs(t,{delay:{show:500,hide:100}})}))})),mo((function(){document.getElementById("pst-back-to-top").addEventListener("click",(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0}))})),mo((function(){var t=document.getElementById("pst-back-to-top"),e=document.getElementsByClassName("bd-header")[0].getBoundingClientRect();window.addEventListener("scroll",(function(){this.oldScroll>this.scrollY&&this.scrollY>e.bottom?t.style.display="block":t.style.display="none",this.oldScroll=this.scrollY}))})),window.bootstrap=i})(); +//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/spec/_static/scripts/bootstrap.js.LICENSE.txt b/spec/_static/scripts/bootstrap.js.LICENSE.txt new file mode 100644 index 0000000000..28755c2c5b --- /dev/null +++ b/spec/_static/scripts/bootstrap.js.LICENSE.txt @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ diff --git a/spec/_static/scripts/bootstrap.js.map b/spec/_static/scripts/bootstrap.js.map new file mode 100644 index 0000000000..e9e815891f --- /dev/null +++ b/spec/_static/scripts/bootstrap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/bootstrap.js","mappings":"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","sources":["webpack://pydata_sphinx_theme/webpack/bootstrap","webpack://pydata_sphinx_theme/webpack/runtime/define property getters","webpack://pydata_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://pydata_sphinx_theme/webpack/runtime/make namespace object","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/enums.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/math.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/within.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/createPopper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://pydata_sphinx_theme/./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/bootstrap.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/*!\n * Bootstrap v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n const instanceMap = elementMap.get(element);\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n instanceMap.set(key, instance);\n },\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n return null;\n },\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key);\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend';\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n }\n return selector;\n};\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n return prefix;\n};\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n }\n\n // Get transition-duration of the element\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n return typeof object.nodeType !== 'undefined';\n};\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object));\n }\n return null;\n};\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])');\n if (!closedDetails) {\n return elementIsVisible;\n }\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n if (summary === null) {\n return false;\n }\n }\n return elementIsVisible;\n};\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n if (element.classList.contains('disabled')) {\n return true;\n }\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n if (element instanceof ShadowRoot) {\n return element;\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null;\n }\n return findShadowRoot(element.parentNode);\n};\nconst noop = () => {};\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n return null;\n};\nconst DOMContentLoadedCallbacks = [];\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\nconst isRTL = () => document.documentElement.dir === 'rtl';\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;\n};\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement);\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n index += shouldGetNext ? 1 : -1;\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n return fn.apply(element, [event]);\n };\n}\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n hydrateObj(event, {\n delegateTarget: target\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n return fn.apply(target, [event]);\n }\n }\n };\n}\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string';\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n return [isDelegated, callable, typeEvent];\n}\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n callable = wrapFunction(callable);\n }\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n if (!fn) {\n return;\n }\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n const evt = hydrateObj(new Event(event, {\n bubbles,\n cancelable: true\n }), args);\n if (defaultPrevented) {\n evt.preventDefault();\n }\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n return evt;\n }\n};\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value;\n }\n });\n }\n }\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n if (value === Number(value).toString()) {\n return Number(value);\n }\n if (value === '' || value === 'null') {\n return null;\n }\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n return attributes;\n },\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n static get DefaultType() {\n return {};\n }\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n return config;\n }\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.3';\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n if (!element) {\n return;\n }\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n static get VERSION() {\n return VERSION;\n }\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href');\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n }\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;\n};\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n return parents;\n },\n prev(element, selector) {\n let previous = element.previousElementSibling;\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n previous = previous.previousElementSibling;\n }\n return [];\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n next = next.nextElementSibling;\n }\n return [];\n },\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n },\n getSelectorFromElement(element) {\n const selector = getSelector(element);\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null;\n }\n return null;\n },\n getElementFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.findOne(selector) : null;\n },\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.find(selector) : [];\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target);\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n if (closeEvent.defaultPrevented) {\n return;\n }\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n }\n\n // Private\n _destroyElement() {\n this._element.remove();\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close');\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n if (!element || !Swipe.isSupported()) {\n return;\n }\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n this._initEvents();\n }\n\n // Getters\n static get Default() {\n return Default$c;\n }\n static get DefaultType() {\n return DefaultType$c;\n }\n static get NAME() {\n return NAME$d;\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n this._handleSwipe();\n execute(this._config.endCallback);\n }\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n if (!direction) {\n return;\n }\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n this._addEventListeners();\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$b;\n }\n static get DefaultType() {\n return DefaultType$b;\n }\n static get NAME() {\n return NAME$c;\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT);\n }\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n prev() {\n this._slide(ORDER_PREV);\n }\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n this._clearInterval();\n }\n cycle() {\n this._clearInterval();\n this._updateInterval();\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n this.cycle();\n }\n to(index) {\n const items = this._getItems();\n if (index > items.length - 1 || index < 0) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n const activeIndex = this._getItemIndex(this._getActive());\n if (activeIndex === index) {\n return;\n }\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n this._slide(order, items[index]);\n }\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause();\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n const direction = KEY_TO_DIRECTION[event.key];\n if (direction) {\n event.preventDefault();\n this._slide(this._directionToOrder(direction));\n }\n }\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n if (!element) {\n return;\n }\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n const activeElement = this._getActive();\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n if (nextElement === activeElement) {\n return;\n }\n const nextElementIndex = this._getItemIndex(nextElement);\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n const slideEvent = triggerEvent(EVENT_SLIDE);\n if (slideEvent.defaultPrevented) {\n return;\n }\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return;\n }\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n this._setActiveIndicatorElement(nextElementIndex);\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n if (isCycling) {\n this.cycle();\n }\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n if (slideIndex) {\n carousel.to(slideIndex);\n carousel._maybeEnableCycle();\n return;\n }\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n carousel._maybeEnableCycle();\n return;\n }\n carousel.prev();\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n this._initializeChildren();\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n if (this._config.toggle) {\n this.toggle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$a;\n }\n static get DefaultType() {\n return DefaultType$a;\n }\n static get NAME() {\n return NAME$b;\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n let activeChildren = [];\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n const dimension = this._getDimension();\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.style[dimension] = 0;\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n this._queueCallback(complete, this._element, true);\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n const dimension = this._getDimension();\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger);\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n this._element.style[dimension] = '';\n this._queueCallback(complete, this._element, true);\n }\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n config.parent = getElement(config.parent);\n return config;\n }\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element);\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {};\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n }\n\n // Getters\n static get Default() {\n return Default$9;\n }\n static get DefaultType() {\n return DefaultType$9;\n }\n static get NAME() {\n return NAME$a;\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n if (showEvent.defaultPrevented) {\n return;\n }\n this._createPopper();\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n this._element.focus();\n this._element.setAttribute('aria-expanded', true);\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n this._element.classList.add(CLASS_NAME_SHOW$6);\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n this._completeHide(relatedTarget);\n }\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n super.dispose();\n }\n update() {\n this._inNavbar = this._detectNavbar();\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n if (this._popper) {\n this._popper.destroy();\n }\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n this._element.setAttribute('aria-expanded', 'false');\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n _getConfig(config) {\n config = super._getConfig(config);\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n return config;\n }\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n let referenceElement = this._element;\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n const popperConfig = this._getPopperConfig();\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n _getPlacement() {\n const parentDropdown = this._parent;\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n };\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n if (!items.length) {\n return;\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n if (!context || context._config.autoClose === false) {\n continue;\n }\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n const relatedTarget = {\n relatedTarget: context._element\n };\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n context._completeHide(relatedTarget);\n }\n }\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n if (isInput && !isEscapeEvent) {\n return;\n }\n event.preventDefault();\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n instance._selectMenuItem(event);\n return;\n }\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n};\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n }\n\n // Getters\n static get Default() {\n return Default$8;\n }\n static get DefaultType() {\n return DefaultType$8;\n }\n static get NAME() {\n return NAME$9;\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._append();\n const element = this._getElement();\n if (this._config.isAnimated) {\n reflow(element);\n }\n element.classList.add(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n dispose() {\n if (!this._isAppended) {\n return;\n }\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n this._element.remove();\n this._isAppended = false;\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n this._element = backdrop;\n }\n return this._element;\n }\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n _append() {\n if (this._isAppended) {\n return;\n }\n const element = this._getElement();\n this._config.rootElement.append(element);\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n};\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n }\n\n // Getters\n static get Default() {\n return Default$7;\n }\n static get DefaultType() {\n return DefaultType$7;\n }\n static get NAME() {\n return NAME$8;\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return;\n }\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n deactivate() {\n if (!this._isActive) {\n return;\n }\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n }\n\n // Private\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n const elements = SelectorEngine.focusableChildren(trapElement);\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n hide() {\n const width = this.getWidth();\n this._disableOverFlow();\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n isOverflowing() {\n return this.getWidth() > 0;\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n this._element.style.overflow = 'hidden';\n }\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n this._saveInitialAttribute(element, styleProperty);\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty);\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$6;\n }\n static get DefaultType() {\n return DefaultType$6;\n }\n static get NAME() {\n return NAME$7;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._isTransitioning = true;\n this._scrollBar.hide();\n document.body.classList.add(CLASS_NAME_OPEN);\n this._adjustDialog();\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._isShown = false;\n this._isTransitioning = true;\n this._focustrap.deactivate();\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n dispose() {\n EventHandler.off(window, EVENT_KEY$4);\n EventHandler.off(this._dialog, EVENT_KEY$4);\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n handleUpdate() {\n this._adjustDialog();\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n this._element.style.display = 'block';\n this._element.removeAttribute('aria-hidden');\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_SHOW$4);\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n return;\n }\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n _hideModal() {\n this._element.style.display = 'none';\n this._element.setAttribute('aria-hidden', true);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n this._isTransitioning = false;\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n this._resetAdjustments();\n this._scrollBar.reset();\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n if (hideEvent.defaultPrevented) {\n return;\n }\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY;\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n this._element.classList.add(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n this._element.focus();\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const scrollbarWidth = this._scrollBar.getWidth();\n const isBodyOverflowing = scrollbarWidth > 0;\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](relatedTarget);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n });\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$5;\n }\n static get DefaultType() {\n return DefaultType$5;\n }\n static get NAME() {\n return NAME$6;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._backdrop.show();\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n this._element.classList.add(CLASS_NAME_SHOW$3);\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n this._queueCallback(completeCallBack, this._element, true);\n }\n hide() {\n if (!this._isShown) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._focustrap.deactivate();\n this._element.blur();\n this._isShown = false;\n this._element.classList.add(CLASS_NAME_HIDING);\n this._backdrop.hide();\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n this._queueCallback(completeCallback, this._element, true);\n }\n dispose() {\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n this.hide();\n };\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n });\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n });\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\n// js-docs-end allow-list\n\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n }\n return true;\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
    '\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n }\n\n // Getters\n static get Default() {\n return Default$4;\n }\n static get DefaultType() {\n return DefaultType$4;\n }\n static get NAME() {\n return NAME$5;\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n hasContent() {\n return this.getContent().length > 0;\n }\n changeContent(content) {\n this._checkContent(content);\n this._config.content = {\n ...this._config.content,\n ...content\n };\n return this;\n }\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n const template = templateWrapper.children[0];\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n return template;\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n this._checkContent(config.content);\n }\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n if (!templateElement) {\n return;\n }\n content = this._resolvePossibleFunction(content);\n if (!content) {\n templateElement.remove();\n return;\n }\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n return;\n }\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n templateElement.textContent = content;\n }\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this]);\n }\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n templateElement.textContent = element.textContent;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
    ' + '
    ' + '
    ' + '
    ',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n }\n super(element, config);\n\n // Private\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null;\n\n // Protected\n this.tip = null;\n this._setListeners();\n if (!this._config.selector) {\n this._fixTitle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$3;\n }\n static get DefaultType() {\n return DefaultType$3;\n }\n static get NAME() {\n return NAME$4;\n }\n\n // Public\n enable() {\n this._isEnabled = true;\n }\n disable() {\n this._isEnabled = false;\n }\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n this._activeTrigger.click = !this._activeTrigger.click;\n if (this._isShown()) {\n this._leave();\n return;\n }\n this._enter();\n }\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n this._disposePopper();\n super.dispose();\n }\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper();\n const tip = this._getTipElement();\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n const {\n container\n } = this._config;\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n if (this._isHovered === false) {\n this._leave();\n }\n this._isHovered = false;\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n hide() {\n if (!this._isShown()) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n if (hideEvent.defaultPrevented) {\n return;\n }\n const tip = this._getTipElement();\n tip.classList.remove(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n if (!this._isHovered) {\n this._disposePopper();\n }\n this._element.removeAttribute('aria-describedby');\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n update() {\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n return this.tip;\n }\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml();\n\n // TODO: remove this check in v6\n if (!tip) {\n return null;\n }\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n return tip;\n }\n setContent(content) {\n this._newContent = content;\n if (this._isShown()) {\n this._disposePopper();\n this.show();\n }\n }\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n return this._templateFactory;\n }\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element]);\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element]);\n }\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n context._leave();\n });\n }\n }\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n _fixTitle() {\n const title = this._element.getAttribute('title');\n if (!title) {\n return;\n }\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title');\n }\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n this._isHovered = true;\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n this._isHovered = false;\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n return config;\n }\n _getDelegateConfig() {\n const config = {};\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value;\n }\n }\n config.selector = false;\n config.trigger = 'manual';\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config;\n }\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
    ' + '
    ' + '

    ' + '
    ' + '
    ',\n trigger: 'click'\n};\nconst DefaultType$2 = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n static get DefaultType() {\n return DefaultType$2;\n }\n static get NAME() {\n return NAME$3;\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent();\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n }\n\n // Getters\n static get Default() {\n return Default$1;\n }\n static get DefaultType() {\n return DefaultType$1;\n }\n static get NAME() {\n return NAME$2;\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables();\n this._maybeEnableSmoothScroll();\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n dispose() {\n this._observer.disconnect();\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body;\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n return config;\n }\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height;\n }\n });\n }\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n this._process(targetElement(entry));\n };\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n this._clearActiveClass(targetElement(entry));\n continue;\n }\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry);\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return;\n }\n continue;\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor);\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n this._clearActiveClass(this._config.target);\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n this._activateParents(target);\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both