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-04fe0dce45e5423fb77be0830c5b5eb9.json b/bench/devcloud/dr-bench-04fe0dce45e5423fb77be0830c5b5eb9.json new file mode 100644 index 0000000000..b06b49edbe --- /dev/null +++ b/bench/devcloud/dr-bench-04fe0dce45e5423fb77be0830c5b5eb9.json @@ -0,0 +1,181 @@ +{ + "context": { + "date": "2023-10-31T05:01:29-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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": [159.052,85.9077,37.209], + "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-04\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.7978313130627744e+03, + "cpu_time": 1.7905804189999994e+03, + "time_unit": "ms", + "bytes_per_second": 2.2249028431847839e+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.0076330689902679e+03, + "cpu_time": 6.9950053070000031e+03, + "time_unit": "ms", + "bytes_per_second": 2.2832245699053769e+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.2452910416083550e+04, + "cpu_time": 1.2418263469000003e+04, + "time_unit": "ms", + "bytes_per_second": 6.4242010363036125e+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.2384924859263374e+03, + "cpu_time": 4.6886040000018170e+00, + "time_unit": "ms", + "bytes_per_second": 1.8874635325091467e+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.2453396200018660e+03, + "cpu_time": 4.6426700000026244e+00, + "time_unit": "ms", + "bytes_per_second": 1.8844193200252100e+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.0617548718986936e+03, + "cpu_time": 5.7182969999942657e+00, + "time_unit": "ms", + "bytes_per_second": 1.9796247544799350e+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.0671123500687827e+03, + "cpu_time": 5.5145199999913075e+00, + "time_unit": "ms", + "bytes_per_second": 1.9778766747024152e+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": 3.9138690995083285e+04, + "cpu_time": 8.7332619999926919e+00, + "time_unit": "ms", + "bytes_per_second": 5.1100329345486938e+10, + "footprint": 4.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-0694e27085d246ff9463f96e1ab972c8.json b/bench/devcloud/dr-bench-0694e27085d246ff9463f96e1ab972c8.json new file mode 100644 index 0000000000..78104ed178 --- /dev/null +++ b/bench/devcloud/dr-bench-0694e27085d246ff9463f96e1ab972c8.json @@ -0,0 +1,182 @@ +{ + "context": { + "date": "2023-10-31T05:04:53-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3678, + "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.499,95.8618,50.3672], + "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-04\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.1871466289732032e+03, + "cpu_time": 9.3333323000000053e+02, + "time_unit": "ms", + "bytes_per_second": 3.3694237109191083e+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": 3.7672364639460725e+03, + "cpu_time": 3.5532333359999980e+03, + "time_unit": "ms", + "bytes_per_second": 4.2471451296265210e+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": 8.8593524070890981e+03, + "cpu_time": 6.0164584209999957e+03, + "time_unit": "ms", + "bytes_per_second": 9.0300053913630768e+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.4251988441005383e+03, + "cpu_time": 9.5078270000001908e+00, + "time_unit": "ms", + "bytes_per_second": 3.2986985869057898e+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.3266668430710079e+03, + "cpu_time": 1.0674969000000090e+01, + "time_unit": "ms", + "bytes_per_second": 3.4383951547788684e+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": 3.2403367679059802e+03, + "cpu_time": 9.6526540000070327e+00, + "time_unit": "ms", + "bytes_per_second": 3.7033187781141718e+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": 3.2452616419071296e+03, + "cpu_time": 1.0388424999995038e+01, + "time_unit": "ms", + "bytes_per_second": 3.6976987756672864e+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": 1.9433135508965002e+04, + "cpu_time": 1.2104872999998406e+01, + "time_unit": "ms", + "bytes_per_second": 1.0291699963072603e+11, + "footprint": 2.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-0e6209137f3440d1923f6174facb829f.json b/bench/devcloud/dr-bench-0e6209137f3440d1923f6174facb829f.json new file mode 100644 index 0000000000..fd6aede4e0 --- /dev/null +++ b/bench/devcloud/dr-bench-0e6209137f3440d1923f6174facb829f.json @@ -0,0 +1,229 @@ +{ + "context": { + "date": "2023-10-31T05:14:40-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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": [99.6821,111.203,82.478], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "CPU", + "hostname": "idc-beta-batch-pvc-node-04\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.0117237669144563e+03, + "cpu_time": 2.0116808679999999e+03, + "time_unit": "ms", + "bytes_per_second": 1.9883445559402640e+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.4339065229134640e+03, + "cpu_time": 7.4338276939999978e+03, + "time_unit": "ms", + "bytes_per_second": 2.1523004023097873e+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.3589903918040607e+04, + "cpu_time": 1.3588847763000003e+04, + "time_unit": "ms", + "bytes_per_second": 5.8867230027873817e+10, + "footprint": 2.8571428500000000e+08 + }, + { + "name": "Exclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Exclusive_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.1963633217111668e+04, + "cpu_time": 1.1963444160999998e+04, + "time_unit": "ms", + "bytes_per_second": 6.6869318498978584e+10, + "footprint": 2.8571428500000000e+08 + }, + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "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.3735087479034164e+03, + "cpu_time": 4.3734278689999965e+03, + "time_unit": "ms", + "bytes_per_second": 1.8291949236034018e+11, + "footprint": 2.8571428500000000e+08 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "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.3615809408926470e+03, + "cpu_time": 4.3612740710000107e+03, + "time_unit": "ms", + "bytes_per_second": 1.8341973033206415e+11, + "footprint": 2.8571428500000000e+08 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 6, + "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.2452461728959152e+03, + "cpu_time": 6.2450106619999988e+03, + "time_unit": "ms", + "bytes_per_second": 1.9214614873116541e+11, + "footprint": 4.2857142800000000e+08 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 7, + "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.2902480060317330e+03, + "cpu_time": 6.2899641849999880e+03, + "time_unit": "ms", + "bytes_per_second": 1.9077149245138144e+11, + "footprint": 4.2857142800000000e+08 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 8, + "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.9324057502942236e+04, + "cpu_time": 1.9323180788000001e+04, + "time_unit": "ms", + "bytes_per_second": 1.8814780129102933e+11, + "flops": 3.4928428457493067e+08, + "footprint": 6.4281805700000000e+08 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 9, + "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.1988927890077766e+03, + "cpu_time": 2.1988624390000095e+03, + "time_unit": "ms", + "bytes_per_second": 1.4555107079341470e+11, + "footprint": 5.7152000000000000e+08 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 10, + "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.2172370723935848e+04, + "cpu_time": 1.2171941793999991e+04, + "time_unit": "ms", + "bytes_per_second": 1.6430653036776013e+11, + "footprint": 7.1428571400000000e+08 + } + ] +} diff --git a/bench/devcloud/dr-bench-2554436e40544ce181784e408b6d2a74.json b/bench/devcloud/dr-bench-2554436e40544ce181784e408b6d2a74.json new file mode 100644 index 0000000000..5ceefe47ee --- /dev/null +++ b/bench/devcloud/dr-bench-2554436e40544ce181784e408b6d2a74.json @@ -0,0 +1,150 @@ +{ + "context": { + "date": "2023-10-31T04:36:01-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3616, + "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.604,1.75977,1.15918], + "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-04\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.7708809400859855e+02, + "cpu_time": 2.7664135300000049e+02, + "time_unit": "ms", + "bytes_per_second": 1.4435842197809744e+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.1756916199334555e+03, + "cpu_time": 1.1756798740000002e+03, + "time_unit": "ms", + "bytes_per_second": 1.3609010839854080e+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.5891516349264866e+03, + "cpu_time": 2.5855671220000004e+03, + "time_unit": "ms", + "bytes_per_second": 3.0898151703761230e+11, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "Exclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Exclusive_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.4827663900084026e+04, + "cpu_time": 2.4818037067000005e+04, + "time_unit": "ms", + "bytes_per_second": 3.2222121389249695e+10, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "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.4560296200316734e+03, + "cpu_time": 4.3952285240000037e+03, + "time_unit": "ms", + "bytes_per_second": 8.1592342089821143e+11, + "flops": 1.5147093209744024e+09, + "footprint": 1.7998905600000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "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.6091336993934033e+02, + "cpu_time": 2.6022170100000608e+02, + "time_unit": "ms", + "bytes_per_second": 1.2264607217115654e+12, + "footprint": 1.6000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-279f39a47d984279ae309b37b1d59511.json b/bench/devcloud/dr-bench-279f39a47d984279ae309b37b1d59511.json new file mode 100644 index 0000000000..825f83f496 --- /dev/null +++ b/bench/devcloud/dr-bench-279f39a47d984279ae309b37b1d59511.json @@ -0,0 +1,150 @@ +{ + "context": { + "date": "2023-10-31T04:39:57-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3759, + "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.63672,2.48389,1.56982], + "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-04\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.4976771698440098e+02, + "cpu_time": 5.4976791099999912e+02, + "time_unit": "ms", + "bytes_per_second": 7.2758000814251074e+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.3082557659514355e+03, + "cpu_time": 2.3081360239999995e+03, + "time_unit": "ms", + "bytes_per_second": 6.9316408675383472e+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.1649675299560404e+03, + "cpu_time": 4.1643327099999970e+03, + "time_unit": "ms", + "bytes_per_second": 1.9207832816128668e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Exclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Exclusive_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": 7.3670920269295775e+03, + "cpu_time": 7.3655070619999988e+03, + "time_unit": "ms", + "bytes_per_second": 1.0859101489104384e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "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.6032920639417243e+03, + "cpu_time": 8.5754990530000014e+03, + "time_unit": "ms", + "bytes_per_second": 4.2260322027638043e+11, + "flops": 7.8453568120615172e+08, + "footprint": 3.5997811200000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "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.0735900592052008e+02, + "cpu_time": 5.0735225500000070e+02, + "time_unit": "ms", + "bytes_per_second": 6.3071709827918054e+11, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-2a37307f769d4320ada0a24ad8be81c8.json b/bench/devcloud/dr-bench-2a37307f769d4320ada0a24ad8be81c8.json new file mode 100644 index 0000000000..8e7338dbba --- /dev/null +++ b/bench/devcloud/dr-bench-2a37307f769d4320ada0a24ad8be81c8.json @@ -0,0 +1,181 @@ +{ + "context": { + "date": "2023-10-31T04:56:03-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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": [1.37109,2.62256,2.34766], + "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-04\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.7955205740250876e+03, + "cpu_time": 1.7816057050000004e+03, + "time_unit": "ms", + "bytes_per_second": 2.2277661742594495e+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.0054520900198504e+03, + "cpu_time": 6.9885207339999979e+03, + "time_unit": "ms", + "bytes_per_second": 2.2839353969451904e+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.2436713836090750e+04, + "cpu_time": 1.2404585387000005e+04, + "time_unit": "ms", + "bytes_per_second": 6.4325674011927345e+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.2314861930642082e+03, + "cpu_time": 6.8530040000069903e+00, + "time_unit": "ms", + "bytes_per_second": 1.8905887045342908e+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.2396173539890515e+03, + "cpu_time": 5.1958999999897060e+00, + "time_unit": "ms", + "bytes_per_second": 1.8869627449922595e+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.0504895100040949e+03, + "cpu_time": 5.8172849999920118e+00, + "time_unit": "ms", + "bytes_per_second": 1.9833106032427249e+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.0553150151149093e+03, + "cpu_time": 5.8350780000040459e+00, + "time_unit": "ms", + "bytes_per_second": 1.9817300949738089e+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": 3.9210197831963029e+04, + "cpu_time": 1.0887943000000178e+01, + "time_unit": "ms", + "bytes_per_second": 5.1007138718633484e+10, + "footprint": 4.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-32edf2c5c3ae43c3ab2db83e3453a931.json b/bench/devcloud/dr-bench-32edf2c5c3ae43c3ab2db83e3453a931.json new file mode 100644 index 0000000000..f0a0df3fcb --- /dev/null +++ b/bench/devcloud/dr-bench-32edf2c5c3ae43c3ab2db83e3453a931.json @@ -0,0 +1,133 @@ +{ + "context": { + "date": "2023-10-31T04:31:43-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3080, + "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.61328,1.80518,0.972168], + "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-04\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.3230575504832996e+02, + "cpu_time": 4.4640519999994410e+00, + "time_unit": "ms", + "bytes_per_second": 8.5808759161690332e+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.3852320698670542e+02, + "cpu_time": 4.2695149999989468e+00, + "time_unit": "ms", + "bytes_per_second": 8.5240300297798853e+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.5097807340997476e+03, + "cpu_time": 4.0050749999984703e+00, + "time_unit": "ms", + "bytes_per_second": 7.9481740155833704e+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.5093573250447753e+03, + "cpu_time": 3.9269009999998161e+00, + "time_unit": "ms", + "bytes_per_second": 7.9504036591494446e+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.4772545630723935e+03, + "cpu_time": 4.5896949999999492e+00, + "time_unit": "ms", + "bytes_per_second": 8.0734536927021228e+11, + "footprint": 4.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-342c61c100fd47b7b449efa19634f514.json b/bench/devcloud/dr-bench-342c61c100fd47b7b449efa19634f514.json new file mode 100644 index 0000000000..66cc095df4 --- /dev/null +++ b/bench/devcloud/dr-bench-342c61c100fd47b7b449efa19634f514.json @@ -0,0 +1,150 @@ +{ + "context": { + "date": "2023-10-31T04:37:44-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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": [1.96387,1.84961,1.25928], + "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-04\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.8609300692159053e+02, + "cpu_time": 1.8601923800000009e+02, + "time_unit": "ms", + "bytes_per_second": 2.1494628230094548e+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.8114925089764517e+02, + "cpu_time": 7.8113932599999987e+02, + "time_unit": "ms", + "bytes_per_second": 2.0482641417902988e+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.7413906649790479e+03, + "cpu_time": 1.7382920469999981e+03, + "time_unit": "ms", + "bytes_per_second": 4.5940294506495789e+11, + "footprint": 5.3333333330000000e+09 + }, + { + "name": "Exclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Exclusive_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.7793344171918958e+04, + "cpu_time": 1.7782417974000004e+04, + "time_unit": "ms", + "bytes_per_second": 4.4960632035800301e+10, + "footprint": 5.3333333330000000e+09 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "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.2404321179914446e+03, + "cpu_time": 3.1787441440000066e+03, + "time_unit": "ms", + "bytes_per_second": 1.1220043496709963e+12, + "flops": 2.0829288669634833e+09, + "footprint": 1.1999270400000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "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.7701418311501953e+02, + "cpu_time": 1.7630340899999908e+02, + "time_unit": "ms", + "bytes_per_second": 1.8077737860817102e+12, + "footprint": 1.0666720000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-42df376b35054289bab9f1abda053056.json b/bench/devcloud/dr-bench-42df376b35054289bab9f1abda053056.json new file mode 100644 index 0000000000..f7331217ef --- /dev/null +++ b/bench/devcloud/dr-bench-42df376b35054289bab9f1abda053056.json @@ -0,0 +1,133 @@ +{ + "context": { + "date": "2023-10-31T04:53:46-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3801, + "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.14502,3.53711,2.55957], + "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-04\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.4986457490345049e+02, + "cpu_time": 5.4972819900000047e+02, + "time_unit": "ms", + "bytes_per_second": 7.2745184588447998e+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.3533089000122018e+03, + "cpu_time": 2.3523412420000013e+03, + "time_unit": "ms", + "bytes_per_second": 6.7989374450234900e+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.1622602760459959e+03, + "cpu_time": 4.1611125390000016e+03, + "time_unit": "ms", + "bytes_per_second": 1.9220326143562857e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Exclusive_Scan_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Exclusive_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": 7.4117796239350691e+03, + "cpu_time": 7.3978516230000014e+03, + "time_unit": "ms", + "bytes_per_second": 1.0793629068739948e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "BlackScholes_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "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.5502650939686855e+03, + "cpu_time": 2.5501492210000051e+03, + "time_unit": "ms", + "bytes_per_second": 7.8423219795069592e+11, + "footprint": 4.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-503be65c52ee454ea31eb63b817e1398.json b/bench/devcloud/dr-bench-503be65c52ee454ea31eb63b817e1398.json new file mode 100644 index 0000000000..51a6af1a4c --- /dev/null +++ b/bench/devcloud/dr-bench-503be65c52ee454ea31eb63b817e1398.json @@ -0,0 +1,150 @@ +{ + "context": { + "date": "2023-10-31T04:46:38-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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.44287,2.41016,1.82422], + "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-04\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.5653132910895636e+02, + "cpu_time": 5.5645355500000096e+02, + "time_unit": "ms", + "bytes_per_second": 2.1562128441561050e+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.3272017318922058e+03, + "cpu_time": 2.3271942879999942e+03, + "time_unit": "ms", + "bytes_per_second": 2.0625629201887913e+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.1589509729148322e+03, + "cpu_time": 5.1496117400000048e+03, + "time_unit": "ms", + "bytes_per_second": 4.6521085635438562e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Exclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Exclusive_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.3136411373889830e+04, + "cpu_time": 5.3124163646000001e+04, + "time_unit": "ms", + "bytes_per_second": 4.5166768660996025e+10, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "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.9905916420874582e+03, + "cpu_time": 8.8778965449999996e+03, + "time_unit": "ms", + "bytes_per_second": 1.2131534490555054e+12, + "flops": 2.2521413039396758e+09, + "footprint": 3.5996591616000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "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.1428111794586584e+02, + "cpu_time": 5.1223475300000132e+02, + "time_unit": "ms", + "bytes_per_second": 1.8666833498270713e+12, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-5e60d1cec3d94f06a046a15612515384.json b/bench/devcloud/dr-bench-5e60d1cec3d94f06a046a15612515384.json new file mode 100644 index 0000000000..1f3a756f53 --- /dev/null +++ b/bench/devcloud/dr-bench-5e60d1cec3d94f06a046a15612515384.json @@ -0,0 +1,102 @@ +{ + "context": { + "date": "2023-10-31T05:09:34-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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": [111.786,114.167,70.6401], + "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-04\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": "Exclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Exclusive_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.4974819407898309e+04, + "cpu_time": 1.4921132721000000e+04, + "time_unit": "ms", + "bytes_per_second": 5.3423014876429733e+10, + "footprint": 8.0000000000000000e+09 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "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.4194651772888283e+04, + "cpu_time": 1.3908416821999999e+04, + "time_unit": "ms", + "bytes_per_second": 2.5613724023468616e+11, + "flops": 4.7550230241587776e+08, + "footprint": 1.7998905600000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "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.5908807239869757e+03, + "cpu_time": 1.5812418739999998e+03, + "time_unit": "ms", + "bytes_per_second": 2.0114644371203015e+11, + "footprint": 1.6000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-6735bd59ad7243889436b5aeb3c798dd.json b/bench/devcloud/dr-bench-6735bd59ad7243889436b5aeb3c798dd.json new file mode 100644 index 0000000000..1e4ecc93e4 --- /dev/null +++ b/bench/devcloud/dr-bench-6735bd59ad7243889436b5aeb3c798dd.json @@ -0,0 +1,136 @@ +{ + "context": { + "date": "2023-10-31T04:31:34-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "shp/shp-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": [2.91406,1.83301,0.97168], + "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-04\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.3353984310769630e+02, + "cpu_time": 1.9545850000000087e+00, + "time_unit": "ms", + "bytes_per_second": 3.4255396824561626e+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.3349585906944003e+02, + "cpu_time": 1.8216949999998455e+00, + "time_unit": "ms", + "bytes_per_second": 3.4261849575759951e+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.6916152306169056e+02, + "cpu_time": 1.9785020000000486e+00, + "time_unit": "ms", + "bytes_per_second": 3.2506096248808359e+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.6283208399757387e+02, + "cpu_time": 2.4538899999999586e+00, + "time_unit": "ms", + "bytes_per_second": 3.3073150168495684e+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.2815279803084991e+02, + "cpu_time": 5.9118360000001147e+00, + "time_unit": "ms", + "bytes_per_second": 3.1839386949634756e+12, + "footprint": 1.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-6b01622a99bb426a90ca47ea70dd1625.json b/bench/devcloud/dr-bench-6b01622a99bb426a90ca47ea70dd1625.json new file mode 100644 index 0000000000..d8ccae7a76 --- /dev/null +++ b/bench/devcloud/dr-bench-6b01622a99bb426a90ca47ea70dd1625.json @@ -0,0 +1,150 @@ +{ + "context": { + "date": "2023-10-31T04:41:42-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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": [1.521,2.06787,1.51562], + "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-04\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.5665258589949860e+02, + "cpu_time": 5.5665300199999911e+02, + "time_unit": "ms", + "bytes_per_second": 1.4371621012184370e+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.3208737039722250e+03, + "cpu_time": 2.3208598160000024e+03, + "time_unit": "ms", + "bytes_per_second": 1.3787910968714631e+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.1557039639590548e+03, + "cpu_time": 5.1473834080000033e+03, + "time_unit": "ms", + "bytes_per_second": 3.1033589422216614e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Exclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Exclusive_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.4535687873591122e+05, + "cpu_time": 1.4534406094200004e+05, + "time_unit": "ms", + "bytes_per_second": 1.1007391008353506e+10, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "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.1043243459836303e+03, + "cpu_time": 9.0115927299999603e+03, + "time_unit": "ms", + "bytes_per_second": 7.9870208398889941e+11, + "flops": 1.4827390173061252e+09, + "footprint": 3.5998231824000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "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.1305719708779804e+02, + "cpu_time": 5.1213395299998865e+02, + "time_unit": "ms", + "bytes_per_second": 1.2474242708858806e+12, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-7ac8df8beb12407ab7f1ca6a2e42d282.json b/bench/devcloud/dr-bench-7ac8df8beb12407ab7f1ca6a2e42d282.json new file mode 100644 index 0000000000..f3973c756d --- /dev/null +++ b/bench/devcloud/dr-bench-7ac8df8beb12407ab7f1ca6a2e42d282.json @@ -0,0 +1,69 @@ +{ + "context": { + "date": "2023-10-31T05:14:25-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3097, + "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": [101.937,112.14,82.3027], + "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-04\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.1030393828997071e+03, + "cpu_time": 3.0993765369999996e+03, + "time_unit": "ms", + "bytes_per_second": 1.0312469824374855e+11, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-7d1dd46f1cce4f5ab9452101169b9f36.json b/bench/devcloud/dr-bench-7d1dd46f1cce4f5ab9452101169b9f36.json new file mode 100644 index 0000000000..ea331b9d8a --- /dev/null +++ b/bench/devcloud/dr-bench-7d1dd46f1cce4f5ab9452101169b9f36.json @@ -0,0 +1,102 @@ +{ + "context": { + "date": "2023-10-31T05:07:19-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3794, + "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": [186.667,123.629,66.6143], + "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-04\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": "Exclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "Exclusive_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.6385169194889048e+04, + "cpu_time": 2.6322206447999997e+04, + "time_unit": "ms", + "bytes_per_second": 3.0320063293547665e+10, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 1, + "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.7735577902997880e+04, + "cpu_time": 2.7454612468000007e+04, + "time_unit": "ms", + "bytes_per_second": 1.3108718858917361e+11, + "flops": 2.4335492931158468e+08, + "footprint": 3.5997811200000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 2, + "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.1728942270259113e+03, + "cpu_time": 3.1699624160000039e+03, + "time_unit": "ms", + "bytes_per_second": 1.0085429172971506e+11, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-9a90aec6600e40799d71508e38491029.json b/bench/devcloud/dr-bench-9a90aec6600e40799d71508e38491029.json new file mode 100644 index 0000000000..a5dfcc5786 --- /dev/null +++ b/bench/devcloud/dr-bench-9a90aec6600e40799d71508e38491029.json @@ -0,0 +1,133 @@ +{ + "context": { + "date": "2023-10-31T04:30:46-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3794, + "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.41455,1.9873,0.966797], + "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-04\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.3117298609351144e+02, + "cpu_time": 4.0140619999999849e+00, + "time_unit": "ms", + "bytes_per_second": 8.5913145242345056e+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.3528206502288913e+02, + "cpu_time": 4.1114789999998624e+00, + "time_unit": "ms", + "bytes_per_second": 8.5535693446706006e+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.4595700000684897e+03, + "cpu_time": 4.0435140000001368e+00, + "time_unit": "ms", + "bytes_per_second": 8.2215995117993005e+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.4889187670178649e+03, + "cpu_time": 4.0454450000000364e+00, + "time_unit": "ms", + "bytes_per_second": 8.0595397585286914e+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.4588527741150151e+03, + "cpu_time": 4.1245410000001481e+00, + "time_unit": "ms", + "bytes_per_second": 8.1338745493610767e+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..859567d075 --- /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 +10,BlackScholes_DR,BlackScholes,MHP_DIRECT_CPU,56,strong,0.16430653036776013,164.30653036776013,MHP,DIRECT,CPU,2000000000,56,56,1.0,12172.370723935848 +21,BlackScholes_DR,BlackScholes,MHP_DIRECT_CPU,112,strong,0.3207020105490032,320.70201054900326,MHP,DIRECT,CPU,2000000000,112,112,2.0,6236.318869894956 +165,BlackScholes_DR,BlackScholes,MHP_SYCL_CPU,1,strong,0.051007138718633487,51.007138718633485,MHP,SYCL,CPU,2000000000,1,56,1.0,39210.19783196303 +31,BlackScholes_DR,BlackScholes,MHP_SYCL_CPU,2,strong,0.10735763630315488,107.35763630315488,MHP,SYCL,CPU,2000000000,2,112,2.0,18629.322224945696 +135,BlackScholes_Reference,BlackScholes,Reference_CPU,1,strong,0.05122327520332435,51.22327520332435,SHP,SYCL,CPU,2000000000,1,56,1.0,39044.75049791821 +82,BlackScholes_DR,BlackScholes,SHP_SYCL_CPU,1,strong,0.05110032934548694,51.10032934548694,SHP,SYCL,CPU,2000000000,1,56,1.0,39138.690995083285 +118,BlackScholes_DR,BlackScholes,SHP_SYCL_CPU,2,strong,0.10291699963072602,102.91699963072602,SHP,SYCL,CPU,2000000000,2,112,2.0,19433.135508965002 diff --git a/bench/devcloud/dr-bench-BlackScholes-CPU.png b/bench/devcloud/dr-bench-BlackScholes-CPU.png new file mode 100644 index 0000000000..db8fc4efe8 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..7c47135c6b --- /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 +45,BlackScholes_DR,BlackScholes,MHP_SYCL_GPU,1,strong,0.8073453692702123,807.3453692702122,MHP,SYCL,GPU,2000000000,1,56,1.0,2477.2545630723935 +110,BlackScholes_DR,BlackScholes,MHP_SYCL_GPU,2,strong,1.5912493861062327,1591.2493861062326,MHP,SYCL,GPU,2000000000,2,112,2.0,1256.8740119950494 +53,BlackScholes_DR,BlackScholes,MHP_SYCL_GPU,3,strong,2.526703037712649,2526.703037712649,MHP,SYCL,GPU,2000000000,3,168,3.0,791.5453340375694 +151,BlackScholes_DR,BlackScholes,MHP_SYCL_GPU,4,strong,3.1195174967087764,3119.5174967087764,MHP,SYCL,GPU,2000000000,4,224,4.0,641.1247900068153 +63,BlackScholes_Reference,BlackScholes,Reference_GPU,1,strong,0.7842321979506959,784.2321979506959,SHP,SYCL,GPU,2000000000,1,56,1.0,2550.2650939686855 +68,BlackScholes_DR,BlackScholes,SHP_SYCL_GPU,1,strong,0.8133874549361076,813.3874549361077,SHP,SYCL,GPU,2000000000,1,56,1.0,2458.852774115015 +105,BlackScholes_DR,BlackScholes,SHP_SYCL_GPU,2,strong,1.6620804948112498,1662.0804948112498,SHP,SYCL,GPU,2000000000,2,112,2.0,1203.3111550515641 +140,BlackScholes_DR,BlackScholes,SHP_SYCL_GPU,3,strong,2.447678099482442,2447.678099482442,SHP,SYCL,GPU,2000000000,3,168,3.0,817.1009089891751 +58,BlackScholes_DR,BlackScholes,SHP_SYCL_GPU,4,strong,3.1839386949634756,3183.9386949634754,SHP,SYCL,GPU,2000000000,4,224,4.0,628.1527980308499 diff --git a/bench/devcloud/dr-bench-BlackScholes-GPU.png b/bench/devcloud/dr-bench-BlackScholes-GPU.png new file mode 100644 index 0000000000..052e102c2d 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..bb32e39fa7 --- /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 +1,DotProduct_DR,DotProduct,MHP_DIRECT_CPU,56,strong,0.21523004023097872,215.23004023097872,MHP,DIRECT,CPU,2000000000,56,56,1.0,7433.906522913464 +12,DotProduct_DR,DotProduct,MHP_DIRECT_CPU,112,strong,0.43076132146459944,430.7613214645994,MHP,DIRECT,CPU,2000000000,112,112,2.0,3714.353913113553 +159,DotProduct_DR,DotProduct,MHP_SYCL_CPU,1,strong,0.22839353969451903,228.39353969451903,MHP,SYCL,CPU,2000000000,1,56,1.0,7005.45209001985 +25,DotProduct_DR,DotProduct,MHP_SYCL_CPU,2,strong,0.44740516365075506,447.40516365075507,MHP,SYCL,CPU,2000000000,2,112,2.0,3576.176874992354 +132,DotProduct_Reference,DotProduct,Reference_CPU,1,strong,0.22853050793171178,228.53050793171178,SHP,SYCL,CPU,2000000000,1,56,1.0,7001.253418988169 +76,DotProduct_DR,DotProduct,SHP_SYCL_CPU,1,strong,0.2283224569905377,228.3224569905377,SHP,SYCL,CPU,2000000000,1,56,1.0,7007.633068990268 +112,DotProduct_DR,DotProduct,SHP_SYCL_CPU,2,strong,0.4247145129626521,424.7145129626521,SHP,SYCL,CPU,2000000000,2,112,2.0,3767.2364639460725 diff --git a/bench/devcloud/dr-bench-DotProduct-CPU.png b/bench/devcloud/dr-bench-DotProduct-CPU.png new file mode 100644 index 0000000000..3f88f6ebf8 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..8b4fa4c142 --- /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 +84,DotProduct_DR,DotProduct,MHP_SYCL_GPU,1,weak,0.6931640867538347,693.1640867538347,MHP,SYCL,GPU,2000000000,1,56,1.0,2308.2557659514355 +126,DotProduct_DR,DotProduct,MHP_SYCL_GPU,1,strong,0.6909799322629279,690.9799322629278,MHP,SYCL,GPU,2000000000,1,56,1.0,2315.552051938864 +33,DotProduct_DR,DotProduct,MHP_SYCL_GPU,2,weak,1.3787910968714632,1378.7910968714632,MHP,SYCL,GPU,4000000000,2,112,2.0,2320.873703972225 +153,DotProduct_DR,DotProduct,MHP_SYCL_GPU,2,strong,1.3609010839854079,1360.901083985408,MHP,SYCL,GPU,2000000000,2,112,2.0,1175.6916199334555 +120,DotProduct_DR,DotProduct,MHP_SYCL_GPU,3,weak,2.062562920188791,2062.5629201887914,MHP,SYCL,GPU,6000000000,3,168,3.0,2327.2017318922058 +142,DotProduct_DR,DotProduct,MHP_SYCL_GPU,3,strong,2.0482641417902987,2048.2641417902987,MHP,SYCL,GPU,2000000000,3,168,3.0,781.1492508976452 +70,DotProduct_DR,DotProduct,MHP_SYCL_GPU,4,weak,2.7504202700246996,2750.4202700246997,MHP,SYCL,GPU,8000000000,4,224,4.0,2326.917115086025 +95,DotProduct_DR,DotProduct,MHP_SYCL_GPU,4,strong,2.7020614518547217,2702.061451854722,MHP,SYCL,GPU,2000000000,4,224,4.0,592.1404929194871 +60,DotProduct_Reference,DotProduct,Reference_GPU,1,strong,0.679893744502349,679.893744502349,SHP,SYCL,GPU,2000000000,1,56,1.0,2353.308900012202 +91,DotProduct_DR,DotProduct,SHP_SYCL_GPU,1,strong,0.6893020652494869,689.302065249487,SHP,SYCL,GPU,2000000000,1,56,1.0,2321.188460999161 diff --git a/bench/devcloud/dr-bench-DotProduct-GPU.png b/bench/devcloud/dr-bench-DotProduct-GPU.png new file mode 100644 index 0000000000..919fa4e65f Binary files /dev/null and b/bench/devcloud/dr-bench-DotProduct-GPU.png differ diff --git a/bench/devcloud/dr-bench-Exclusive_Scan-CPU.csv b/bench/devcloud/dr-bench-Exclusive_Scan-CPU.csv new file mode 100644 index 0000000000..7e8a69a3f9 --- /dev/null +++ b/bench/devcloud/dr-bench-Exclusive_Scan-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 +3,Exclusive_Scan_DR,Exclusive_Scan,MHP_DIRECT_CPU,56,strong,0.06686931849897858,66.86931849897859,MHP,DIRECT,CPU,2000000000,56,56,1.0,11963.633217111668 +14,Exclusive_Scan_DR,Exclusive_Scan,MHP_DIRECT_CPU,112,strong,0.1272539268006525,127.25392680065251,MHP,DIRECT,CPU,2000000000,112,112,2.0,6286.642936003275 +46,Exclusive_Scan_DR,Exclusive_Scan,MHP_SYCL_CPU,1,strong,0.030320063293547663,30.320063293547665,MHP,SYCL,CPU,2000000000,1,56,1.0,26385.169194889048 +38,Exclusive_Scan_DR,Exclusive_Scan,MHP_SYCL_CPU,2,strong,0.05342301487642973,53.42301487642973,MHP,SYCL,CPU,2000000000,2,112,2.0,14974.819407898309 +134,Exclusive_Scan_Reference,Exclusive_Scan,Reference_CPU,1,strong,0.030417057898843348,30.41705789884335,SHP,SYCL,CPU,2000000000,1,56,1.0,26301.03156789602 diff --git a/bench/devcloud/dr-bench-Exclusive_Scan-CPU.png b/bench/devcloud/dr-bench-Exclusive_Scan-CPU.png new file mode 100644 index 0000000000..99a4a196a0 Binary files /dev/null and b/bench/devcloud/dr-bench-Exclusive_Scan-CPU.png differ diff --git a/bench/devcloud/dr-bench-Exclusive_Scan-GPU.csv b/bench/devcloud/dr-bench-Exclusive_Scan-GPU.csv new file mode 100644 index 0000000000..5995d7d3cf --- /dev/null +++ b/bench/devcloud/dr-bench-Exclusive_Scan-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 +86,Exclusive_Scan_DR,Exclusive_Scan,MHP_SYCL_GPU,1,weak,0.10859101489104384,108.59101489104384,MHP,SYCL,GPU,2000000000,1,56,1.0,7367.0920269295775 +128,Exclusive_Scan_DR,Exclusive_Scan,MHP_SYCL_GPU,1,strong,0.10835945063651041,108.3594506365104,MHP,SYCL,GPU,2000000000,1,56,1.0,7382.83550996935 +35,Exclusive_Scan_DR,Exclusive_Scan,MHP_SYCL_GPU,2,weak,0.011007391008353505,11.007391008353506,MHP,SYCL,GPU,4000000000,2,112,2.0,145356.87873591122 +155,Exclusive_Scan_DR,Exclusive_Scan,MHP_SYCL_GPU,2,strong,0.032222121389249694,32.22212138924969,MHP,SYCL,GPU,2000000000,2,112,2.0,24827.663900084026 +122,Exclusive_Scan_DR,Exclusive_Scan,MHP_SYCL_GPU,3,weak,0.045166768660996025,45.16676866099603,MHP,SYCL,GPU,6000000000,3,168,3.0,53136.41137388983 +144,Exclusive_Scan_DR,Exclusive_Scan,MHP_SYCL_GPU,3,strong,0.0449606320358003,44.9606320358003,MHP,SYCL,GPU,2000000000,3,168,3.0,17793.344171918958 +72,Exclusive_Scan_DR,Exclusive_Scan,MHP_SYCL_GPU,4,weak,0.06212859881849466,62.12859881849466,MHP,SYCL,GPU,8000000000,4,224,4.0,51506.070647893204 +97,Exclusive_Scan_DR,Exclusive_Scan,MHP_SYCL_GPU,4,strong,0.061860748538790054,61.860748538790055,MHP,SYCL,GPU,2000000000,4,224,4.0,12932.271576027833 +62,Exclusive_Scan_Reference,Exclusive_Scan,Reference_GPU,1,strong,0.10793629068739947,107.93629068739948,SHP,SYCL,GPU,2000000000,1,56,1.0,7411.779623935069 diff --git a/bench/devcloud/dr-bench-Exclusive_Scan-GPU.png b/bench/devcloud/dr-bench-Exclusive_Scan-GPU.png new file mode 100644 index 0000000000..367951f993 Binary files /dev/null and b/bench/devcloud/dr-bench-Exclusive_Scan-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..2b1c605144 --- /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 +22,Gemm_Reference,Gemm,Reference_GPU,1,strong,0.008143013088984654,8.143013088984654,SHP,SYCL,GPU,2000000000,1,56,1.0,377.25593296117927 +89,Gemm_DR,Gemm,SHP_SYCL_GPU,1,strong,0.00799088841197857,7.990888411978571,SHP,SYCL,GPU,2000000000,1,56,1.0,384.43785491923325 diff --git a/bench/devcloud/dr-bench-Gemm-GPU.png b/bench/devcloud/dr-bench-Gemm-GPU.png new file mode 100644 index 0000000000..30ca0d6291 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..174c989976 --- /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 +2,Inclusive_Scan_DR,Inclusive_Scan,MHP_DIRECT_CPU,56,strong,0.05886723002787382,58.867230027873816,MHP,DIRECT,CPU,2000000000,56,56,1.0,13589.903918040607 +13,Inclusive_Scan_DR,Inclusive_Scan,MHP_DIRECT_CPU,112,strong,0.11293752702613277,112.93752702613277,MHP,DIRECT,CPU,2000000000,112,112,2.0,7083.562222987996 +160,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_CPU,1,strong,0.06432567401192735,64.32567401192735,MHP,SYCL,CPU,2000000000,1,56,1.0,12436.71383609075 +26,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_CPU,2,strong,0.08176832756702501,81.76832756702501,MHP,SYCL,CPU,2000000000,2,112,2.0,9783.73930106672 +133,Inclusive_Scan_Reference,Inclusive_Scan,Reference_CPU,1,strong,0.07032839697461087,70.32839697461087,SHP,SYCL,CPU,2000000000,1,56,1.0,11375.205953987643 +77,Inclusive_Scan_DR,Inclusive_Scan,SHP_SYCL_CPU,1,strong,0.06424201036303613,64.24201036303613,SHP,SYCL,CPU,2000000000,1,56,1.0,12452.91041608355 +113,Inclusive_Scan_DR,Inclusive_Scan,SHP_SYCL_CPU,2,strong,0.09030005391363077,90.30005391363076,SHP,SYCL,CPU,2000000000,2,112,2.0,8859.352407089098 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..554f7502b5 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..5274ecb9b9 --- /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 +85,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,1,weak,0.19207832816128667,192.0783281612867,MHP,SYCL,GPU,2000000000,1,56,1.0,4164.96752995604 +127,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,1,strong,0.19188112833908327,191.8811283390833,MHP,SYCL,GPU,2000000000,1,56,1.0,4169.247944937439 +34,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,2,weak,0.3103358942221661,310.33589422216613,MHP,SYCL,GPU,4000000000,2,112,2.0,5155.703963959055 +154,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,2,strong,0.3089815170376123,308.9815170376123,MHP,SYCL,GPU,2000000000,2,112,2.0,2589.1516349264866 +121,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,3,weak,0.46521085635438564,465.2108563543856,MHP,SYCL,GPU,6000000000,3,168,3.0,5158.950972914832 +143,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,3,strong,0.4594029450649579,459.40294506495786,MHP,SYCL,GPU,2000000000,3,168,3.0,1741.3906649790479 +71,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,4,weak,0.6209052307777038,620.9052307777038,MHP,SYCL,GPU,8000000000,4,224,4.0,5153.765569009456 +96,Inclusive_Scan_DR,Inclusive_Scan,MHP_SYCL_GPU,4,strong,0.6085033991208123,608.5033991208122,MHP,SYCL,GPU,2000000000,4,224,4.0,1314.7009550905861 +61,Inclusive_Scan_Reference,Inclusive_Scan,Reference_GPU,1,strong,0.19220326143562858,192.20326143562858,SHP,SYCL,GPU,2000000000,1,56,1.0,4162.260276045996 +92,Inclusive_Scan_DR,Inclusive_Scan,SHP_SYCL_GPU,1,strong,0.19160317144979694,191.60317144979695,SHP,SYCL,GPU,2000000000,1,56,1.0,4175.296233077293 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..0136dbf5c3 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..ec5d53ddb9 --- /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 +0,Reduce_DR,Reduce,MHP_DIRECT_CPU,56,strong,0.1988344555940264,198.8344555940264,MHP,DIRECT,CPU,2000000000,56,56,1.0,2011.7237669144563 +11,Reduce_DR,Reduce,MHP_DIRECT_CPU,112,strong,0.4008129697814493,400.81296978144934,MHP,DIRECT,CPU,2000000000,112,112,2.0,997.9716979171293 +158,Reduce_DR,Reduce,MHP_SYCL_CPU,1,strong,0.22277661742594496,222.77661742594495,MHP,SYCL,CPU,2000000000,1,56,1.0,1795.5205740250876 +24,Reduce_DR,Reduce,MHP_SYCL_CPU,2,strong,0.42210777081860973,422.10777081860977,MHP,SYCL,CPU,2000000000,2,112,2.0,947.6252930010378 +131,Reduce_Reference,Reduce,Reference_CPU,1,strong,0.22268184324939744,222.68184324939742,SHP,SYCL,CPU,2000000000,1,56,1.0,1796.2847539034028 +75,Reduce_DR,Reduce,SHP_SYCL_CPU,1,strong,0.2224902843184784,222.4902843184784,SHP,SYCL,CPU,2000000000,1,56,1.0,1797.8313130627744 +111,Reduce_DR,Reduce,SHP_SYCL_CPU,2,strong,0.33694237109191083,336.94237109191084,SHP,SYCL,CPU,2000000000,2,112,2.0,1187.1466289732032 diff --git a/bench/devcloud/dr-bench-Reduce-CPU.png b/bench/devcloud/dr-bench-Reduce-CPU.png new file mode 100644 index 0000000000..eb25738a08 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..00d9dc8cc7 --- /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 +83,Reduce_DR,Reduce,MHP_SYCL_GPU,1,weak,0.7275800081425108,727.5800081425108,MHP,SYCL,GPU,2000000000,1,56,1.0,549.767716984401 +125,Reduce_DR,Reduce,MHP_SYCL_GPU,1,strong,0.7276078688830442,727.6078688830441,MHP,SYCL,GPU,2000000000,1,56,1.0,549.746665898546 +32,Reduce_DR,Reduce,MHP_SYCL_GPU,2,weak,1.437162101218437,1437.162101218437,MHP,SYCL,GPU,4000000000,2,112,2.0,556.6525858994986 +152,Reduce_DR,Reduce,MHP_SYCL_GPU,2,strong,1.4435842197809743,1443.5842197809743,MHP,SYCL,GPU,2000000000,2,112,2.0,277.08809400859855 +119,Reduce_DR,Reduce,MHP_SYCL_GPU,3,weak,2.156212844156105,2156.212844156105,MHP,SYCL,GPU,6000000000,3,168,3.0,556.5313291089564 +141,Reduce_DR,Reduce,MHP_SYCL_GPU,3,strong,2.149462823009455,2149.462823009455,MHP,SYCL,GPU,2000000000,3,168,3.0,186.09300692159053 +69,Reduce_DR,Reduce,MHP_SYCL_GPU,4,weak,2.858382736280556,2858.3827362805555,MHP,SYCL,GPU,8000000000,4,224,4.0,559.7570891020653 +94,Reduce_DR,Reduce,MHP_SYCL_GPU,4,strong,2.8484905670187826,2848.4905670187827,MHP,SYCL,GPU,2000000000,4,224,4.0,140.42525000131496 +59,Reduce_Reference,Reduce,Reference_GPU,1,strong,0.72745184588448,727.45184588448,SHP,SYCL,GPU,2000000000,1,56,1.0,549.8645749034505 +90,Reduce_DR,Reduce,SHP_SYCL_GPU,1,strong,0.7277176314429619,727.7176314429619,SHP,SYCL,GPU,2000000000,1,56,1.0,549.6637469218056 diff --git a/bench/devcloud/dr-bench-Reduce-GPU.png b/bench/devcloud/dr-bench-Reduce-GPU.png new file mode 100644 index 0000000000..89a7868d0e 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..57ab76d5f8 --- /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 +23,Sort_Reference,Sort,Reference_GPU,1,strong,0.010638319458936051,10.638319458936051,SHP,SYCL,GPU,2000000000,1,56,1.0,751.9984740898248 +93,Sort_DR,Sort,SHP_SYCL_GPU,1,strong,0.012145486239242229,12.14548623924223,SHP,SYCL,GPU,2000000000,1,56,1.0,658.6809158905382 diff --git a/bench/devcloud/dr-bench-Sort-GPU.png b/bench/devcloud/dr-bench-Sort-GPU.png new file mode 100644 index 0000000000..5b1a9f9b5c 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..244b4a4c86 --- /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 +9,Stencil2D_DR,Stencil2D,MHP_DIRECT_CPU,56,strong,0.1455510707934147,145.5510707934147,MHP,DIRECT,CPU,2000000000,56,56,1.0,2198.8927890077766 +20,Stencil2D_DR,Stencil2D,MHP_DIRECT_CPU,112,strong,0.29013558526292693,290.13558526292695,MHP,DIRECT,CPU,2000000000,112,112,2.0,1103.1090850505736 +48,Stencil2D_DR,Stencil2D,MHP_SYCL_CPU,1,strong,0.10085429172971505,100.85429172971506,MHP,SYCL,CPU,2000000000,1,56,1.0,3172.8942270259113 +40,Stencil2D_DR,Stencil2D,MHP_SYCL_CPU,2,strong,0.20114644371203017,201.14644371203016,MHP,SYCL,CPU,2000000000,2,112,2.0,1590.8807239869757 +166,Stencil2D_Reference,Stencil2D,Reference_CPU,1,strong,0.10312469824374855,103.12469824374855,MHP,SYCL,CPU,2000000000,1,56,1.0,3103.039382899707 diff --git a/bench/devcloud/dr-bench-Stencil2D-CPU.png b/bench/devcloud/dr-bench-Stencil2D-CPU.png new file mode 100644 index 0000000000..2ba0ea39c0 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..a1138ed37a --- /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 +88,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,1,weak,0.6307170982791805,630.7170982791805,MHP,SYCL,GPU,2000000000,1,56,1.0,507.3590059205201 +130,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,1,strong,0.6318297400188922,631.8297400188923,MHP,SYCL,GPU,2000000000,1,56,1.0,506.4655550883561 +37,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,2,weak,1.2474242708858807,1247.4242708858806,MHP,SYCL,GPU,4000000000,2,112,2.0,513.057197087798 +157,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,2,strong,1.2264607217115655,1226.4607217115654,MHP,SYCL,GPU,2000000000,2,112,2.0,260.9133699393403 +124,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,3,weak,1.8666833498270712,1866.6833498270712,MHP,SYCL,GPU,6000000000,3,168,3.0,514.2811179458658 +146,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,3,strong,1.8077737860817102,1807.77378608171,MHP,SYCL,GPU,2000000000,3,168,3.0,177.01418311501953 +74,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,4,weak,2.4861648951894604,2486.1648951894604,MHP,SYCL,GPU,8000000000,4,224,4.0,514.8491970410741 +99,Stencil2D_DR,Stencil2D,MHP_SYCL_GPU,4,strong,2.36462810896606,2364.62810896606,MHP,SYCL,GPU,2000000000,4,224,4.0,135.32783391461962 +100,Stencil2D_Reference,Stencil2D,Reference_GPU,1,strong,0.6235901759223385,623.5901759223385,MHP,SYCL,GPU,2000000000,1,56,1.0,513.1575389665096 diff --git a/bench/devcloud/dr-bench-Stencil2D-GPU.png b/bench/devcloud/dr-bench-Stencil2D-GPU.png new file mode 100644 index 0000000000..785ffb44b9 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..382ec11a3e --- /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 +6,Stream_Add,Stream_Add,MHP_DIRECT_CPU,56,strong,0.1921461487311654,192.1461487311654,MHP,DIRECT,CPU,2000000000,56,56,1.0,6245.246172895915 +17,Stream_Add,Stream_Add,MHP_DIRECT_CPU,112,strong,0.38256144592691743,382.56144592691743,MHP,DIRECT,CPU,2000000000,112,112,2.0,3136.751005037873 +163,Stream_Add,Stream_Add,MHP_SYCL_CPU,1,strong,0.1983310603242725,198.3310603242725,MHP,SYCL,CPU,2000000000,1,56,1.0,6050.489510004095 +29,Stream_Add,Stream_Add,MHP_SYCL_CPU,2,strong,0.3884374442316154,388.4374442316154,MHP,SYCL,CPU,2000000000,2,112,2.0,3089.3005239846816 +80,Stream_Add,Stream_Add,SHP_SYCL_CPU,1,strong,0.1979624754479935,197.9624754479935,SHP,SYCL,CPU,2000000000,1,56,1.0,6061.754871898694 +116,Stream_Add,Stream_Add,SHP_SYCL_CPU,2,strong,0.3703318778114172,370.3318778114172,SHP,SYCL,CPU,2000000000,2,112,2.0,3240.33676790598 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..d2eafb9019 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..76d3fd8987 --- /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 +43,Stream_Add,Stream_Add,MHP_SYCL_GPU,1,strong,0.794817401558337,794.817401558337,MHP,SYCL,GPU,2000000000,1,56,1.0,1509.7807340997476 +108,Stream_Add,Stream_Add,MHP_SYCL_GPU,2,strong,1.6231898048730915,1623.1898048730916,MHP,SYCL,GPU,2000000000,2,112,2.0,739.2850770731778 +51,Stream_Add,Stream_Add,MHP_SYCL_GPU,3,strong,2.2377614447157645,2237.761444715765,MHP,SYCL,GPU,2000000000,3,168,3.0,536.2501900431221 +149,Stream_Add,Stream_Add,MHP_SYCL_GPU,4,strong,3.1655965331505427,3165.5965331505427,MHP,SYCL,GPU,2000000000,4,224,4.0,379.07547201086504 +66,Stream_Add,Stream_Add,SHP_SYCL_GPU,1,strong,0.82215995117993,822.1599511799301,SHP,SYCL,GPU,2000000000,1,56,1.0,1459.5700000684897 +103,Stream_Add,Stream_Add,SHP_SYCL_GPU,2,strong,1.628016143376148,1628.016143376148,SHP,SYCL,GPU,2000000000,2,112,2.0,737.0934280242845 +138,Stream_Add,Stream_Add,SHP_SYCL_GPU,3,strong,2.352024873546581,2352.024873546581,SHP,SYCL,GPU,2000000000,3,168,3.0,510.1986860328305 +56,Stream_Add,Stream_Add,SHP_SYCL_GPU,4,strong,3.250609624880836,3250.609624880836,SHP,SYCL,GPU,2000000000,4,224,4.0,369.16152306169056 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..171acb5a90 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..71cf70b735 --- /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 +4,Stream_Copy,Stream_Copy,MHP_DIRECT_CPU,56,strong,0.1829194923603402,182.91949236034017,MHP,DIRECT,CPU,2000000000,56,56,1.0,4373.508747903416 +15,Stream_Copy,Stream_Copy,MHP_DIRECT_CPU,112,strong,0.3664018683363957,366.4018683363957,MHP,DIRECT,CPU,2000000000,112,112,2.0,2183.3949800319124 +161,Stream_Copy,Stream_Copy,MHP_SYCL_CPU,1,strong,0.1890588704534291,189.05887045342908,MHP,SYCL,CPU,2000000000,1,56,1.0,4231.486193064208 +27,Stream_Copy,Stream_Copy,MHP_SYCL_CPU,2,strong,0.3600914936678498,360.0914936678498,MHP,SYCL,CPU,2000000000,2,112,2.0,2221.6575899955137 +78,Stream_Copy,Stream_Copy,SHP_SYCL_CPU,1,strong,0.18874635325091468,188.74635325091467,SHP,SYCL,CPU,2000000000,1,56,1.0,4238.492485926337 +114,Stream_Copy,Stream_Copy,SHP_SYCL_CPU,2,strong,0.329869858690579,329.86985869057895,SHP,SYCL,CPU,2000000000,2,112,2.0,2425.1988441005383 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..5df455b822 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..a57cf85bfd --- /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 +41,Stream_Copy,Stream_Copy,MHP_SYCL_GPU,1,strong,0.8580875916169033,858.0875916169033,MHP,SYCL,GPU,2000000000,1,56,1.0,932.30575504833 +106,Stream_Copy,Stream_Copy,MHP_SYCL_GPU,2,strong,1.6906306015542432,1690.6306015542432,MHP,SYCL,GPU,2000000000,2,112,2.0,473.1962140425815 +49,Stream_Copy,Stream_Copy,MHP_SYCL_GPU,3,strong,2.5487107926957453,2548.710792695745,MHP,SYCL,GPU,2000000000,3,168,3.0,313.8841810897847 +147,Stream_Copy,Stream_Copy,MHP_SYCL_GPU,4,strong,3.4470244435340787,3447.0244435340787,MHP,SYCL,GPU,2000000000,4,224,4.0,232.0842260056027 +64,Stream_Copy,Stream_Copy,SHP_SYCL_GPU,1,strong,0.8591314524234506,859.1314524234506,SHP,SYCL,GPU,2000000000,1,56,1.0,931.1729860935114 +101,Stream_Copy,Stream_Copy,SHP_SYCL_GPU,2,strong,1.6890083019653008,1689.0083019653007,SHP,SYCL,GPU,2000000000,2,112,2.0,473.6507209994965 +136,Stream_Copy,Stream_Copy,SHP_SYCL_GPU,3,strong,2.574755648270232,2574.755648270232,SHP,SYCL,GPU,2000000000,3,168,3.0,310.70909604080475 +54,Stream_Copy,Stream_Copy,SHP_SYCL_GPU,4,strong,3.425539682456163,3425.5396824561626,SHP,SYCL,GPU,2000000000,4,224,4.0,233.5398431076963 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..f46ee01dcb 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..dd21a6ace4 --- /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 +5,Stream_Scale,Stream_Scale,MHP_DIRECT_CPU,56,strong,0.18341973033206416,183.41973033206415,MHP,DIRECT,CPU,2000000000,56,56,1.0,4361.580940892647 +16,Stream_Scale,Stream_Scale,MHP_DIRECT_CPU,112,strong,0.3606551411809622,360.65514118096223,MHP,DIRECT,CPU,2000000000,112,112,2.0,2218.185487056712 +162,Stream_Scale,Stream_Scale,MHP_SYCL_CPU,1,strong,0.18869627449922596,188.69627449922595,MHP,SYCL,CPU,2000000000,1,56,1.0,4239.6173539890515 +28,Stream_Scale,Stream_Scale,MHP_SYCL_CPU,2,strong,0.36506372896653794,365.06372896653795,MHP,SYCL,CPU,2000000000,2,112,2.0,2191.3982039922917 +79,Stream_Scale,Stream_Scale,SHP_SYCL_CPU,1,strong,0.188441932002521,188.44193200252099,SHP,SYCL,CPU,2000000000,1,56,1.0,4245.339620001866 +115,Stream_Scale,Stream_Scale,SHP_SYCL_CPU,2,strong,0.3438395154778868,343.83951547788683,SHP,SYCL,CPU,2000000000,2,112,2.0,2326.666843071008 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..ea61edcdc6 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..e2cbe6292b --- /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 +42,Stream_Scale,Stream_Scale,MHP_SYCL_GPU,1,strong,0.8524030029779885,852.4030029779885,MHP,SYCL,GPU,2000000000,1,56,1.0,938.5232069867054 +107,Stream_Scale,Stream_Scale,MHP_SYCL_GPU,2,strong,1.6862566724148973,1686.2566724148971,MHP,SYCL,GPU,2000000000,2,112,2.0,474.42362309785005 +50,Stream_Scale,Stream_Scale,MHP_SYCL_GPU,3,strong,2.5635453128345262,2563.545312834526,MHP,SYCL,GPU,2000000000,3,168,3.0,312.06782107371276 +148,Stream_Scale,Stream_Scale,MHP_SYCL_GPU,4,strong,3.422534655580687,3422.534655580687,MHP,SYCL,GPU,2000000000,4,224,4.0,233.7448939181793 +65,Stream_Scale,Stream_Scale,SHP_SYCL_GPU,1,strong,0.8553569344670601,855.3569344670601,SHP,SYCL,GPU,2000000000,1,56,1.0,935.2820650228891 +102,Stream_Scale,Stream_Scale,SHP_SYCL_GPU,2,strong,1.6810018268802849,1681.0018268802849,SHP,SYCL,GPU,2000000000,2,112,2.0,475.9066808896295 +137,Stream_Scale,Stream_Scale,SHP_SYCL_GPU,3,strong,2.5692723185371364,2569.272318537136,SHP,SYCL,GPU,2000000000,3,168,3.0,311.3722100331876 +55,Stream_Scale,Stream_Scale,SHP_SYCL_GPU,4,strong,3.426184957575995,3426.184957575995,SHP,SYCL,GPU,2000000000,4,224,4.0,233.49585906944003 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..26e72a2fc4 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..8d1df0be5e --- /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 +7,Stream_Triad,Stream_Triad,MHP_DIRECT_CPU,56,strong,0.19077149245138145,190.77149245138145,MHP,DIRECT,CPU,2000000000,56,56,1.0,6290.248006031733 +18,Stream_Triad,Stream_Triad,MHP_DIRECT_CPU,112,strong,0.3795499244680486,379.5499244680486,MHP,DIRECT,CPU,2000000000,112,112,2.0,3161.6394119478186 +164,Stream_Triad,Stream_Triad,MHP_SYCL_CPU,1,strong,0.1981730094973809,198.1730094973809,MHP,SYCL,CPU,2000000000,1,56,1.0,6055.315015114909 +30,Stream_Triad,Stream_Triad,MHP_SYCL_CPU,2,strong,0.3831662549973156,383.1662549973156,MHP,SYCL,CPU,2000000000,2,112,2.0,3131.7997979973657 +81,Stream_Triad,Stream_Triad,SHP_SYCL_CPU,1,strong,0.1977876674702415,197.78766747024153,SHP,SYCL,CPU,2000000000,1,56,1.0,6067.112350068783 +117,Stream_Triad,Stream_Triad,SHP_SYCL_CPU,2,strong,0.36976987756672863,369.7698775667286,SHP,SYCL,CPU,2000000000,2,112,2.0,3245.2616419071296 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..79b2956827 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..22ca559ecb --- /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 +44,Stream_Triad,Stream_Triad,MHP_SYCL_GPU,1,strong,0.7950403659149444,795.0403659149445,MHP,SYCL,GPU,2000000000,1,56,1.0,1509.3573250447753 +109,Stream_Triad,Stream_Triad,MHP_SYCL_GPU,2,strong,1.6306795464363735,1630.6795464363736,MHP,SYCL,GPU,2000000000,2,112,2.0,735.8895269290864 +52,Stream_Triad,Stream_Triad,MHP_SYCL_GPU,3,strong,2.297335037632427,2297.335037632427,MHP,SYCL,GPU,2000000000,3,168,3.0,522.3443600271245 +150,Stream_Triad,Stream_Triad,MHP_SYCL_GPU,4,strong,3.1047086354978832,3104.7086354978833,MHP,SYCL,GPU,2000000000,4,224,4.0,386.5096989391287 +67,Stream_Triad,Stream_Triad,SHP_SYCL_GPU,1,strong,0.8059539758528691,805.9539758528691,SHP,SYCL,GPU,2000000000,1,56,1.0,1488.9187670178649 +104,Stream_Triad,Stream_Triad,SHP_SYCL_GPU,2,strong,1.6411992009791478,1641.199200979148,SHP,SYCL,GPU,2000000000,2,112,2.0,731.1726689143364 +139,Stream_Triad,Stream_Triad,SHP_SYCL_GPU,3,strong,2.4583478533316137,2458.347853331614,SHP,SYCL,GPU,2000000000,3,168,3.0,488.1327100937853 +57,Stream_Triad,Stream_Triad,SHP_SYCL_GPU,4,strong,3.3073150168495684,3307.3150168495686,SHP,SYCL,GPU,2000000000,4,224,4.0,362.8320839975739 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..b9d3860fee 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..da9c3dc81a --- /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 +8,WaveEquation_DR,WaveEquation,MHP_DIRECT_CPU,56,strong,0.18814780129102932,188.14780129102934,MHP,DIRECT,CPU,2000000000,56,56,1.0,19324.057502942236 +19,WaveEquation_DR,WaveEquation,MHP_DIRECT_CPU,112,strong,0.37185404032914304,371.85404032914306,MHP,DIRECT,CPU,2000000000,112,112,2.0,9777.435598069138 +47,WaveEquation_DR,WaveEquation,MHP_SYCL_CPU,1,strong,0.13108718858917362,131.08718858917362,MHP,SYCL,CPU,2000000000,1,56,1.0,27735.57790299788 +39,WaveEquation_DR,WaveEquation,MHP_SYCL_CPU,2,strong,0.25613724023468615,256.13724023468615,MHP,SYCL,CPU,2000000000,2,112,2.0,14194.651772888283 diff --git a/bench/devcloud/dr-bench-WaveEquation-CPU.png b/bench/devcloud/dr-bench-WaveEquation-CPU.png new file mode 100644 index 0000000000..3696f09d59 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..ffc1728b09 --- /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 +87,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,1,weak,0.4226032202763804,422.60322027638045,MHP,SYCL,GPU,2000000000,1,56,1.0,8603.292063941724 +129,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,1,strong,0.4240442534343291,424.0442534343291,MHP,SYCL,GPU,2000000000,1,56,1.0,8574.055424059805 +36,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,2,weak,0.7987020839888994,798.7020839888994,MHP,SYCL,GPU,4000000000,2,112,2.0,9104.32434598363 +156,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,2,strong,0.8159234208982115,815.9234208982115,MHP,SYCL,GPU,2000000000,2,112,2.0,4456.029620031673 +123,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,3,weak,1.2131534490555054,1213.1534490555055,MHP,SYCL,GPU,6000000000,3,168,3.0,8990.591642087458 +145,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,3,strong,1.1220043496709964,1122.0043496709964,MHP,SYCL,GPU,2000000000,3,168,3.0,3240.4321179914446 +73,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,4,weak,1.6121276553398836,1612.1276553398836,MHP,SYCL,GPU,8000000000,4,224,4.0,9021.06956395701 +98,WaveEquation_DR,WaveEquation,MHP_SYCL_GPU,4,strong,1.4628369487788289,1462.8369487788289,MHP,SYCL,GPU,2000000000,4,224,4.0,2485.430063982958 diff --git a/bench/devcloud/dr-bench-WaveEquation-GPU.png b/bench/devcloud/dr-bench-WaveEquation-GPU.png new file mode 100644 index 0000000000..aa3cd11dba Binary files /dev/null and b/bench/devcloud/dr-bench-WaveEquation-GPU.png differ diff --git a/bench/devcloud/dr-bench-a0de330cdbb2405898a19517f157683f.json b/bench/devcloud/dr-bench-a0de330cdbb2405898a19517f157683f.json new file mode 100644 index 0000000000..876bcd46f5 --- /dev/null +++ b/bench/devcloud/dr-bench-a0de330cdbb2405898a19517f157683f.json @@ -0,0 +1,133 @@ +{ + "context": { + "date": "2023-10-31T04:32:54-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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": [1.56201,1.6499,0.984375], + "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-04\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.7319621404258152e+02, + "cpu_time": 6.0963059999998848e+00, + "time_unit": "ms", + "bytes_per_second": 1.6906306015542432e+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.7442362309785005e+02, + "cpu_time": 7.3703429999998349e+00, + "time_unit": "ms", + "bytes_per_second": 1.6862566724148972e+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.3928507707317783e+02, + "cpu_time": 3.9533430000009417e+00, + "time_unit": "ms", + "bytes_per_second": 1.6231898048730916e+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.3588952692908640e+02, + "cpu_time": 1.3297484999998943e+01, + "time_unit": "ms", + "bytes_per_second": 1.6306795464363735e+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.2568740119950494e+03, + "cpu_time": 4.3909869999971818e+00, + "time_unit": "ms", + "bytes_per_second": 1.5912493861062327e+12, + "footprint": 2.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-a0f61b8d46d4408288161dc6f031e3cb.json b/bench/devcloud/dr-bench-a0f61b8d46d4408288161dc6f031e3cb.json new file mode 100644 index 0000000000..b210dec94c --- /dev/null +++ b/bench/devcloud/dr-bench-a0f61b8d46d4408288161dc6f031e3cb.json @@ -0,0 +1,86 @@ +{ + "context": { + "date": "2023-10-31T04:54:49-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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.04395,3.03711,2.45068], + "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-04\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.7725593296117927e+02, + "cpu_time": 3.7724777499999982e+02, + "time_unit": "ms", + "bytes_per_second": 8.1430130889846544e+09, + "flops": 1.0857350785312873e+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.5199847408982475e+02, + "cpu_time": 7.5168015799999921e+02, + "time_unit": "ms", + "bytes_per_second": 1.0638319458936050e+10, + "footprint": 8.0000000000000000e+09 + } + ] +} diff --git a/bench/devcloud/dr-bench-aa9c65519380452b8a819124af744dd3.json b/bench/devcloud/dr-bench-aa9c65519380452b8a819124af744dd3.json new file mode 100644 index 0000000000..f04134ede2 --- /dev/null +++ b/bench/devcloud/dr-bench-aa9c65519380452b8a819124af744dd3.json @@ -0,0 +1,133 @@ +{ + "context": { + "date": "2023-10-31T05:10:53-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3688, + "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": [173.573,129.536,79.3755], + "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-04\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.7962847539034028e+03, + "cpu_time": 1.7880298259999990e+03, + "time_unit": "ms", + "bytes_per_second": 2.2268184324939743e+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.0012534189881690e+03, + "cpu_time": 6.9834753149999997e+03, + "time_unit": "ms", + "bytes_per_second": 2.2853050793171179e+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.1375205953987643e+04, + "cpu_time": 1.1352868386000004e+04, + "time_unit": "ms", + "bytes_per_second": 7.0328396974610870e+10, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Exclusive_Scan_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Exclusive_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": 2.6301031567896021e+04, + "cpu_time": 2.6249959494999999e+04, + "time_unit": "ms", + "bytes_per_second": 3.0417057898843349e+10, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "BlackScholes_Reference/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "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": 3.9044750497918212e+04, + "cpu_time": 3.8974215092999999e+04, + "time_unit": "ms", + "bytes_per_second": 5.1223275203324348e+10, + "footprint": 4.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-af6173fa3d8146879d09a320f5fb8a14.json b/bench/devcloud/dr-bench-af6173fa3d8146879d09a320f5fb8a14.json new file mode 100644 index 0000000000..612ee4e85f --- /dev/null +++ b/bench/devcloud/dr-bench-af6173fa3d8146879d09a320f5fb8a14.json @@ -0,0 +1,134 @@ +{ + "context": { + "date": "2023-10-31T04:55:18-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "shp/shp-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.68652,2.87256,2.41162], + "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-04\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.8443785491923325e+02, + "cpu_time": 6.1267000000003735e-02, + "time_unit": "ms", + "bytes_per_second": 7.9908884119785709e+09, + "flops": 1.0654517882638094e+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.4966374692180557e+02, + "cpu_time": 5.4916287300000022e+02, + "time_unit": "ms", + "bytes_per_second": 7.2771763144296191e+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.3211884609991612e+03, + "cpu_time": 2.3204661729999998e+03, + "time_unit": "ms", + "bytes_per_second": 6.8930206524948694e+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.1752962330772934e+03, + "cpu_time": 4.1677321040000024e+03, + "time_unit": "ms", + "bytes_per_second": 1.9160317144979694e+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.5868091589053824e+02, + "cpu_time": 6.5817435000000296e+02, + "time_unit": "ms", + "bytes_per_second": 1.2145486239242229e+10, + "footprint": 8.0000000000000000e+09 + } + ] +} diff --git a/bench/devcloud/dr-bench-bd36b739c28a444d91b721c1eac6963f.json b/bench/devcloud/dr-bench-bd36b739c28a444d91b721c1eac6963f.json new file mode 100644 index 0000000000..d4f4523726 --- /dev/null +++ b/bench/devcloud/dr-bench-bd36b739c28a444d91b721c1eac6963f.json @@ -0,0 +1,150 @@ +{ + "context": { + "date": "2023-10-31T04:34:15-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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": [2.74756,1.95508,1.14551], + "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-04\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.4974666589854598e+02, + "cpu_time": 5.4974681900000098e+02, + "time_unit": "ms", + "bytes_per_second": 7.2760786888304419e+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.3155520519388642e+03, + "cpu_time": 2.3154920419999989e+03, + "time_unit": "ms", + "bytes_per_second": 6.9097993226292786e+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.1692479449374387e+03, + "cpu_time": 4.1686944060000005e+03, + "time_unit": "ms", + "bytes_per_second": 1.9188112833908328e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Exclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Exclusive_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": 7.3828355099693499e+03, + "cpu_time": 7.3813929189999999e+03, + "time_unit": "ms", + "bytes_per_second": 1.0835945063651041e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "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.5740554240598049e+03, + "cpu_time": 8.5473248850000091e+03, + "time_unit": "ms", + "bytes_per_second": 4.2404425343432910e+11, + "flops": 7.8721086652412581e+08, + "footprint": 3.5997811200000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "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.0646555508835610e+02, + "cpu_time": 5.0645894399998781e+02, + "time_unit": "ms", + "bytes_per_second": 6.3182974001889221e+11, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-bd9fbcb56b9648fdbb1032d92fa3f3e4.json b/bench/devcloud/dr-bench-bd9fbcb56b9648fdbb1032d92fa3f3e4.json new file mode 100644 index 0000000000..dd8692096b --- /dev/null +++ b/bench/devcloud/dr-bench-bd9fbcb56b9648fdbb1032d92fa3f3e4.json @@ -0,0 +1,134 @@ +{ + "context": { + "date": "2023-10-31T04:31:04-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "shp/shp-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": [4.16064,1.92236,0.96875], + "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-04\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.7365072099949651e+02, + "cpu_time": 2.2716430000002674e+00, + "time_unit": "ms", + "bytes_per_second": 1.6890083019653008e+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.7590668088962951e+02, + "cpu_time": 2.2848140000011341e+00, + "time_unit": "ms", + "bytes_per_second": 1.6810018268802849e+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.3709342802428455e+02, + "cpu_time": 4.5348559999993654e+00, + "time_unit": "ms", + "bytes_per_second": 1.6280161433761479e+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.3117266891433644e+02, + "cpu_time": 4.5765830000004115e+00, + "time_unit": "ms", + "bytes_per_second": 1.6411992009791479e+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.2033111550515641e+03, + "cpu_time": 4.7399099999996253e+00, + "time_unit": "ms", + "bytes_per_second": 1.6620804948112498e+12, + "footprint": 2.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-bfd8b40be0a2470e80f432592d9a4ae2.json b/bench/devcloud/dr-bench-bfd8b40be0a2470e80f432592d9a4ae2.json new file mode 100644 index 0000000000..f17f05fda6 --- /dev/null +++ b/bench/devcloud/dr-bench-bfd8b40be0a2470e80f432592d9a4ae2.json @@ -0,0 +1,150 @@ +{ + "context": { + "date": "2023-10-31T04:38:59-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3616, + "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.79883,2.1377,1.40771], + "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-04\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.4042525000131496e+02, + "cpu_time": 1.4042033299999980e+02, + "time_unit": "ms", + "bytes_per_second": 2.8484905670187827e+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.9214049291948709e+02, + "cpu_time": 5.9163390600000025e+02, + "time_unit": "ms", + "bytes_per_second": 2.7020614518547217e+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.3147009550905861e+03, + "cpu_time": 1.3114645530000005e+03, + "time_unit": "ms", + "bytes_per_second": 6.0850339912081226e+11, + "footprint": 4.0000000000000000e+09 + }, + { + "name": "Exclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Exclusive_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.2932271576027833e+04, + "cpu_time": 1.2918897127000000e+04, + "time_unit": "ms", + "bytes_per_second": 6.1860748538790054e+10, + "footprint": 4.0000000000000000e+09 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "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.4854300639829580e+03, + "cpu_time": 2.4004354679999979e+03, + "time_unit": "ms", + "bytes_per_second": 1.4628369487788289e+12, + "flops": 2.7156626524359450e+09, + "footprint": 8.9994528000000000e+09 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "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.3532783391461962e+02, + "cpu_time": 1.3431725099999881e+02, + "time_unit": "ms", + "bytes_per_second": 2.3646281089660601e+12, + "footprint": 8.0000000000000000e+09 + } + ] +} diff --git a/bench/devcloud/dr-bench-c7f86d9c396d479aa6c8539822c9979b.json b/bench/devcloud/dr-bench-c7f86d9c396d479aa6c8539822c9979b.json new file mode 100644 index 0000000000..0bb4dc8173 --- /dev/null +++ b/bench/devcloud/dr-bench-c7f86d9c396d479aa6c8539822c9979b.json @@ -0,0 +1,181 @@ +{ + "context": { + "date": "2023-10-31T04:59:29-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3795, + "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.6831,47.1582,19.9263], + "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-04\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": 9.4762529300103779e+02, + "cpu_time": 9.3986476099999993e+02, + "time_unit": "ms", + "bytes_per_second": 4.2210777081860974e+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": 3.5761768749923540e+03, + "cpu_time": 3.3190017559999987e+03, + "time_unit": "ms", + "bytes_per_second": 4.4740516365075507e+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.7837393010667201e+03, + "cpu_time": 6.0127402839999959e+03, + "time_unit": "ms", + "bytes_per_second": 8.1768327567025009e+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.2216575899955137e+03, + "cpu_time": 4.4023750000000916e+01, + "time_unit": "ms", + "bytes_per_second": 3.6009149366784979e+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.1913982039922917e+03, + "cpu_time": 4.7619334000003732e+01, + "time_unit": "ms", + "bytes_per_second": 3.6506372896653796e+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": 3.0893005239846816e+03, + "cpu_time": 2.2584780999999055e+01, + "time_unit": "ms", + "bytes_per_second": 3.8843744423161542e+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": 3.1317997979973657e+03, + "cpu_time": 4.7641878000000304e+01, + "time_unit": "ms", + "bytes_per_second": 3.8316625499731561e+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": 1.8629322224945696e+04, + "cpu_time": 1.0285540999999654e+02, + "time_unit": "ms", + "bytes_per_second": 1.0735763630315488e+11, + "footprint": 2.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-c9ddfd8b6aed468c9e61c75f33bfcf29.json b/bench/devcloud/dr-bench-c9ddfd8b6aed468c9e61c75f33bfcf29.json new file mode 100644 index 0000000000..de2fb61a2a --- /dev/null +++ b/bench/devcloud/dr-bench-c9ddfd8b6aed468c9e61c75f33bfcf29.json @@ -0,0 +1,135 @@ +{ + "context": { + "date": "2023-10-31T04:31:26-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "shp/shp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3358, + "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.2627,1.86182,0.970703], + "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-04\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.1070909604080475e+02, + "cpu_time": 1.6756129999997427e+00, + "time_unit": "ms", + "bytes_per_second": 2.5747556482702319e+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.1137221003318763e+02, + "cpu_time": 1.6796540000001414e+00, + "time_unit": "ms", + "bytes_per_second": 2.5692723185371362e+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.1019868603283049e+02, + "cpu_time": 4.9610470000001072e+00, + "time_unit": "ms", + "bytes_per_second": 2.3520248735465811e+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": 4.8813271009378531e+02, + "cpu_time": 4.1951369999999599e+00, + "time_unit": "ms", + "bytes_per_second": 2.4583478533316138e+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.1710090898917508e+02, + "cpu_time": 5.5343290000000600e+00, + "time_unit": "ms", + "bytes_per_second": 2.4476780994824419e+12, + "footprint": 1.3333333333000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-e675abb200ce48128f68e676213e3a4e.json b/bench/devcloud/dr-bench-e675abb200ce48128f68e676213e3a4e.json new file mode 100644 index 0000000000..f48ac1278f --- /dev/null +++ b/bench/devcloud/dr-bench-e675abb200ce48128f68e676213e3a4e.json @@ -0,0 +1,133 @@ +{ + "context": { + "date": "2023-10-31T04:33:56-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3795, + "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.25,1.8125,1.08252], + "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-04\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.3208422600560269e+02, + "cpu_time": 4.2539389999998178e+00, + "time_unit": "ms", + "bytes_per_second": 3.4470244435340786e+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.3374489391817929e+02, + "cpu_time": 5.2187950000002203e+00, + "time_unit": "ms", + "bytes_per_second": 3.4225346555806870e+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.7907547201086504e+02, + "cpu_time": 1.0435095999999255e+01, + "time_unit": "ms", + "bytes_per_second": 3.1655965331505425e+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.8650969893912873e+02, + "cpu_time": 1.3629119000000856e+01, + "time_unit": "ms", + "bytes_per_second": 3.1047086354978833e+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.4112479000681526e+02, + "cpu_time": 4.6241010000009908e+00, + "time_unit": "ms", + "bytes_per_second": 3.1195174967087764e+12, + "footprint": 1.0000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-ede3197caf4e44748d8a1cebcf452d95.json b/bench/devcloud/dr-bench-ede3197caf4e44748d8a1cebcf452d95.json new file mode 100644 index 0000000000..64a6abdc60 --- /dev/null +++ b/bench/devcloud/dr-bench-ede3197caf4e44748d8a1cebcf452d95.json @@ -0,0 +1,69 @@ +{ + "context": { + "date": "2023-10-31T04:54:47-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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.13525,3.07178,2.45898], + "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-04\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.1315753896650961e+02, + "cpu_time": 5.1315816800000016e+02, + "time_unit": "ms", + "bytes_per_second": 6.2359017592233850e+11, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-ee42cdfe336f4e12ba92c7aea837a8fe.json b/bench/devcloud/dr-bench-ee42cdfe336f4e12ba92c7aea837a8fe.json new file mode 100644 index 0000000000..fb71bff849 --- /dev/null +++ b/bench/devcloud/dr-bench-ee42cdfe336f4e12ba92c7aea837a8fe.json @@ -0,0 +1,150 @@ +{ + "context": { + "date": "2023-10-31T04:50:11-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "executable": "mhp/mhp-bench", + "num_cpus": 224, + "mhz_per_cpu": 3565, + "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.0459,2.7915,2.10791], + "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-04\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.5975708910206527e+02, + "cpu_time": 5.5975048699999877e+02, + "time_unit": "ms", + "bytes_per_second": 2.8583827362805557e+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.3269171150860252e+03, + "cpu_time": 2.3269158809999981e+03, + "time_unit": "ms", + "bytes_per_second": 2.7504202700246997e+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.1537655690094562e+03, + "cpu_time": 5.1488177720000012e+03, + "time_unit": "ms", + "bytes_per_second": 6.2090523077770374e+11, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "Exclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Exclusive_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.1506070647893204e+04, + "cpu_time": 5.1493348014999981e+04, + "time_unit": "ms", + "bytes_per_second": 6.2128598818494659e+10, + "footprint": 1.6000000000000000e+10 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "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.0210695639570094e+03, + "cpu_time": 8.8276077640000203e+03, + "time_unit": "ms", + "bytes_per_second": 1.6121276553398835e+12, + "flops": 2.9928112413487940e+09, + "footprint": 3.5997811200000000e+10 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "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.1484919704107415e+02, + "cpu_time": 5.1271635099999457e+02, + "time_unit": "ms", + "bytes_per_second": 2.4861648951894604e+12, + "footprint": 3.2000000000000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-ef0998e69afa4e97b08f824bfe6d205e.json b/bench/devcloud/dr-bench-ef0998e69afa4e97b08f824bfe6d205e.json new file mode 100644 index 0000000000..f9595c7c90 --- /dev/null +++ b/bench/devcloud/dr-bench-ef0998e69afa4e97b08f824bfe6d205e.json @@ -0,0 +1,133 @@ +{ + "context": { + "date": "2023-10-31T04:33:31-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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": [1.75732,1.68994,1.02344], + "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-04\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.1388418108978470e+02, + "cpu_time": 5.5861589999999239e+00, + "time_unit": "ms", + "bytes_per_second": 2.5487107926957451e+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.1206782107371276e+02, + "cpu_time": 2.9991389999999285e+00, + "time_unit": "ms", + "bytes_per_second": 2.5635453128345264e+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.3625019004312207e+02, + "cpu_time": 4.0336551999999415e+01, + "time_unit": "ms", + "bytes_per_second": 2.2377614447157646e+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.2234436002712448e+02, + "cpu_time": 4.3069960000003960e+00, + "time_unit": "ms", + "bytes_per_second": 2.2973350376324268e+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": 7.9154533403756943e+02, + "cpu_time": 1.8299389000002719e+01, + "time_unit": "ms", + "bytes_per_second": 2.5267030377126489e+12, + "footprint": 1.3333333333000000e+10 + } + ] +} diff --git a/bench/devcloud/dr-bench-fd94c8a93ba746e9afd4ff96b08a25d6.json b/bench/devcloud/dr-bench-fd94c8a93ba746e9afd4ff96b08a25d6.json new file mode 100644 index 0000000000..0fa0edfc7b --- /dev/null +++ b/bench/devcloud/dr-bench-fd94c8a93ba746e9afd4ff96b08a25d6.json @@ -0,0 +1,229 @@ +{ + "context": { + "date": "2023-10-31T05:18:12-07:00", + "host_name": "idc-beta-batch-pvc-node-04", + "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": [70.3374,86.1914,78.0522], + "library_build_type": "debug", + "default_repetitions": "50", + "default_vector_size": "2000000000", + "device": "CPU", + "hostname": "idc-beta-batch-pvc-node-04\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": 9.9797169791712929e+02, + "cpu_time": 9.9793763700000056e+02, + "time_unit": "ms", + "bytes_per_second": 4.0081296978144934e+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": 3.7143539131135531e+03, + "cpu_time": 3.7142130320000001e+03, + "time_unit": "ms", + "bytes_per_second": 4.3076132146459943e+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": 7.0835622229879964e+03, + "cpu_time": 7.0833506630000011e+03, + "time_unit": "ms", + "bytes_per_second": 1.1293752702613277e+11, + "footprint": 1.4285714200000000e+08 + }, + { + "name": "Exclusive_Scan_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "Exclusive_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": 6.2866429360032753e+03, + "cpu_time": 6.2866048940000001e+03, + "time_unit": "ms", + "bytes_per_second": 1.2725392680065251e+11, + "footprint": 1.4285714200000000e+08 + }, + { + "name": "Stream_Copy/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 4, + "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.1833949800319124e+03, + "cpu_time": 2.1833672550000001e+03, + "time_unit": "ms", + "bytes_per_second": 3.6640186833639569e+11, + "footprint": 1.4285714200000000e+08 + }, + { + "name": "Stream_Scale/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 5, + "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.2181854870567122e+03, + "cpu_time": 2.2161321110000004e+03, + "time_unit": "ms", + "bytes_per_second": 3.6065514118096222e+11, + "footprint": 1.4285714200000000e+08 + }, + { + "name": "Stream_Add/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 6, + "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.1367510050378728e+03, + "cpu_time": 3.1367056690000013e+03, + "time_unit": "ms", + "bytes_per_second": 3.8256144592691742e+11, + "footprint": 2.1428571400000000e+08 + }, + { + "name": "Stream_Triad/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 7, + "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.1616394119478186e+03, + "cpu_time": 3.1614981689999977e+03, + "time_unit": "ms", + "bytes_per_second": 3.7954992446804858e+11, + "footprint": 2.1428571400000000e+08 + }, + { + "name": "WaveEquation_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 8, + "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.7774355980691380e+03, + "cpu_time": 9.7772862069999883e+03, + "time_unit": "ms", + "bytes_per_second": 3.7185404032914307e+11, + "flops": 6.9032309467043877e+08, + "footprint": 3.2140902800000000e+08 + }, + { + "name": "Stencil2D_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 9, + "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.1031090850505736e+03, + "cpu_time": 1.1030911829999895e+03, + "time_unit": "ms", + "bytes_per_second": 2.9013558526292694e+11, + "footprint": 2.8576000000000000e+08 + }, + { + "name": "BlackScholes_DR/min_time:0.100/min_warmup_time:0.100/real_time", + "family_index": 10, + "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.2363188698949562e+03, + "cpu_time": 6.2353009489999922e+03, + "time_unit": "ms", + "bytes_per_second": 3.2070201054900323e+11, + "footprint": 3.5714285700000000e+08 + } + ] +} diff --git a/doxygen/algorithms_8hpp_source.html b/doxygen/algorithms_8hpp_source.html new file mode 100644 index 0000000000..493f7cf29e --- /dev/null +++ b/doxygen/algorithms_8hpp_source.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/algorithms/copy.hpp>
+
8#include <dr/shp/algorithms/exclusive_scan.hpp>
+
9#include <dr/shp/algorithms/execution_policy.hpp>
+
10#include <dr/shp/algorithms/fill.hpp>
+
11#include <dr/shp/algorithms/for_each.hpp>
+
12#include <dr/shp/algorithms/inclusive_scan.hpp>
+
13#include <dr/shp/algorithms/iota.hpp>
+
14#include <dr/shp/algorithms/matrix/matrix_algorithms.hpp>
+
15#include <dr/shp/algorithms/reduce.hpp>
+
16#include <dr/shp/algorithms/sort.hpp>
+
17#include <dr/shp/algorithms/transform.hpp>
+
+ + + + diff --git a/doxygen/alignment_8hpp_source.html b/doxygen/alignment_8hpp_source.html new file mode 100644 index 0000000000..85c20b03b6 --- /dev/null +++ b/doxygen/alignment_8hpp_source.html @@ -0,0 +1,157 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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::mhp {
+
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::mhp
+
Definition: alignment.hpp:14
+
Definition: alignment.hpp:17
+
+ + + + diff --git a/doxygen/allocators_8hpp_source.html b/doxygen/allocators_8hpp_source.html new file mode 100644 index 0000000000..38e248e8aa --- /dev/null +++ b/doxygen/allocators_8hpp_source.html @@ -0,0 +1,217 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/device_ptr.hpp>
+
12
+
13namespace dr::shp {
+
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::shp
+
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..7d03eb3c8c --- /dev/null +++ b/doxygen/annotated.html @@ -0,0 +1,228 @@ + + + + + + + +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
 Nmhp
 Nranges
 Nshp
 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
 Ctransform_iterator
 Ctransform_view
 Nfmt
 Cformatter< Mdspan, char >
 Nnostd
 Csource_location
 Nstd
 Ctuple_element< Index, dr::index< I > >
 Ctuple_element< Index, dr::shp::matrix_entry< T, I > >
 Ctuple_element< Index, dr::shp::matrix_ref< T, I, TRef > >
 Ctuple_size< dr::index< I > >
 Ctuple_size< dr::shp::matrix_entry< T, I > >
 Ctuple_size< dr::shp::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..acd887771d --- /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..98dd58d905 --- /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..4c7dd96acd --- /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_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..d4eef150a7 --- /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..1f3c10c27e --- /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, Mdspan::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..4e3acee634 --- /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, Mdspan::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..81caf46e15 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..81caf46e15 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..7a792b7e06 --- /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..5d894708ac 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..5d894708ac 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..1b1f7bacef --- /dev/null +++ b/doxygen/classdr_1_1communicator-members.html @@ -0,0 +1,117 @@ + + + + + + + +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
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, tag t, MPI_Request *request) const (defined in dr::communicator)dr::communicatorinline
irecv(R &data, std::size_t src_rank, tag t, MPI_Request *request) const (defined in dr::communicator)dr::communicatorinline
isend(const T *data, std::size_t count, std::size_t dst_rank, tag t, MPI_Request *request) const (defined in dr::communicator)dr::communicatorinline
isend(const R &data, std::size_t dst_rank, tag t, 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
tag enum name (defined in dr::communicator)dr::communicator
+ + + + diff --git a/doxygen/classdr_1_1communicator.html b/doxygen/classdr_1_1communicator.html new file mode 100644 index 0000000000..2457323f53 --- /dev/null +++ b/doxygen/classdr_1_1communicator.html @@ -0,0 +1,202 @@ + + + + + + + +Distributed Ranges: dr::communicator Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::communicator Class Reference
+
+
+ + + + +

+Public Types

enum class  tag { invalid +, halo_forward +, halo_reverse +, halo_index + }
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+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, tag t, MPI_Request *request) const
 
+template<rng::contiguous_range R>
void isend (const R &data, std::size_t dst_rank, tag t, MPI_Request *request) const
 
+template<typename T >
void irecv (T *data, std::size_t size, std::size_t src_rank, tag t, MPI_Request *request) const
 
+template<rng::contiguous_range R>
void irecv (R &data, std::size_t src_rank, tag t, MPI_Request *request) const
 
+template<rng::contiguous_range R>
void alltoall (const R &sendr, R &recvr, 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..a58706911b --- /dev/null +++ b/doxygen/classdr_1_1index-members.html @@ -0,0 +1,107 @@ + + + + + + + +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 &)=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..927ad560b2 --- /dev/null +++ b/doxygen/classdr_1_1index.html @@ -0,0 +1,162 @@ + + + + + + + +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
 
+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..17d93df79b --- /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..7805725abc --- /dev/null +++ b/doxygen/classdr_1_1logger-members.html @@ -0,0 +1,91 @@ + + + + + + + +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.

+ + + + +
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
set_file(std::ofstream &fout) (defined in dr::logger)dr::loggerinline
+ + + + diff --git a/doxygen/classdr_1_1logger.html b/doxygen/classdr_1_1logger.html new file mode 100644 index 0000000000..5bc61a6726 --- /dev/null +++ b/doxygen/classdr_1_1logger.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: dr::logger Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::logger Class Reference
+
+
+ + + + + + + + + + +

+Public Member Functions

+void set_file (std::ofstream &fout)
 
+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)
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1allocator-members.html b/doxygen/classdr_1_1mhp_1_1____detail_1_1allocator-members.html new file mode 100644 index 0000000000..4d247f91aa --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1allocator-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::__detail::allocator< T > Member List
+
+
+ +

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

+ + + +
allocate(std::size_t sz) (defined in dr::mhp::__detail::allocator< T >)dr::mhp::__detail::allocator< T >inline
deallocate(T *ptr, std::size_t sz) (defined in dr::mhp::__detail::allocator< T >)dr::mhp::__detail::allocator< T >inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1allocator.html b/doxygen/classdr_1_1mhp_1_1____detail_1_1allocator.html new file mode 100644 index 0000000000..094b6579ea --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1allocator.html @@ -0,0 +1,101 @@ + + + + + + + +Distributed Ranges: dr::mhp::__detail::allocator< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mhp::__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_1mhp_1_1____detail_1_1md__segment-members.html b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment-members.html new file mode 100644 index 0000000000..cdc8590750 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment-members.html @@ -0,0 +1,97 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::__detail::md_segment< BaseSegment, Rank > Member List
+
+
+ +

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

+ + + + + + + + + + +
begin() const (defined in dr::mhp::__detail::md_segment< BaseSegment, Rank >)dr::mhp::__detail::md_segment< BaseSegment, Rank >inline
end() const (defined in dr::mhp::__detail::md_segment< BaseSegment, Rank >)dr::mhp::__detail::md_segment< BaseSegment, Rank >inline
halo() const (defined in dr::mhp::__detail::md_segment< BaseSegment, Rank >)dr::mhp::__detail::md_segment< BaseSegment, Rank >inline
index_type typedef (defined in dr::mhp::__detail::md_segment< BaseSegment, Rank >)dr::mhp::__detail::md_segment< BaseSegment, Rank >
md_segment() (defined in dr::mhp::__detail::md_segment< BaseSegment, Rank >)dr::mhp::__detail::md_segment< BaseSegment, Rank >inline
md_segment(index_type origin, BaseSegment segment, index_type tile_shape) (defined in dr::mhp::__detail::md_segment< BaseSegment, Rank >)dr::mhp::__detail::md_segment< BaseSegment, Rank >inline
mdspan() const (defined in dr::mhp::__detail::md_segment< BaseSegment, Rank >)dr::mhp::__detail::md_segment< BaseSegment, Rank >inline
origin() const (defined in dr::mhp::__detail::md_segment< BaseSegment, Rank >)dr::mhp::__detail::md_segment< BaseSegment, Rank >inline
root_mdspan() const (defined in dr::mhp::__detail::md_segment< BaseSegment, Rank >)dr::mhp::__detail::md_segment< BaseSegment, Rank >inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment.html b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment.html new file mode 100644 index 0000000000..afbf2fa7bc --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment.html @@ -0,0 +1,141 @@ + + + + + + + +Distributed Ranges: dr::mhp::__detail::md_segment< BaseSegment, Rank > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mhp::__detail::md_segment< BaseSegment, Rank > Class Template Reference
+
+
+
+Inheritance diagram for dr::mhp::__detail::md_segment< BaseSegment, Rank >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::mhp::__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 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_1mhp_1_1____detail_1_1md__segment__coll__graph.map b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__coll__graph.map new file mode 100644 index 0000000000..501cb9d589 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__coll__graph.md5 b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__coll__graph.md5 new file mode 100644 index 0000000000..b5f57e4480 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__coll__graph.md5 @@ -0,0 +1 @@ +32c602b5110c6a6f80ee3068771980cf \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__coll__graph.png b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__coll__graph.png new file mode 100644 index 0000000000..0b3b14512c Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__coll__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__inherit__graph.map b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__inherit__graph.map new file mode 100644 index 0000000000..501cb9d589 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__inherit__graph.md5 b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__inherit__graph.md5 new file mode 100644 index 0000000000..b5f57e4480 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__inherit__graph.md5 @@ -0,0 +1 @@ +32c602b5110c6a6f80ee3068771980cf \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__inherit__graph.png b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__inherit__graph.png new file mode 100644 index 0000000000..0b3b14512c Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1____detail_1_1md__segment__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment-members.html b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment-members.html new file mode 100644 index 0000000000..4877f15c19 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment-members.html @@ -0,0 +1,93 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout > Member List
+
+
+ +

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

+ + + + + + +
index_type typedef (defined in dr::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout >)dr::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout >
mdspan() const (defined in dr::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout >)dr::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout >inline
mdsub_segment() (defined in dr::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout >)dr::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout >inline
mdsub_segment(BaseSegment segment, const index_type &slice_starts, const index_type &slice_ends) (defined in dr::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout >)dr::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout >inline
root_mdspan() const (defined in dr::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout >)dr::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout >inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment.html b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment.html new file mode 100644 index 0000000000..3869428837 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment.html @@ -0,0 +1,129 @@ + + + + + + + +Distributed Ranges: dr::mhp::__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::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout > Class Template Reference
+
+
+
+Inheritance diagram for dr::mhp::__detail::mdsub_segment< BaseSegment, Rank, Layout >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::mhp::__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_1mhp_1_1____detail_1_1mdsub__segment__coll__graph.map b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__coll__graph.map new file mode 100644 index 0000000000..8a95289564 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__coll__graph.md5 b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__coll__graph.md5 new file mode 100644 index 0000000000..dd84d148a5 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__coll__graph.md5 @@ -0,0 +1 @@ +17d8ee7f9037f06217258245fe2c82e2 \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__coll__graph.png b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__coll__graph.png new file mode 100644 index 0000000000..f0279c0a90 Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__coll__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__inherit__graph.map b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__inherit__graph.map new file mode 100644 index 0000000000..8a95289564 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__inherit__graph.md5 b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__inherit__graph.md5 new file mode 100644 index 0000000000..dd84d148a5 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__inherit__graph.md5 @@ -0,0 +1 @@ +17d8ee7f9037f06217258245fe2c82e2 \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__inherit__graph.png b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__inherit__graph.png new file mode 100644 index 0000000000..f0279c0a90 Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1____detail_1_1mdsub__segment__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1distributed__mdarray-members.html b/doxygen/classdr_1_1mhp_1_1distributed__mdarray-members.html new file mode 100644 index 0000000000..a09e8ba824 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1distributed__mdarray-members.html @@ -0,0 +1,101 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::distributed_mdarray< T, Rank > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + +
begin() const (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >inline
distributed_mdarray(dr::__detail::dr_extents< Rank > shape, distribution dist=distribution()) (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >inline
end() const (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >inline
extent(std::size_t r) const (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >inline
grid() (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >inline
halo() const (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >inline
mdspan() const (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >inline
operator==(const distributed_mdarray &other) const (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >inline
operator[](auto n) (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >inline
segments() (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >inline
shape_type typedef (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >
size() const (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >inline
view() const (defined in dr::mhp::distributed_mdarray< T, Rank >)dr::mhp::distributed_mdarray< T, Rank >inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1distributed__mdarray.html b/doxygen/classdr_1_1mhp_1_1distributed__mdarray.html new file mode 100644 index 0000000000..c31ebc7874 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1distributed__mdarray.html @@ -0,0 +1,138 @@ + + + + + + + +Distributed Ranges: dr::mhp::distributed_mdarray< T, Rank > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mhp::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
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1distributed__vector-members.html b/doxygen/classdr_1_1mhp_1_1distributed__vector-members.html new file mode 100644 index 0000000000..34a43edb51 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1distributed__vector-members.html @@ -0,0 +1,103 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::distributed_vector< T > Member List
+
+
+ +

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

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

+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
 
+

Detailed Description

+
template<typename T>
+class dr::mhp::distributed_vector< T >

distributed vector

+

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

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

+ + + + + + + + + + + + + + + + + + + + + + +
difference_type typedef (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iterator
iterator() (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
iterator(const distributed_vector *parent, difference_type offset) (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
iterator_category typedef (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iterator
local() (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator*() const (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator+(difference_type n) const (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator+ (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorfriend
operator++() (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator++(int) (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator+=(difference_type n) (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator-(difference_type n) const (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator-(iterator other) const (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator--() (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator--(int) (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator-=(difference_type n) (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator<=>(iterator other) const (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator==(iterator other) const (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
operator[](difference_type n) const (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
segments() (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iteratorinline
value_type typedef (defined in dr::mhp::distributed_vector< T >::iterator)dr::mhp::distributed_vector< T >::iterator
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1distributed__vector_1_1iterator.html b/doxygen/classdr_1_1mhp_1_1distributed__vector_1_1iterator.html new file mode 100644 index 0000000000..1f4495ce03 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1distributed__vector_1_1iterator.html @@ -0,0 +1,163 @@ + + + + + + + +Distributed Ranges: dr::mhp::distributed_vector< T >::iterator Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Friends | +List of all members
+
dr::mhp::distributed_vector< T >::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_1mhp_1_1dv__segment-members.html b/doxygen/classdr_1_1mhp_1_1dv__segment-members.html new file mode 100644 index 0000000000..5ae7d7dc3a --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1dv__segment-members.html @@ -0,0 +1,96 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::dv_segment< DV > Member List
+
+
+ +

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

+ + + + + + + + + +
begin() const (defined in dr::mhp::dv_segment< DV >)dr::mhp::dv_segment< DV >inline
difference_type typedef (defined in dr::mhp::dv_segment< DV >)dr::mhp::dv_segment< DV >
dv_segment()=default (defined in dr::mhp::dv_segment< DV >)dr::mhp::dv_segment< DV >
dv_segment(DV *dv, std::size_t segment_index, std::size_t size) (defined in dr::mhp::dv_segment< DV >)dr::mhp::dv_segment< DV >inline
end() const (defined in dr::mhp::dv_segment< DV >)dr::mhp::dv_segment< DV >inline
is_local() const (defined in dr::mhp::dv_segment< DV >)dr::mhp::dv_segment< DV >inline
operator[](difference_type n) const (defined in dr::mhp::dv_segment< DV >)dr::mhp::dv_segment< DV >inline
size() const (defined in dr::mhp::dv_segment< DV >)dr::mhp::dv_segment< DV >inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1dv__segment.html b/doxygen/classdr_1_1mhp_1_1dv__segment.html new file mode 100644 index 0000000000..91755f6cea --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1dv__segment.html @@ -0,0 +1,120 @@ + + + + + + + +Distributed Ranges: dr::mhp::dv_segment< DV > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mhp::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)
 
+auto size () const
 
+auto begin () const
 
+auto end () 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_1mhp_1_1dv__segment__iterator-members.html b/doxygen/classdr_1_1mhp_1_1dv__segment__iterator-members.html new file mode 100644 index 0000000000..e28341a44a --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1dv__segment__iterator-members.html @@ -0,0 +1,116 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::dv_segment_iterator< DV > Member List
+
+
+ +

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

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

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

+ + + + + + + +
dv_segment_reference(const iterator it) (defined in dr::mhp::dv_segment_reference< DV >)dr::mhp::dv_segment_reference< DV >inline
operator value_type() const (defined in dr::mhp::dv_segment_reference< DV >)dr::mhp::dv_segment_reference< DV >inline
operator&() const (defined in dr::mhp::dv_segment_reference< DV >)dr::mhp::dv_segment_reference< DV >inline
operator=(const value_type &value) const (defined in dr::mhp::dv_segment_reference< DV >)dr::mhp::dv_segment_reference< DV >inline
operator=(const dv_segment_reference &other) const (defined in dr::mhp::dv_segment_reference< DV >)dr::mhp::dv_segment_reference< DV >inline
value_type typedef (defined in dr::mhp::dv_segment_reference< DV >)dr::mhp::dv_segment_reference< DV >
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1dv__segment__reference.html b/doxygen/classdr_1_1mhp_1_1dv__segment__reference.html new file mode 100644 index 0000000000..7db1744406 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1dv__segment__reference.html @@ -0,0 +1,117 @@ + + + + + + + +Distributed Ranges: dr::mhp::dv_segment_reference< DV > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mhp::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_1mhp_1_1halo__impl-members.html b/doxygen/classdr_1_1mhp_1_1halo__impl-members.html new file mode 100644 index 0000000000..0d934e61ad --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1halo__impl-members.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::halo_impl< Group > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + +
exchange() (defined in dr::mhp::halo_impl< Group >)dr::mhp::halo_impl< Group >inline
exchange_begin()dr::mhp::halo_impl< Group >inline
exchange_finalize()dr::mhp::halo_impl< Group >inline
group_type typedef (defined in dr::mhp::halo_impl< Group >)dr::mhp::halo_impl< Group >
halo_impl(const halo_impl &)=delete (defined in dr::mhp::halo_impl< Group >)dr::mhp::halo_impl< Group >
halo_impl(communicator comm, const std::vector< Group > &owned_groups, const std::vector< Group > &halo_groups, const Memory &memory=Memory())dr::mhp::halo_impl< Group >inline
max (defined in dr::mhp::halo_impl< Group >)dr::mhp::halo_impl< Group >
min (defined in dr::mhp::halo_impl< Group >)dr::mhp::halo_impl< Group >
multiplies (defined in dr::mhp::halo_impl< Group >)dr::mhp::halo_impl< Group >
operator=(const halo_impl &)=delete (defined in dr::mhp::halo_impl< Group >)dr::mhp::halo_impl< Group >
plus (defined in dr::mhp::halo_impl< Group >)dr::mhp::halo_impl< Group >
reduce_begin()dr::mhp::halo_impl< Group >inline
reduce_finalize(const auto &op)dr::mhp::halo_impl< Group >inline
reduce_finalize()dr::mhp::halo_impl< Group >inline
second (defined in dr::mhp::halo_impl< Group >)dr::mhp::halo_impl< Group >
~halo_impl() (defined in dr::mhp::halo_impl< Group >)dr::mhp::halo_impl< Group >inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1halo__impl.html b/doxygen/classdr_1_1mhp_1_1halo__impl.html new file mode 100644 index 0000000000..9a154ce30d --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1halo__impl.html @@ -0,0 +1,191 @@ + + + + + + + +Distributed Ranges: dr::mhp::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::mhp::halo_impl< Group > Class Template Reference
+
+
+
+Inheritance diagram for dr::mhp::halo_impl< Group >:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for dr::mhp::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::mhp::halo_impl::second_op second
 
+struct dr::mhp::halo_impl::plus_op plus
 
+struct dr::mhp::halo_impl::max_op max
 
+struct dr::mhp::halo_impl::min_op min
 
+struct dr::mhp::halo_impl::multiplies_op multiplies
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1halo__impl__coll__graph.map b/doxygen/classdr_1_1mhp_1_1halo__impl__coll__graph.map new file mode 100644 index 0000000000..0e9e6d2aaa --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1halo__impl__coll__graph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doxygen/classdr_1_1mhp_1_1halo__impl__coll__graph.md5 b/doxygen/classdr_1_1mhp_1_1halo__impl__coll__graph.md5 new file mode 100644 index 0000000000..8756720551 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1halo__impl__coll__graph.md5 @@ -0,0 +1 @@ +9ed93f635f37525846c7ee6cec6e66a8 \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1halo__impl__coll__graph.png b/doxygen/classdr_1_1mhp_1_1halo__impl__coll__graph.png new file mode 100644 index 0000000000..da78dfb251 Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1halo__impl__coll__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1halo__impl__inherit__graph.map b/doxygen/classdr_1_1mhp_1_1halo__impl__inherit__graph.map new file mode 100644 index 0000000000..df8c7c58bc --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1halo__impl__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/classdr_1_1mhp_1_1halo__impl__inherit__graph.md5 b/doxygen/classdr_1_1mhp_1_1halo__impl__inherit__graph.md5 new file mode 100644 index 0000000000..e839dfd758 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1halo__impl__inherit__graph.md5 @@ -0,0 +1 @@ +cb6c8e851fb63d39311a62e90b0771ea \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1halo__impl__inherit__graph.png b/doxygen/classdr_1_1mhp_1_1halo__impl__inherit__graph.png new file mode 100644 index 0000000000..569dc8848b Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1halo__impl__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1index__group-members.html b/doxygen/classdr_1_1mhp_1_1index__group-members.html new file mode 100644 index 0000000000..aa8d8f830b --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1index__group-members.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::index_group< T, Memory > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + +
buffer (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >
buffer_size() (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >inline
buffered (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >
data_pointer() (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >inline
data_size() (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >inline
element_type typedef (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >
index_group(T *data, std::size_t rank, const std::vector< std::size_t > &indices, const Memory &memory)dr::mhp::index_group< T, Memory >inline
index_group(const index_group &o) (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >inline
memory_type typedef (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >
pack() (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >inline
rank() (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >inline
receive (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >
request_index (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >
tag() (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >inline
unpack(const auto &op) (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >inline
~index_group() (defined in dr::mhp::index_group< T, Memory >)dr::mhp::index_group< T, Memory >inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1index__group.html b/doxygen/classdr_1_1mhp_1_1index__group.html new file mode 100644 index 0000000000..de5d803bdb --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1index__group.html @@ -0,0 +1,149 @@ + + + + + + + +Distributed Ranges: dr::mhp::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::mhp::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_1mhp_1_1segmented__view-members.html b/doxygen/classdr_1_1mhp_1_1segmented__view-members.html new file mode 100644 index 0000000000..73dbe9ae8b --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1segmented__view-members.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::segmented_view< R, SegTpl > Member List
+
+
+ +

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

+ + + + + +
begin() const (defined in dr::mhp::segmented_view< R, SegTpl >)dr::mhp::segmented_view< R, SegTpl >inline
end() const (defined in dr::mhp::segmented_view< R, SegTpl >)dr::mhp::segmented_view< R, SegTpl >inline
segmented_view(V1 &&r, V2 &&tpl) (defined in dr::mhp::segmented_view< R, SegTpl >)dr::mhp::segmented_view< R, SegTpl >inline
size() const (defined in dr::mhp::segmented_view< R, SegTpl >)dr::mhp::segmented_view< R, SegTpl >inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1segmented__view.html b/doxygen/classdr_1_1mhp_1_1segmented__view.html new file mode 100644 index 0000000000..c314c4c00b --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1segmented__view.html @@ -0,0 +1,126 @@ + + + + + + + +Distributed Ranges: dr::mhp::segmented_view< R, SegTpl > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mhp::segmented_view< R, SegTpl > Class Template Reference
+
+
+
+Inheritance diagram for dr::mhp::segmented_view< R, SegTpl >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::mhp::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_1mhp_1_1segmented__view__coll__graph.map b/doxygen/classdr_1_1mhp_1_1segmented__view__coll__graph.map new file mode 100644 index 0000000000..0965c1fd3d --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1segmented__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mhp_1_1segmented__view__coll__graph.md5 b/doxygen/classdr_1_1mhp_1_1segmented__view__coll__graph.md5 new file mode 100644 index 0000000000..84763a31dd --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1segmented__view__coll__graph.md5 @@ -0,0 +1 @@ +ed0bde1a185a8e9e803cbfe536ba7cee \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1segmented__view__coll__graph.png b/doxygen/classdr_1_1mhp_1_1segmented__view__coll__graph.png new file mode 100644 index 0000000000..8a29159797 Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1segmented__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1segmented__view__inherit__graph.map b/doxygen/classdr_1_1mhp_1_1segmented__view__inherit__graph.map new file mode 100644 index 0000000000..0965c1fd3d --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1segmented__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mhp_1_1segmented__view__inherit__graph.md5 b/doxygen/classdr_1_1mhp_1_1segmented__view__inherit__graph.md5 new file mode 100644 index 0000000000..84763a31dd --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1segmented__view__inherit__graph.md5 @@ -0,0 +1 @@ +ed0bde1a185a8e9e803cbfe536ba7cee \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1segmented__view__inherit__graph.png b/doxygen/classdr_1_1mhp_1_1segmented__view__inherit__graph.png new file mode 100644 index 0000000000..8a29159797 Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1segmented__view__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1segmented__view__iterator-members.html b/doxygen/classdr_1_1mhp_1_1segmented__view__iterator-members.html new file mode 100644 index 0000000000..f26b425f21 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1segmented__view__iterator-members.html @@ -0,0 +1,97 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel > Member List
+
+
+ +

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

+ + + + + + + + + + +
difference_type typedef (defined in dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >
iterator_category typedef (defined in dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >
operator*() const (defined in dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >inline
operator++() (defined in dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >inline
operator++(int) (defined in dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >inline
operator==(segmented_view_iterator other) const (defined in dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >inline
segmented_view_iterator() (defined in dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >inline
segmented_view_iterator(BaseIter base_begin, SegTplIter tpl_begin, SegTplSentinel tpl_end) (defined in dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >inline
value_type typedef (defined in dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >)dr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1segmented__view__iterator.html b/doxygen/classdr_1_1mhp_1_1segmented__view__iterator.html new file mode 100644 index 0000000000..0932e4cb1f --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1segmented__view__iterator.html @@ -0,0 +1,123 @@ + + + + + + + +Distributed Ranges: dr::mhp::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::mhp::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_1mhp_1_1span__group-members.html b/doxygen/classdr_1_1mhp_1_1span__group-members.html new file mode 100644 index 0000000000..a7747e2b3f --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1span__group-members.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::span_group< T, Memory > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + +
buffer (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >
buffer_size() (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >inline
buffered (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >
data_pointer() (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >inline
data_size() (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >inline
element_type typedef (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >
memory_type typedef (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >
pack() (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >inline
rank() (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >inline
receive (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >
request_index (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >
span_group(std::span< T > data, std::size_t rank, communicator::tag tag) (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >inline
tag() (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >inline
unpack() (defined in dr::mhp::span_group< T, Memory >)dr::mhp::span_group< T, Memory >inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1span__group.html b/doxygen/classdr_1_1mhp_1_1span__group.html new file mode 100644 index 0000000000..7bdbcf54ec --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1span__group.html @@ -0,0 +1,145 @@ + + + + + + + +Distributed Ranges: dr::mhp::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::mhp::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, communicator::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_1mhp_1_1span__halo-members.html b/doxygen/classdr_1_1mhp_1_1span__halo-members.html new file mode 100644 index 0000000000..1bc925e850 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1span__halo-members.html @@ -0,0 +1,107 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::span_halo< T, Memory > Member List
+
+
+ +

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

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

+Public Types

+using group_type = span_group< T, Memory >
 
- Public Types inherited from dr::mhp::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::mhp::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::mhp::halo_impl< Group >
+struct dr::mhp::halo_impl::second_op second
 
+struct dr::mhp::halo_impl::plus_op plus
 
+struct dr::mhp::halo_impl::max_op max
 
+struct dr::mhp::halo_impl::min_op min
 
+struct dr::mhp::halo_impl::multiplies_op multiplies
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1span__halo__coll__graph.map b/doxygen/classdr_1_1mhp_1_1span__halo__coll__graph.map new file mode 100644 index 0000000000..bfbfdd225e --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1span__halo__coll__graph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doxygen/classdr_1_1mhp_1_1span__halo__coll__graph.md5 b/doxygen/classdr_1_1mhp_1_1span__halo__coll__graph.md5 new file mode 100644 index 0000000000..a74512e77c --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1span__halo__coll__graph.md5 @@ -0,0 +1 @@ +339ecb454338c41f4a3de2ddb84e0614 \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1span__halo__coll__graph.png b/doxygen/classdr_1_1mhp_1_1span__halo__coll__graph.png new file mode 100644 index 0000000000..5e688449e9 Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1span__halo__coll__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1span__halo__inherit__graph.map b/doxygen/classdr_1_1mhp_1_1span__halo__inherit__graph.map new file mode 100644 index 0000000000..22c5e7ddee --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1span__halo__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mhp_1_1span__halo__inherit__graph.md5 b/doxygen/classdr_1_1mhp_1_1span__halo__inherit__graph.md5 new file mode 100644 index 0000000000..2f498c4695 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1span__halo__inherit__graph.md5 @@ -0,0 +1 @@ +2a023e9ee5a34bf8f15a767bc7629cba \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1span__halo__inherit__graph.png b/doxygen/classdr_1_1mhp_1_1span__halo__inherit__graph.png new file mode 100644 index 0000000000..944c9c9b08 Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1span__halo__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1subrange-members.html b/doxygen/classdr_1_1mhp_1_1subrange-members.html new file mode 100644 index 0000000000..34387956dc --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1subrange-members.html @@ -0,0 +1,96 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::subrange< DM > Member List
+
+
+ +

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

+ + + + + + + + + +
begin() const (defined in dr::mhp::subrange< DM >)dr::mhp::subrange< DM >inline
end() const (defined in dr::mhp::subrange< DM >)dr::mhp::subrange< DM >inline
halo() const (defined in dr::mhp::subrange< DM >)dr::mhp::subrange< DM >inline
iterator typedef (defined in dr::mhp::subrange< DM >)dr::mhp::subrange< DM >
segments() const (defined in dr::mhp::subrange< DM >)dr::mhp::subrange< DM >inline
size() (defined in dr::mhp::subrange< DM >)dr::mhp::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::mhp::subrange< DM >)dr::mhp::subrange< DM >inline
value_type typedef (defined in dr::mhp::subrange< DM >)dr::mhp::subrange< DM >
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1subrange.html b/doxygen/classdr_1_1mhp_1_1subrange.html new file mode 100644 index 0000000000..aeb42ad737 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1subrange.html @@ -0,0 +1,141 @@ + + + + + + + +Distributed Ranges: dr::mhp::subrange< DM > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::mhp::subrange< DM > Class Template Reference
+
+
+
+Inheritance diagram for dr::mhp::subrange< DM >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::mhp::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_1mhp_1_1subrange__coll__graph.map b/doxygen/classdr_1_1mhp_1_1subrange__coll__graph.map new file mode 100644 index 0000000000..9164e2c7b9 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1subrange__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mhp_1_1subrange__coll__graph.md5 b/doxygen/classdr_1_1mhp_1_1subrange__coll__graph.md5 new file mode 100644 index 0000000000..5c43e2a162 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1subrange__coll__graph.md5 @@ -0,0 +1 @@ +7366427c13ead459fa26760df3880a86 \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1subrange__coll__graph.png b/doxygen/classdr_1_1mhp_1_1subrange__coll__graph.png new file mode 100644 index 0000000000..edc90f5c69 Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1subrange__coll__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1subrange__inherit__graph.map b/doxygen/classdr_1_1mhp_1_1subrange__inherit__graph.map new file mode 100644 index 0000000000..9164e2c7b9 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1subrange__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mhp_1_1subrange__inherit__graph.md5 b/doxygen/classdr_1_1mhp_1_1subrange__inherit__graph.md5 new file mode 100644 index 0000000000..5c43e2a162 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1subrange__inherit__graph.md5 @@ -0,0 +1 @@ +7366427c13ead459fa26760df3880a86 \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1subrange__inherit__graph.png b/doxygen/classdr_1_1mhp_1_1subrange__inherit__graph.png new file mode 100644 index 0000000000..edc90f5c69 Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1subrange__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1subrange__iterator-members.html b/doxygen/classdr_1_1mhp_1_1subrange__iterator-members.html new file mode 100644 index 0000000000..e1b281689e --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1subrange__iterator-members.html @@ -0,0 +1,114 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::subrange_iterator< DM > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
difference_type typedef (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >
find_dm_offset() const (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
halo() (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
is_local() (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator!= (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >friend
operator!= (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >friend
operator*() const (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator+(difference_type n) const (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator+ (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >friend
operator++() (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator++(int) (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator+=(difference_type n) (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator-(const subrange_iterator &other) const noexcept (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator-(difference_type n) const (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator--() (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator--(int) (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator-=(difference_type n) (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator<=>(const subrange_iterator &other) const noexcept (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator== (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >friend
operator== (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >friend
operator[](int n) (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
operator[](std::pair< int, int > p) (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
segments() (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
subrange_iterator() (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::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::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >inline
value_type typedef (defined in dr::mhp::subrange_iterator< DM >)dr::mhp::subrange_iterator< DM >
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1subrange__iterator.html b/doxygen/classdr_1_1mhp_1_1subrange__iterator.html new file mode 100644 index 0000000000..93c2f481c7 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1subrange__iterator.html @@ -0,0 +1,178 @@ + + + + + + + +Distributed Ranges: dr::mhp::subrange_iterator< DM > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +Friends | +List of all members
+
dr::mhp::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_1mhp_1_1unstructured__halo-members.html b/doxygen/classdr_1_1mhp_1_1unstructured__halo-members.html new file mode 100644 index 0000000000..da8413b922 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1unstructured__halo-members.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::unstructured_halo< T, Memory > Member List
+
+
+ +

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

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

Constructor & Destructor Documentation

+ +

◆ unstructured_halo()

+ +
+
+
+template<typename T , typename Memory = default_memory<T>>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dr::mhp::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_1mhp_1_1unstructured__halo__coll__graph.map b/doxygen/classdr_1_1mhp_1_1unstructured__halo__coll__graph.map new file mode 100644 index 0000000000..8282ea08dd --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1unstructured__halo__coll__graph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doxygen/classdr_1_1mhp_1_1unstructured__halo__coll__graph.md5 b/doxygen/classdr_1_1mhp_1_1unstructured__halo__coll__graph.md5 new file mode 100644 index 0000000000..8dcadcc65f --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1unstructured__halo__coll__graph.md5 @@ -0,0 +1 @@ +d2edc76dfcd2df73dbda583a06edd017 \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1unstructured__halo__coll__graph.png b/doxygen/classdr_1_1mhp_1_1unstructured__halo__coll__graph.png new file mode 100644 index 0000000000..dcb6d51eb3 Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1unstructured__halo__coll__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1unstructured__halo__inherit__graph.map b/doxygen/classdr_1_1mhp_1_1unstructured__halo__inherit__graph.map new file mode 100644 index 0000000000..d63d72e694 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1unstructured__halo__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mhp_1_1unstructured__halo__inherit__graph.md5 b/doxygen/classdr_1_1mhp_1_1unstructured__halo__inherit__graph.md5 new file mode 100644 index 0000000000..29bc9e5e39 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1unstructured__halo__inherit__graph.md5 @@ -0,0 +1 @@ +a51814f1afe5a95125895473004d7180 \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1unstructured__halo__inherit__graph.png b/doxygen/classdr_1_1mhp_1_1unstructured__halo__inherit__graph.png new file mode 100644 index 0000000000..873ae8dfea Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1unstructured__halo__inherit__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1views_1_1enumerate__adapter__closure-members.html b/doxygen/classdr_1_1mhp_1_1views_1_1enumerate__adapter__closure-members.html new file mode 100644 index 0000000000..9f3916ca2a --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1views_1_1enumerate__adapter__closure-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::views::enumerate_adapter_closure Member List
+
+
+ +

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

+ + + +
operator()(R &&r) const (defined in dr::mhp::views::enumerate_adapter_closure)dr::mhp::views::enumerate_adapter_closureinline
operator| (defined in dr::mhp::views::enumerate_adapter_closure)dr::mhp::views::enumerate_adapter_closurefriend
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1views_1_1enumerate__adapter__closure.html b/doxygen/classdr_1_1mhp_1_1views_1_1enumerate__adapter__closure.html new file mode 100644 index 0000000000..fb60821180 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1views_1_1enumerate__adapter__closure.html @@ -0,0 +1,108 @@ + + + + + + + +Distributed Ranges: dr::mhp::views::enumerate_adapter_closure Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Friends | +List of all members
+
dr::mhp::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_1mhp_1_1views_1_1enumerate__fn__-members.html b/doxygen/classdr_1_1mhp_1_1views_1_1enumerate__fn__-members.html new file mode 100644 index 0000000000..83b0d01db1 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1views_1_1enumerate__fn__-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::views::enumerate_fn_ Member List
+
+
+ +

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

+ + + +
enumerate() const (defined in dr::mhp::views::enumerate_fn_)dr::mhp::views::enumerate_fn_inline
operator()(R &&r) const (defined in dr::mhp::views::enumerate_fn_)dr::mhp::views::enumerate_fn_inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1views_1_1enumerate__fn__.html b/doxygen/classdr_1_1mhp_1_1views_1_1enumerate__fn__.html new file mode 100644 index 0000000000..b4f6e789d5 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1views_1_1enumerate__fn__.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: dr::mhp::views::enumerate_fn_ Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mhp::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_1mhp_1_1views_1_1mdspan__adapter__closure-members.html b/doxygen/classdr_1_1mhp_1_1views_1_1mdspan__adapter__closure-members.html new file mode 100644 index 0000000000..398f00c8bb --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1views_1_1mdspan__adapter__closure-members.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::views::mdspan_adapter_closure< Rank > Member List
+
+
+ +

This is the complete list of members for dr::mhp::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::mhp::views::mdspan_adapter_closure< Rank >)dr::mhp::views::mdspan_adapter_closure< Rank >inline
mdspan_adapter_closure(dr::__detail::dr_extents< Rank > full_shape) (defined in dr::mhp::views::mdspan_adapter_closure< Rank >)dr::mhp::views::mdspan_adapter_closure< Rank >inline
operator()(R &&r) const (defined in dr::mhp::views::mdspan_adapter_closure< Rank >)dr::mhp::views::mdspan_adapter_closure< Rank >inline
operator| (defined in dr::mhp::views::mdspan_adapter_closure< Rank >)dr::mhp::views::mdspan_adapter_closure< Rank >friend
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1views_1_1mdspan__adapter__closure.html b/doxygen/classdr_1_1mhp_1_1views_1_1mdspan__adapter__closure.html new file mode 100644 index 0000000000..9aa434d1b8 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1views_1_1mdspan__adapter__closure.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: dr::mhp::views::mdspan_adapter_closure< Rank > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Friends | +List of all members
+
dr::mhp::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_1mhp_1_1views_1_1mdspan__fn__-members.html b/doxygen/classdr_1_1mhp_1_1views_1_1mdspan__fn__-members.html new file mode 100644 index 0000000000..e0cd130779 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1views_1_1mdspan__fn__-members.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::views::mdspan_fn_ Member List
+
+
+ +

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

+ + + + + +
operator()(R &&r, Shape &&full_shape, Shape &&tile_shape) const (defined in dr::mhp::views::mdspan_fn_)dr::mhp::views::mdspan_fn_inline
operator()(R &&r, Shape &&full_shape) const (defined in dr::mhp::views::mdspan_fn_)dr::mhp::views::mdspan_fn_inline
operator()(Shape &&full_shape, Shape &&tile_shape) const (defined in dr::mhp::views::mdspan_fn_)dr::mhp::views::mdspan_fn_inline
operator()(Shape &&full_shape) const (defined in dr::mhp::views::mdspan_fn_)dr::mhp::views::mdspan_fn_inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1views_1_1mdspan__fn__.html b/doxygen/classdr_1_1mhp_1_1views_1_1mdspan__fn__.html new file mode 100644 index 0000000000..481cc2d0d6 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1views_1_1mdspan__fn__.html @@ -0,0 +1,111 @@ + + + + + + + +Distributed Ranges: dr::mhp::views::mdspan_fn_ Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mhp::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_1mhp_1_1views_1_1submdspan__adapter__closure-members.html b/doxygen/classdr_1_1mhp_1_1views_1_1submdspan__adapter__closure-members.html new file mode 100644 index 0000000000..38db243464 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1views_1_1submdspan__adapter__closure-members.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::views::submdspan_adapter_closure< Extents > Member List
+
+
+ +

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

+ + + + +
operator()(R &&r) const (defined in dr::mhp::views::submdspan_adapter_closure< Extents >)dr::mhp::views::submdspan_adapter_closure< Extents >inline
operator| (defined in dr::mhp::views::submdspan_adapter_closure< Extents >)dr::mhp::views::submdspan_adapter_closure< Extents >friend
submdspan_adapter_closure(Extents slice_starts, Extents slice_ends) (defined in dr::mhp::views::submdspan_adapter_closure< Extents >)dr::mhp::views::submdspan_adapter_closure< Extents >inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1views_1_1submdspan__adapter__closure.html b/doxygen/classdr_1_1mhp_1_1views_1_1submdspan__adapter__closure.html new file mode 100644 index 0000000000..417145b4f8 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1views_1_1submdspan__adapter__closure.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: dr::mhp::views::submdspan_adapter_closure< Extents > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Friends | +List of all members
+
dr::mhp::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_1mhp_1_1views_1_1submdspan__fn__-members.html b/doxygen/classdr_1_1mhp_1_1views_1_1submdspan__fn__-members.html new file mode 100644 index 0000000000..f7807835ff --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1views_1_1submdspan__fn__-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::views::submdspan_fn_ Member List
+
+
+ +

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

+ + + +
operator()(R r, Extents &&slice_starts, Extents &&slice_ends) const (defined in dr::mhp::views::submdspan_fn_)dr::mhp::views::submdspan_fn_inline
operator()(Extents &&slice_starts, Extents &&slice_ends) const (defined in dr::mhp::views::submdspan_fn_)dr::mhp::views::submdspan_fn_inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1views_1_1submdspan__fn__.html b/doxygen/classdr_1_1mhp_1_1views_1_1submdspan__fn__.html new file mode 100644 index 0000000000..d38921c2bf --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1views_1_1submdspan__fn__.html @@ -0,0 +1,103 @@ + + + + + + + +Distributed Ranges: dr::mhp::views::submdspan_fn_ Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mhp::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_1mhp_1_1zip__iterator-members.html b/doxygen/classdr_1_1mhp_1_1zip__iterator-members.html new file mode 100644 index 0000000000..91e4fcc8bf --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1zip__iterator-members.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::zip_iterator< RngIter, BaseIters > Member List
+
+
+ +

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

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

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

+ + + + + + + + + + +
base() const (defined in dr::mhp::zip_view< Rs >)dr::mhp::zip_view< Rs >inline
begin() const (defined in dr::mhp::zip_view< Rs >)dr::mhp::zip_view< Rs >inline
end() const (defined in dr::mhp::zip_view< Rs >)dr::mhp::zip_view< Rs >inline
local() const (defined in dr::mhp::zip_view< Rs >)dr::mhp::zip_view< Rs >inline
operator[](difference_type n) const (defined in dr::mhp::zip_view< Rs >)dr::mhp::zip_view< Rs >inline
rank() const (defined in dr::mhp::zip_view< Rs >)dr::mhp::zip_view< Rs >inline
segments() const (defined in dr::mhp::zip_view< Rs >)dr::mhp::zip_view< Rs >inline
size() const (defined in dr::mhp::zip_view< Rs >)dr::mhp::zip_view< Rs >inline
zip_view(Rs... rs) (defined in dr::mhp::zip_view< Rs >)dr::mhp::zip_view< Rs >inline
+ + + + diff --git a/doxygen/classdr_1_1mhp_1_1zip__view.html b/doxygen/classdr_1_1mhp_1_1zip__view.html new file mode 100644 index 0000000000..51f297b75a --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1zip__view.html @@ -0,0 +1,140 @@ + + + + + + + +Distributed Ranges: dr::mhp::zip_view< Rs > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::mhp::zip_view< Rs > Class Template Reference
+
+
+
+Inheritance diagram for dr::mhp::zip_view< Rs >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::mhp::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_1mhp_1_1zip__view__coll__graph.map b/doxygen/classdr_1_1mhp_1_1zip__view__coll__graph.map new file mode 100644 index 0000000000..29f00ad353 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1zip__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mhp_1_1zip__view__coll__graph.md5 b/doxygen/classdr_1_1mhp_1_1zip__view__coll__graph.md5 new file mode 100644 index 0000000000..1e68ba4cfc --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1zip__view__coll__graph.md5 @@ -0,0 +1 @@ +15711b5e6cc72b2a8cc80ea5085406d2 \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1zip__view__coll__graph.png b/doxygen/classdr_1_1mhp_1_1zip__view__coll__graph.png new file mode 100644 index 0000000000..c8d70dc6a1 Binary files /dev/null and b/doxygen/classdr_1_1mhp_1_1zip__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1mhp_1_1zip__view__inherit__graph.map b/doxygen/classdr_1_1mhp_1_1zip__view__inherit__graph.map new file mode 100644 index 0000000000..29f00ad353 --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1zip__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1mhp_1_1zip__view__inherit__graph.md5 b/doxygen/classdr_1_1mhp_1_1zip__view__inherit__graph.md5 new file mode 100644 index 0000000000..1e68ba4cfc --- /dev/null +++ b/doxygen/classdr_1_1mhp_1_1zip__view__inherit__graph.md5 @@ -0,0 +1 @@ +15711b5e6cc72b2a8cc80ea5085406d2 \ No newline at end of file diff --git a/doxygen/classdr_1_1mhp_1_1zip__view__inherit__graph.png b/doxygen/classdr_1_1mhp_1_1zip__view__inherit__graph.png new file mode 100644 index 0000000000..c8d70dc6a1 Binary files /dev/null and b/doxygen/classdr_1_1mhp_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..71b0edc7da --- /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..b182e39e45 --- /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..e93378bb20 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..e93378bb20 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..806daa8185 --- /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_1shp_1_1____detail_1_1coo__matrix-members.html b/doxygen/classdr_1_1shp_1_1____detail_1_1coo__matrix-members.html new file mode 100644 index 0000000000..821d57f104 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1____detail_1_1coo__matrix-members.html @@ -0,0 +1,128 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::__detail::coo_matrix< T, I, Allocator > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
allocator_type typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
assign_tuples(InputIt first, InputIt last) (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
backend_allocator_type typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
backend_type typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
begin() noexcept (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
begin() const noexcept (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
const_iterator typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
const_reference typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
coo_matrix(dr::index< I > shape) (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
coo_matrix()=default (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
coo_matrix(const coo_matrix &)=default (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
coo_matrix(coo_matrix &&)=default (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
difference_type typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
end() noexcept (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
end() const noexcept (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
find(key_type key) noexcept (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
find(key_type key) const noexcept (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
index_type typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
insert(InputIt first, InputIt last) (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
insert(value_type &&value) (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
insert(const value_type &value) (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
insert_or_assign(key_type k, M &&obj) (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
iterator typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
key_type typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
map_type typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
nbytes() const noexcept (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
operator=(const coo_matrix &)=default (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
operator=(coo_matrix &&)=default (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
push_back(InputIt first, InputIt last) (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
push_back(const value_type &value) (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
reference typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
reserve(size_type new_cap) (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
reshape(dr::index< I > shape) (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
scalar_reference typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
scalar_type typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
shape() const noexcept (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
size() const noexcept (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >inline
size_type typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
value_type typedef (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
~coo_matrix()=default (defined in dr::shp::__detail::coo_matrix< T, I, Allocator >)dr::shp::__detail::coo_matrix< T, I, Allocator >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1____detail_1_1coo__matrix.html b/doxygen/classdr_1_1shp_1_1____detail_1_1coo__matrix.html new file mode 100644 index 0000000000..075bc202bb --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1____detail_1_1coo__matrix.html @@ -0,0 +1,217 @@ + + + + + + + +Distributed Ranges: dr::shp::__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::shp::__detail::coo_matrix< T, I, Allocator > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using value_type = dr::shp::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::shp::matrix_ref< T, I >
 
+using const_reference = dr::shp::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_1shp_1_1block__cyclic-members.html b/doxygen/classdr_1_1shp_1_1block__cyclic-members.html new file mode 100644 index 0000000000..1a6cd7efaf --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1block__cyclic-members.html @@ -0,0 +1,96 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::block_cyclic Member List
+
+
+ +

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

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

+Public Member Functions

block_cyclic (dr::index<> tile_shape={dr::shp::tile::div, dr::shp::tile::div}, dr::index<> grid_shape=detail::factor(dr::shp::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::shp::block_cyclic::clone () const
+
+inlinevirtualnoexcept
+
+ +

Implements dr::shp::matrix_partition.

+ +
+
+ +

◆ grid_shape()

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

Implements dr::shp::matrix_partition.

+ +
+
+ +

◆ tile_rank()

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

Implements dr::shp::matrix_partition.

+ +
+
+ +

◆ tile_shape()

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

Implements dr::shp::matrix_partition.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1block__cyclic__coll__graph.map b/doxygen/classdr_1_1shp_1_1block__cyclic__coll__graph.map new file mode 100644 index 0000000000..714e5df746 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1block__cyclic__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1block__cyclic__coll__graph.md5 b/doxygen/classdr_1_1shp_1_1block__cyclic__coll__graph.md5 new file mode 100644 index 0000000000..86452a4ce0 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1block__cyclic__coll__graph.md5 @@ -0,0 +1 @@ +a37c0a4433a9d6ab0d7b3d94aa0b1399 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1block__cyclic__coll__graph.png b/doxygen/classdr_1_1shp_1_1block__cyclic__coll__graph.png new file mode 100644 index 0000000000..6888ad7aeb Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1block__cyclic__coll__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1block__cyclic__inherit__graph.map b/doxygen/classdr_1_1shp_1_1block__cyclic__inherit__graph.map new file mode 100644 index 0000000000..714e5df746 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1block__cyclic__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1block__cyclic__inherit__graph.md5 b/doxygen/classdr_1_1shp_1_1block__cyclic__inherit__graph.md5 new file mode 100644 index 0000000000..86452a4ce0 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1block__cyclic__inherit__graph.md5 @@ -0,0 +1 @@ +a37c0a4433a9d6ab0d7b3d94aa0b1399 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1block__cyclic__inherit__graph.png b/doxygen/classdr_1_1shp_1_1block__cyclic__inherit__graph.png new file mode 100644 index 0000000000..6888ad7aeb Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1block__cyclic__inherit__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1buffered__allocator-members.html b/doxygen/classdr_1_1shp_1_1buffered__allocator-members.html new file mode 100644 index 0000000000..1f03559409 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1buffered__allocator-members.html @@ -0,0 +1,100 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::buffered_allocator< Allocator > Member List
+
+
+ +

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

+ + + + + + + + + + + + + +
allocate(std::size_t size) (defined in dr::shp::buffered_allocator< Allocator >)dr::shp::buffered_allocator< Allocator >inline
buffered_allocator(const Allocator &alloc, std::size_t buffer_size, std::size_t n_buffers) (defined in dr::shp::buffered_allocator< Allocator >)dr::shp::buffered_allocator< Allocator >inline
const_pointer typedef (defined in dr::shp::buffered_allocator< Allocator >)dr::shp::buffered_allocator< Allocator >
deallocate(pointer ptr, std::size_t n) (defined in dr::shp::buffered_allocator< Allocator >)dr::shp::buffered_allocator< Allocator >inline
difference_type typedef (defined in dr::shp::buffered_allocator< Allocator >)dr::shp::buffered_allocator< Allocator >
is_always_equal typedef (defined in dr::shp::buffered_allocator< Allocator >)dr::shp::buffered_allocator< Allocator >
operator!=(const buffered_allocator &) const =default (defined in dr::shp::buffered_allocator< Allocator >)dr::shp::buffered_allocator< Allocator >
operator==(const buffered_allocator &) const =default (defined in dr::shp::buffered_allocator< Allocator >)dr::shp::buffered_allocator< Allocator >
pointer typedef (defined in dr::shp::buffered_allocator< Allocator >)dr::shp::buffered_allocator< Allocator >
size_type typedef (defined in dr::shp::buffered_allocator< Allocator >)dr::shp::buffered_allocator< Allocator >
value_type typedef (defined in dr::shp::buffered_allocator< Allocator >)dr::shp::buffered_allocator< Allocator >
~buffered_allocator() (defined in dr::shp::buffered_allocator< Allocator >)dr::shp::buffered_allocator< Allocator >inline
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1buffered__allocator.html b/doxygen/classdr_1_1shp_1_1buffered__allocator.html new file mode 100644 index 0000000000..835ce2a3e0 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1buffered__allocator.html @@ -0,0 +1,132 @@ + + + + + + + +Distributed Ranges: dr::shp::buffered_allocator< Allocator > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::shp::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_1shp_1_1csr__matrix__view-members.html b/doxygen/classdr_1_1shp_1_1csr__matrix__view-members.html new file mode 100644 index 0000000000..132cff501b --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1csr__matrix__view-members.html @@ -0,0 +1,109 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::csr_matrix_view< T, I, TIter, IIter > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + +
begin() const (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >inline
colind_data() const (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::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::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::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::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >inline
difference_type typedef (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >
end() const (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >inline
index_type typedef (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >
iterator typedef (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >
key_type typedef (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >
map_type typedef (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >
rank() const (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >inline
reference typedef (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >
row(I row_index) const (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >inline
rowptr_data() const (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >inline
scalar_reference typedef (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >
scalar_type typedef (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >
shape() const noexcept (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >inline
size() const noexcept (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >inline
size_type typedef (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >
submatrix(key_type rows, key_type columns) const (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >inline
values_data() const (defined in dr::shp::csr_matrix_view< T, I, TIter, IIter >)dr::shp::csr_matrix_view< T, I, TIter, IIter >inline
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1csr__matrix__view.html b/doxygen/classdr_1_1shp_1_1csr__matrix__view.html new file mode 100644 index 0000000000..152ce27b7f --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1csr__matrix__view.html @@ -0,0 +1,180 @@ + + + + + + + +Distributed Ranges: dr::shp::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::shp::csr_matrix_view< T, I, TIter, IIter > Class Template Reference
+
+
+
+Inheritance diagram for dr::shp::csr_matrix_view< T, I, TIter, IIter >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::shp::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::shp::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_1shp_1_1csr__matrix__view__accessor-members.html b/doxygen/classdr_1_1shp_1_1csr__matrix__view__accessor-members.html new file mode 100644 index 0000000000..e41f978450 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1csr__matrix__view__accessor-members.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
csr_matrix_view_accessor() noexcept=default (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
csr_matrix_view_accessor(const csr_matrix_view_accessor &) noexcept=default (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::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::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::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::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
difference_type typedef (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
fast_backward_row() noexcept (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
fast_forward_row() noexcept (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
index_type typedef (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
iterator_accessor typedef (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
iterator_category typedef (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
key_type typedef (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
nonconst_iterator_accessor typedef (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
operator*() const noexcept (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
operator+=(difference_type offset) noexcept (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
operator=(const csr_matrix_view_accessor &) noexcept=default (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
operator==(const iterator_accessor &other) const noexcept (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >inline
reference typedef (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
scalar_reference typedef (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
scalar_type typedef (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
size_type typedef (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
value_type typedef (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
~csr_matrix_view_accessor() noexcept=default (defined in dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >)dr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1csr__matrix__view__accessor.html b/doxygen/classdr_1_1shp_1_1csr__matrix__view__accessor.html new file mode 100644 index 0000000000..2497c8566b --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1csr__matrix__view__accessor.html @@ -0,0 +1,168 @@ + + + + + + + +Distributed Ranges: dr::shp::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::shp::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::shp::matrix_entry< scalar_type, I >
 
+using reference = dr::shp::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_1shp_1_1csr__matrix__view__coll__graph.map b/doxygen/classdr_1_1shp_1_1csr__matrix__view__coll__graph.map new file mode 100644 index 0000000000..7aa42f08fc --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1csr__matrix__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1csr__matrix__view__coll__graph.md5 b/doxygen/classdr_1_1shp_1_1csr__matrix__view__coll__graph.md5 new file mode 100644 index 0000000000..a9cdfb0757 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1csr__matrix__view__coll__graph.md5 @@ -0,0 +1 @@ +40226492c709cafb69462030b3a909b4 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1csr__matrix__view__coll__graph.png b/doxygen/classdr_1_1shp_1_1csr__matrix__view__coll__graph.png new file mode 100644 index 0000000000..d0bcb0badc Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1csr__matrix__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1csr__matrix__view__inherit__graph.map b/doxygen/classdr_1_1shp_1_1csr__matrix__view__inherit__graph.map new file mode 100644 index 0000000000..7aa42f08fc --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1csr__matrix__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1csr__matrix__view__inherit__graph.md5 b/doxygen/classdr_1_1shp_1_1csr__matrix__view__inherit__graph.md5 new file mode 100644 index 0000000000..a9cdfb0757 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1csr__matrix__view__inherit__graph.md5 @@ -0,0 +1 @@ +40226492c709cafb69462030b3a909b4 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1csr__matrix__view__inherit__graph.png b/doxygen/classdr_1_1shp_1_1csr__matrix__view__inherit__graph.png new file mode 100644 index 0000000000..d0bcb0badc Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1csr__matrix__view__inherit__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix-members.html b/doxygen/classdr_1_1shp_1_1dense__matrix-members.html new file mode 100644 index 0000000000..bf55664265 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix-members.html @@ -0,0 +1,114 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::dense_matrix< T, Allocator > Member List
+
+
+ +

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

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

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

+ + + + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
data() const noexcept (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >inline
dense_matrix_accessor() noexcept=default (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
dense_matrix_accessor(const dense_matrix_accessor &) noexcept=default (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
dense_matrix_accessor(Iter data, key_type idx, key_type matrix_shape, size_type ld) noexcept (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::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::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >inline
difference_type typedef (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
iterator_accessor typedef (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
iterator_category typedef (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
key_type typedef (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
nonconst_iterator_accessor typedef (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
operator*() const noexcept (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >inline
operator+=(difference_type offset) noexcept (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >inline
operator=(const dense_matrix_accessor &) noexcept=default (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
operator==(const iterator_accessor &other) const noexcept (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >inline
reference typedef (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
scalar_reference typedef (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
scalar_type typedef (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
size_type typedef (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
value_type typedef (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
~dense_matrix_accessor() noexcept=default (defined in dr::shp::dense_matrix_accessor< T, Iter >)dr::shp::dense_matrix_accessor< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__accessor.html b/doxygen/classdr_1_1shp_1_1dense__matrix__accessor.html new file mode 100644 index 0000000000..0a4aa9c754 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__accessor.html @@ -0,0 +1,162 @@ + + + + + + + +Distributed Ranges: dr::shp::dense_matrix_accessor< T, Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::shp::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::shp::matrix_entry< scalar_type, std::size_t >
 
+using reference = dr::shp::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_1shp_1_1dense__matrix__column__accessor-members.html b/doxygen/classdr_1_1shp_1_1dense__matrix__column__accessor-members.html new file mode 100644 index 0000000000..1b0d33fc71 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__column__accessor-members.html @@ -0,0 +1,109 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::dense_matrix_column_accessor< T, Iter > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
dense_matrix_column_accessor() noexcept=default (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
dense_matrix_column_accessor(const dense_matrix_column_accessor &) noexcept=default (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::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::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >inline
difference_type typedef (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
iterator_accessor typedef (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
iterator_category typedef (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
key_type typedef (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
nonconst_iterator_accessor typedef (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
operator*() const noexcept (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >inline
operator+=(difference_type offset) noexcept (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >inline
operator=(const dense_matrix_column_accessor &) noexcept=default (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
operator==(const iterator_accessor &other) const noexcept (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >inline
reference typedef (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
scalar_reference typedef (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
scalar_value_type typedef (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
size_type typedef (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
value_type typedef (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
~dense_matrix_column_accessor() noexcept=default (defined in dr::shp::dense_matrix_column_accessor< T, Iter >)dr::shp::dense_matrix_column_accessor< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__column__accessor.html b/doxygen/classdr_1_1shp_1_1dense__matrix__column__accessor.html new file mode 100644 index 0000000000..0bc6a90ac7 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__column__accessor.html @@ -0,0 +1,156 @@ + + + + + + + +Distributed Ranges: dr::shp::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::shp::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::shp::matrix_entry< scalar_value_type, std::size_t >
 
+using reference = dr::shp::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_1shp_1_1dense__matrix__column__view-members.html b/doxygen/classdr_1_1shp_1_1dense__matrix__column__view-members.html new file mode 100644 index 0000000000..de8fbfae28 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__column__view-members.html @@ -0,0 +1,103 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::dense_matrix_column_view< T, Iter > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + +
begin() const (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >inline
column_idx_ (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >
data_ (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::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::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >inline
difference_type typedef (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >
end() const (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >inline
iterator typedef (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >
key_type typedef (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >
ld_ (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >
map_type typedef (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >
operator[](size_type idx) (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >inline
scalar_reference typedef (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >
size() const noexcept (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >inline
size_ (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >
size_type typedef (defined in dr::shp::dense_matrix_column_view< T, Iter >)dr::shp::dense_matrix_column_view< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__column__view.html b/doxygen/classdr_1_1shp_1_1dense__matrix__column__view.html new file mode 100644 index 0000000000..b2bac3dd33 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__column__view.html @@ -0,0 +1,157 @@ + + + + + + + +Distributed Ranges: dr::shp::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::shp::dense_matrix_column_view< T, Iter > Class Template Reference
+
+
+
+Collaboration diagram for dr::shp::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_1shp_1_1dense__matrix__column__view__coll__graph.map b/doxygen/classdr_1_1shp_1_1dense__matrix__column__view__coll__graph.map new file mode 100644 index 0000000000..24de4bcec4 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__column__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__column__view__coll__graph.md5 b/doxygen/classdr_1_1shp_1_1dense__matrix__column__view__coll__graph.md5 new file mode 100644 index 0000000000..4023cb5eab --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__column__view__coll__graph.md5 @@ -0,0 +1 @@ +6fbe1a3aad682d8fb401e6ec38d3b3e1 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__column__view__coll__graph.png b/doxygen/classdr_1_1shp_1_1dense__matrix__column__view__coll__graph.png new file mode 100644 index 0000000000..11239804cd Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1dense__matrix__column__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__row__accessor-members.html b/doxygen/classdr_1_1shp_1_1dense__matrix__row__accessor-members.html new file mode 100644 index 0000000000..f03e688b22 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__row__accessor-members.html @@ -0,0 +1,109 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::dense_matrix_row_accessor< T, Iter > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
dense_matrix_row_accessor() noexcept=default (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
dense_matrix_row_accessor(const dense_matrix_row_accessor &) noexcept=default (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
dense_matrix_row_accessor(Iter data, std::size_t i, std::size_t j) noexcept (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >inline
difference_type typedef (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
iterator_accessor typedef (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
iterator_category typedef (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
key_type typedef (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
nonconst_iterator_accessor typedef (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
operator*() const noexcept (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >inline
operator+=(difference_type offset) noexcept (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >inline
operator=(const dense_matrix_row_accessor &) noexcept=default (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
operator==(const iterator_accessor &other) const noexcept (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >inline
reference typedef (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
scalar_reference typedef (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
scalar_value_type typedef (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
size_type typedef (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
value_type typedef (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
~dense_matrix_row_accessor() noexcept=default (defined in dr::shp::dense_matrix_row_accessor< T, Iter >)dr::shp::dense_matrix_row_accessor< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__row__accessor.html b/doxygen/classdr_1_1shp_1_1dense__matrix__row__accessor.html new file mode 100644 index 0000000000..e804395cbb --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__row__accessor.html @@ -0,0 +1,156 @@ + + + + + + + +Distributed Ranges: dr::shp::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::shp::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::shp::matrix_entry< scalar_value_type, std::size_t >
 
+using reference = dr::shp::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_1shp_1_1dense__matrix__row__view-members.html b/doxygen/classdr_1_1shp_1_1dense__matrix__row__view-members.html new file mode 100644 index 0000000000..52e1477847 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__row__view-members.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::dense_matrix_row_view< T, Iter > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + +
begin() const (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >inline
data_ (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >
dense_matrix_row_view(Iter data, size_type row_idx, size_type size) (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >inline
difference_type typedef (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >
end() const (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >inline
iterator typedef (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >
key_type typedef (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >
map_type typedef (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >
operator[](size_type idx) (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >inline
row_idx_ (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >
scalar_reference typedef (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >
size() const noexcept (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >inline
size_ (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >
size_type typedef (defined in dr::shp::dense_matrix_row_view< T, Iter >)dr::shp::dense_matrix_row_view< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__row__view.html b/doxygen/classdr_1_1shp_1_1dense__matrix__row__view.html new file mode 100644 index 0000000000..e5d3b34b52 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__row__view.html @@ -0,0 +1,154 @@ + + + + + + + +Distributed Ranges: dr::shp::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::shp::dense_matrix_row_view< T, Iter > Class Template Reference
+
+
+
+Collaboration diagram for dr::shp::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_1shp_1_1dense__matrix__row__view__coll__graph.map b/doxygen/classdr_1_1shp_1_1dense__matrix__row__view__coll__graph.map new file mode 100644 index 0000000000..ff227060ae --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__row__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__row__view__coll__graph.md5 b/doxygen/classdr_1_1shp_1_1dense__matrix__row__view__coll__graph.md5 new file mode 100644 index 0000000000..f81e7e4288 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__row__view__coll__graph.md5 @@ -0,0 +1 @@ +fabc8386b4baff43a577823d3a41147c \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__row__view__coll__graph.png b/doxygen/classdr_1_1shp_1_1dense__matrix__row__view__coll__graph.png new file mode 100644 index 0000000000..dbc8c4e7ec Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1dense__matrix__row__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__view-members.html b/doxygen/classdr_1_1shp_1_1dense__matrix__view-members.html new file mode 100644 index 0000000000..e902af125f --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__view-members.html @@ -0,0 +1,109 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::dense_matrix_view< T, Iter > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + +
begin() const (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
column(size_type column_index) const (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
data() const (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
dense_matrix_view(Iter data, key_type shape, size_type ld, size_type rank) (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::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::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
dense_matrix_view(dense_matrix< T, Allocator > &m) (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
difference_type typedef (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >
end() const (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
iterator typedef (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >
key_type typedef (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >
ld() const (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
local() const (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
map_type typedef (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >
operator[](key_type idx) const (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
rank() const (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
reference typedef (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >
row(size_type row_index) const (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
scalar_reference typedef (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >
shape() const noexcept (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
size() const noexcept (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >inline
size_type typedef (defined in dr::shp::dense_matrix_view< T, Iter >)dr::shp::dense_matrix_view< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__view.html b/doxygen/classdr_1_1shp_1_1dense__matrix__view.html new file mode 100644 index 0000000000..0c29e1c226 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__view.html @@ -0,0 +1,182 @@ + + + + + + + +Distributed Ranges: dr::shp::dense_matrix_view< T, Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::shp::dense_matrix_view< T, Iter > Class Template Reference
+
+
+
+Inheritance diagram for dr::shp::dense_matrix_view< T, Iter >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::shp::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::shp::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_1shp_1_1dense__matrix__view__coll__graph.map b/doxygen/classdr_1_1shp_1_1dense__matrix__view__coll__graph.map new file mode 100644 index 0000000000..3b14aa35ce --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__view__coll__graph.md5 b/doxygen/classdr_1_1shp_1_1dense__matrix__view__coll__graph.md5 new file mode 100644 index 0000000000..9409ea14a6 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__view__coll__graph.md5 @@ -0,0 +1 @@ +2428038b7a1eba70bf99d13cb6901475 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__view__coll__graph.png b/doxygen/classdr_1_1shp_1_1dense__matrix__view__coll__graph.png new file mode 100644 index 0000000000..6a54c66718 Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1dense__matrix__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__view__inherit__graph.map b/doxygen/classdr_1_1shp_1_1dense__matrix__view__inherit__graph.map new file mode 100644 index 0000000000..3b14aa35ce --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__view__inherit__graph.md5 b/doxygen/classdr_1_1shp_1_1dense__matrix__view__inherit__graph.md5 new file mode 100644 index 0000000000..9409ea14a6 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1dense__matrix__view__inherit__graph.md5 @@ -0,0 +1 @@ +2428038b7a1eba70bf99d13cb6901475 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1dense__matrix__view__inherit__graph.png b/doxygen/classdr_1_1shp_1_1dense__matrix__view__inherit__graph.png new file mode 100644 index 0000000000..6a54c66718 Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1dense__matrix__view__inherit__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1device__allocator-members.html b/doxygen/classdr_1_1shp_1_1device__allocator-members.html new file mode 100644 index 0000000000..3163d39a85 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__allocator-members.html @@ -0,0 +1,108 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::device_allocator< T, Alignment > Member List
+
+
+ +

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

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

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
const_pointer typedef (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
const_pointer (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
device_ptr(T *pointer) noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
device_ptr() noexcept=default (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
device_ptr(const device_ptr &) noexcept=default (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
device_ptr(std::nullptr_t) noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
difference_type typedef (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
get_raw_pointer() const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
iterator_category typedef (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
local() const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
nonconst_pointer typedef (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
nonconst_pointer (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
operator const_pointer() const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator device_ptr< const void >() const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator device_ptr< void >() const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator!=(std::nullptr_t) const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator!=(const device_ptr &) const noexcept=default (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
operator*() const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator+(difference_type offset) const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator+ (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >friend
operator++() noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator++(int) noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator+=(difference_type offset) noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator-(difference_type offset) const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator-(const_pointer other) const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator-(pointer other) const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator--() noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator--(int) noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator-=(difference_type offset) noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator<(const_pointer other) const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator<=(const_pointer other) const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator=(const device_ptr &) noexcept=default (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
operator=(std::nullptr_t) noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator==(std::nullptr_t) const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator==(const device_ptr &) const noexcept=default (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
operator>(const_pointer other) const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator>=(const_pointer other) const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
operator[](difference_type offset) const noexcept (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >inline
pointer typedef (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
reference typedef (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
value_type typedef (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
~device_ptr() noexcept=default (defined in dr::shp::device_ptr< T >)dr::shp::device_ptr< T >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1device__ptr.html b/doxygen/classdr_1_1shp_1_1device__ptr.html new file mode 100644 index 0000000000..b1a957eb1d --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__ptr.html @@ -0,0 +1,227 @@ + + + + + + + +Distributed Ranges: dr::shp::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::shp::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_1shp_1_1device__ref-members.html b/doxygen/classdr_1_1shp_1_1device__ref-members.html new file mode 100644 index 0000000000..8fc0910efe --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__ref-members.html @@ -0,0 +1,95 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::device_ref< T > Member List
+
+
+ +

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

+ + + + + + + + +
device_ref()=delete (defined in dr::shp::device_ref< T >)dr::shp::device_ref< T >
device_ref(const device_ref &)=default (defined in dr::shp::device_ref< T >)dr::shp::device_ref< T >
device_ref(T *pointer) (defined in dr::shp::device_ref< T >)dr::shp::device_ref< T >inline
operator T() const (defined in dr::shp::device_ref< T >)dr::shp::device_ref< T >inline
operator=(const T &value) const (defined in dr::shp::device_ref< T >)dr::shp::device_ref< T >inline
operator=(const device_ref &other) const (defined in dr::shp::device_ref< T >)dr::shp::device_ref< T >inline
~device_ref()=default (defined in dr::shp::device_ref< T >)dr::shp::device_ref< T >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1device__ref.html b/doxygen/classdr_1_1shp_1_1device__ref.html new file mode 100644 index 0000000000..955772fede --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__ref.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: dr::shp::device_ref< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::shp::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_1shp_1_1device__span-members.html b/doxygen/classdr_1_1shp_1_1device__span-members.html new file mode 100644 index 0000000000..251fddbf47 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__span-members.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::device_span< T, Iter > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
begin() const noexcept (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
device_span() noexcept (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >inline
device_span(R &&r) (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >inline
device_span(R &&r, std::size_t rank) (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >inline
device_span(It first, std::size_t count, std::size_t rank) (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >inline
device_span(It first, End last, std::size_t rank) (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >inline
difference_type typedef (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >
empty() const noexcept (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
end() const noexcept (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
first(std::size_t n) const (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >inline
iterator typedef (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >
last(std::size_t n) const (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >inline
operator=(const span &) noexcept=default (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >
operator[](size_type index) const (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
rank() const noexcept (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >inline
reference typedef (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >
size() const noexcept (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
size_type typedef (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >
span(R &&r) (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
span(Iter first, Iter last) (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
span(Iter first, std::size_t count) (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
span()=default (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >
span(const span &) noexcept=default (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >
subspan(std::size_t offset, std::size_t count) const (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >inline
value_type typedef (defined in dr::shp::device_span< T, Iter >)dr::shp::device_span< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1device__span.html b/doxygen/classdr_1_1shp_1_1device__span.html new file mode 100644 index 0000000000..1d37d7ba86 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__span.html @@ -0,0 +1,217 @@ + + + + + + + +Distributed Ranges: dr::shp::device_span< T, Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::shp::device_span< T, Iter > Class Template Reference
+
+
+
+Inheritance diagram for dr::shp::device_span< T, Iter >:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for dr::shp::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::shp::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::shp::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_1shp_1_1device__span__coll__graph.map b/doxygen/classdr_1_1shp_1_1device__span__coll__graph.map new file mode 100644 index 0000000000..f108ef87e5 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__span__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/classdr_1_1shp_1_1device__span__coll__graph.md5 b/doxygen/classdr_1_1shp_1_1device__span__coll__graph.md5 new file mode 100644 index 0000000000..a45270bb0f --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__span__coll__graph.md5 @@ -0,0 +1 @@ +e19ec50e0eac26d2e7e6caa5766de550 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1device__span__coll__graph.png b/doxygen/classdr_1_1shp_1_1device__span__coll__graph.png new file mode 100644 index 0000000000..a3cdfa776f Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1device__span__coll__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1device__span__inherit__graph.map b/doxygen/classdr_1_1shp_1_1device__span__inherit__graph.map new file mode 100644 index 0000000000..f108ef87e5 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__span__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/classdr_1_1shp_1_1device__span__inherit__graph.md5 b/doxygen/classdr_1_1shp_1_1device__span__inherit__graph.md5 new file mode 100644 index 0000000000..a45270bb0f --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__span__inherit__graph.md5 @@ -0,0 +1 @@ +e19ec50e0eac26d2e7e6caa5766de550 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1device__span__inherit__graph.png b/doxygen/classdr_1_1shp_1_1device__span__inherit__graph.png new file mode 100644 index 0000000000..a3cdfa776f Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1device__span__inherit__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1device__vector-members.html b/doxygen/classdr_1_1shp_1_1device__vector-members.html new file mode 100644 index 0000000000..480b9cf288 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__vector-members.html @@ -0,0 +1,95 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::device_vector< T, Allocator > Member List
+
+
+ +

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

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

+Public Types

+using base = dr::shp::vector< T, Allocator >
 
+using value_type = T
 
+using size_type = std::size_t
 
+using difference_type = std::size_t
 
- Public Types inherited from dr::shp::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::shp::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_1shp_1_1device__vector__coll__graph.map b/doxygen/classdr_1_1shp_1_1device__vector__coll__graph.map new file mode 100644 index 0000000000..707a6747f9 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__vector__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1device__vector__coll__graph.md5 b/doxygen/classdr_1_1shp_1_1device__vector__coll__graph.md5 new file mode 100644 index 0000000000..0bb72fc64f --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__vector__coll__graph.md5 @@ -0,0 +1 @@ +7a1a59449d12aeb58a0ccc55d37ae525 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1device__vector__coll__graph.png b/doxygen/classdr_1_1shp_1_1device__vector__coll__graph.png new file mode 100644 index 0000000000..adbfc73c1b Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1device__vector__coll__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1device__vector__inherit__graph.map b/doxygen/classdr_1_1shp_1_1device__vector__inherit__graph.map new file mode 100644 index 0000000000..707a6747f9 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__vector__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1device__vector__inherit__graph.md5 b/doxygen/classdr_1_1shp_1_1device__vector__inherit__graph.md5 new file mode 100644 index 0000000000..0bb72fc64f --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1device__vector__inherit__graph.md5 @@ -0,0 +1 @@ +7a1a59449d12aeb58a0ccc55d37ae525 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1device__vector__inherit__graph.png b/doxygen/classdr_1_1shp_1_1device__vector__inherit__graph.png new file mode 100644 index 0000000000..adbfc73c1b Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1device__vector__inherit__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1distributed__dense__matrix-members.html b/doxygen/classdr_1_1shp_1_1distributed__dense__matrix-members.html new file mode 100644 index 0000000000..19b01b0c75 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__dense__matrix-members.html @@ -0,0 +1,112 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::distributed_dense_matrix< T > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + + +
begin() (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
const_reference typedef (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >
const_scalar_reference typedef (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >
difference_type typedef (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >
distributed_dense_matrix(key_type shape) (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
distributed_dense_matrix(key_type shape, const matrix_partition &partition) (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
end() (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
get_tile(key_type tile_index, const Allocator &alloc=Allocator{}) (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
get_tile_async(key_type tile_index, const Allocator &alloc=Allocator{}) (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
grid_shape() const noexcept (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
iterator typedef (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >
key_type typedef (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >
operator[](key_type index) (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
operator[](key_type index) const (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
reference typedef (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >
scalar_reference typedef (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >
segments() (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
shape() const noexcept (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
size() const noexcept (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
size_type typedef (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >
tile(key_type tile_index) (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
tile_shape() const noexcept (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
tiles() (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >inline
value_type typedef (defined in dr::shp::distributed_dense_matrix< T >)dr::shp::distributed_dense_matrix< T >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1distributed__dense__matrix.html b/doxygen/classdr_1_1shp_1_1distributed__dense__matrix.html new file mode 100644 index 0000000000..6fd65feea7 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__dense__matrix.html @@ -0,0 +1,173 @@ + + + + + + + +Distributed Ranges: dr::shp::distributed_dense_matrix< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::shp::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::shp::matrix_entry< T >
 
+using scalar_reference = rng::range_reference_t< dr::shp::device_vector< T, dr::shp::device_allocator< T > > >
 
+using const_scalar_reference = rng::range_reference_t< const dr::shp::device_vector< T, dr::shp::device_allocator< T > > >
 
+using reference = dr::shp::matrix_ref< T, scalar_reference >
 
+using const_reference = dr::shp::matrix_ref< const T, const_scalar_reference >
 
+using key_type = dr::index<>
 
+using iterator = distributed_dense_matrix_iterator< T, dr::shp::device_vector< T, dr::shp::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::shp::device_vector< T, dr::shp::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_1shp_1_1distributed__dense__matrix__accessor-members.html b/doxygen/classdr_1_1shp_1_1distributed__dense__matrix__accessor-members.html new file mode 100644 index 0000000000..195ab94a62 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__dense__matrix__accessor-members.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::distributed_dense_matrix_accessor< T, L > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
difference_type typedef (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
distributed_dense_matrix_accessor() noexcept=default (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
distributed_dense_matrix_accessor(const distributed_dense_matrix_accessor &) noexcept=default (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::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::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >inline
iterator_accessor typedef (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
iterator_category typedef (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
key_type typedef (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
nonconst_iterator_accessor typedef (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
operator*() const noexcept (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >inline
operator+=(difference_type offset) noexcept (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >inline
operator=(const distributed_dense_matrix_accessor &) noexcept=default (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
operator==(const iterator_accessor &other) const noexcept (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >inline
reference typedef (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
scalar_reference typedef (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
scalar_value_type typedef (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
size_type typedef (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
tile_type typedef (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
value_type typedef (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
~distributed_dense_matrix_accessor() noexcept=default (defined in dr::shp::distributed_dense_matrix_accessor< T, L >)dr::shp::distributed_dense_matrix_accessor< T, L >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1distributed__dense__matrix__accessor.html b/doxygen/classdr_1_1shp_1_1distributed__dense__matrix__accessor.html new file mode 100644 index 0000000000..2c104171ef --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__dense__matrix__accessor.html @@ -0,0 +1,159 @@ + + + + + + + +Distributed Ranges: dr::shp::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::shp::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::shp::matrix_entry< scalar_value_type, std::size_t >
 
+using reference = dr::shp::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_1shp_1_1distributed__range__accessor-members.html b/doxygen/classdr_1_1shp_1_1distributed__range__accessor-members.html new file mode 100644 index 0000000000..452af01d68 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__range__accessor-members.html @@ -0,0 +1,107 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::distributed_range_accessor< Segments > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
difference_type typedef (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
distributed_range_accessor() noexcept=default (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
distributed_range_accessor(const distributed_range_accessor &) noexcept=default (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
distributed_range_accessor(Segments segments, size_type segment_id, size_type idx) noexcept (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >inline
iterator_accessor typedef (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
iterator_category typedef (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
nonconst_iterator_accessor typedef (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
operator*() const noexcept (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >inline
operator+=(difference_type offset) noexcept (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >inline
operator=(const distributed_range_accessor &) noexcept=default (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
operator==(const iterator_accessor &other) const noexcept (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >inline
reference typedef (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
segment_type typedef (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
size_type typedef (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
value_type typedef (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
~distributed_range_accessor() noexcept=default (defined in dr::shp::distributed_range_accessor< Segments >)dr::shp::distributed_range_accessor< Segments >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1distributed__range__accessor.html b/doxygen/classdr_1_1shp_1_1distributed__range__accessor.html new file mode 100644 index 0000000000..30e379c85a --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__range__accessor.html @@ -0,0 +1,150 @@ + + + + + + + +Distributed Ranges: dr::shp::distributed_range_accessor< Segments > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::shp::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_1shp_1_1distributed__span-members.html b/doxygen/classdr_1_1shp_1_1distributed__span-members.html new file mode 100644 index 0000000000..2a4a09b913 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__span-members.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::distributed_span< T, L > Member List
+
+
+ +

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

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

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

+ + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
difference_type typedef (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
distributed_span_accessor() noexcept=default (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
distributed_span_accessor(const distributed_span_accessor &) noexcept=default (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
distributed_span_accessor(std::span< segment_type > segments, size_type segment_id, size_type idx) noexcept (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >inline
element_type typedef (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
iterator_accessor typedef (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
iterator_category typedef (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
nonconst_iterator_accessor typedef (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
operator*() const noexcept (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >inline
operator+=(difference_type offset) noexcept (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >inline
operator=(const distributed_span_accessor &) noexcept=default (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
operator==(const iterator_accessor &other) const noexcept (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >inline
reference typedef (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
segment_type typedef (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
segments() const noexcept (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >inline
size_type typedef (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
value_type typedef (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
~distributed_span_accessor() noexcept=default (defined in dr::shp::distributed_span_accessor< T, L >)dr::shp::distributed_span_accessor< T, L >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1distributed__span__accessor.html b/doxygen/classdr_1_1shp_1_1distributed__span__accessor.html new file mode 100644 index 0000000000..b0e46410de --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__span__accessor.html @@ -0,0 +1,156 @@ + + + + + + + +Distributed Ranges: dr::shp::distributed_span_accessor< T, L > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::shp::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_1shp_1_1distributed__span__coll__graph.map b/doxygen/classdr_1_1shp_1_1distributed__span__coll__graph.map new file mode 100644 index 0000000000..5b3a5e620e --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__span__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1distributed__span__coll__graph.md5 b/doxygen/classdr_1_1shp_1_1distributed__span__coll__graph.md5 new file mode 100644 index 0000000000..c539c90f53 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__span__coll__graph.md5 @@ -0,0 +1 @@ +cfa30eb4c0f2cfd0f3c6d7845e4c1df5 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1distributed__span__coll__graph.png b/doxygen/classdr_1_1shp_1_1distributed__span__coll__graph.png new file mode 100644 index 0000000000..41dd2f1e70 Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1distributed__span__coll__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1distributed__span__inherit__graph.map b/doxygen/classdr_1_1shp_1_1distributed__span__inherit__graph.map new file mode 100644 index 0000000000..5b3a5e620e --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__span__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1distributed__span__inherit__graph.md5 b/doxygen/classdr_1_1shp_1_1distributed__span__inherit__graph.md5 new file mode 100644 index 0000000000..c539c90f53 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__span__inherit__graph.md5 @@ -0,0 +1 @@ +cfa30eb4c0f2cfd0f3c6d7845e4c1df5 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1distributed__span__inherit__graph.png b/doxygen/classdr_1_1shp_1_1distributed__span__inherit__graph.png new file mode 100644 index 0000000000..41dd2f1e70 Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1distributed__span__inherit__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1distributed__vector__accessor-members.html b/doxygen/classdr_1_1shp_1_1distributed__vector__accessor-members.html new file mode 100644 index 0000000000..b7f84c7067 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__vector__accessor-members.html @@ -0,0 +1,111 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::distributed_vector_accessor< T, L > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
const_segment_type typedef (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
difference_type typedef (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
distributed_vector_accessor() noexcept=default (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
distributed_vector_accessor(const distributed_vector_accessor &) noexcept=default (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::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::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >inline
element_type typedef (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
iterator_accessor typedef (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
iterator_category typedef (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
nonconst_iterator_accessor typedef (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
nonconst_segment_type typedef (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
operator*() const noexcept (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >inline
operator+=(difference_type offset) noexcept (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >inline
operator-(const iterator_accessor &other) const noexcept (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >inline
operator<(const iterator_accessor &other) const noexcept (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >inline
operator=(const distributed_vector_accessor &) noexcept=default (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
operator==(const iterator_accessor &other) const noexcept (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >inline
reference typedef (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
segment_type typedef (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
segments() const noexcept (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >inline
size_type typedef (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
value_type typedef (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
~distributed_vector_accessor() noexcept=default (defined in dr::shp::distributed_vector_accessor< T, L >)dr::shp::distributed_vector_accessor< T, L >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1distributed__vector__accessor.html b/doxygen/classdr_1_1shp_1_1distributed__vector__accessor.html new file mode 100644 index 0000000000..4973ffb58e --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1distributed__vector__accessor.html @@ -0,0 +1,162 @@ + + + + + + + +Distributed Ranges: dr::shp::distributed_vector_accessor< T, L > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::shp::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_1shp_1_1duplicated__vector-members.html b/doxygen/classdr_1_1shp_1_1duplicated__vector-members.html new file mode 100644 index 0000000000..a16ba99944 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1duplicated__vector-members.html @@ -0,0 +1,97 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::duplicated_vector< T, Allocator > Member List
+
+
+ +

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

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

+Public Types

+using segment_type = dr::shp::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_1shp_1_1future-members.html b/doxygen/classdr_1_1shp_1_1future-members.html new file mode 100644 index 0000000000..f82738919d --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1future-members.html @@ -0,0 +1,100 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::future< T, Event > Member List
+
+
+ +

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

+ + + + + + + + + + + + + +
event_type typedef (defined in dr::shp::future< T, Event >)dr::shp::future< T, Event >
events() const (defined in dr::shp::future< T, Event >)dr::shp::future< T, Event >inline
future(std::unique_ptr< T > &&value, const std::vector< Event > &events) (defined in dr::shp::future< T, Event >)dr::shp::future< T, Event >inline
future(T &&value, const std::vector< Event > &events) (defined in dr::shp::future< T, Event >)dr::shp::future< T, Event >inline
future(future &&)=default (defined in dr::shp::future< T, Event >)dr::shp::future< T, Event >
future(const future &)=delete (defined in dr::shp::future< T, Event >)dr::shp::future< T, Event >
get() (defined in dr::shp::future< T, Event >)dr::shp::future< T, Event >inline
operator=(future &&)=default (defined in dr::shp::future< T, Event >)dr::shp::future< T, Event >
operator=(const future &)=delete (defined in dr::shp::future< T, Event >)dr::shp::future< T, Event >
update(const Event &event) (defined in dr::shp::future< T, Event >)dr::shp::future< T, Event >inline
value() const (defined in dr::shp::future< T, Event >)dr::shp::future< T, Event >inline
wait() (defined in dr::shp::future< T, Event >)dr::shp::future< T, Event >inline
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1future.html b/doxygen/classdr_1_1shp_1_1future.html new file mode 100644 index 0000000000..6a578937fe --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1future.html @@ -0,0 +1,135 @@ + + + + + + + +Distributed Ranges: dr::shp::future< T, Event > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::shp::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_1shp_1_1id-members.html b/doxygen/classdr_1_1shp_1_1id-members.html new file mode 100644 index 0000000000..90131134a4 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1id-members.html @@ -0,0 +1,94 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::id< dimensions > Member List
+
+
+ +

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

+ + + + + + + +
get(int dimension) const (defined in dr::shp::id< dimensions >)dr::shp::id< dimensions >inline
id() noexcept=default (defined in dr::shp::id< dimensions >)dr::shp::id< dimensions >
id(std::size_t segment_id, std::size_t local_id, std::size_t global_id) (defined in dr::shp::id< dimensions >)dr::shp::id< dimensions >inline
local_id() const (defined in dr::shp::id< dimensions >)dr::shp::id< dimensions >inline
operator std::size_t() const (defined in dr::shp::id< dimensions >)dr::shp::id< dimensions >inline
segment() const (defined in dr::shp::id< dimensions >)dr::shp::id< dimensions >inline
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1id.html b/doxygen/classdr_1_1shp_1_1id.html new file mode 100644 index 0000000000..b37d1dd713 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1id.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: dr::shp::id< dimensions > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::shp::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_1shp_1_1matrix__entry-members.html b/doxygen/classdr_1_1shp_1_1matrix__entry-members.html new file mode 100644 index 0000000000..f6fee75aa7 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1matrix__entry-members.html @@ -0,0 +1,107 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::matrix_entry< T, I > Member List
+
+
+ +

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

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

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

+ + + + + + +
clone() const =0 (defined in dr::shp::matrix_partition)dr::shp::matrix_partitionpure virtual
grid_shape(dr::index<> matrix_shape) const =0 (defined in dr::shp::matrix_partition)dr::shp::matrix_partitionpure virtual
tile_rank(dr::index<> matrix_shape, dr::index<> tile_id) const =0 (defined in dr::shp::matrix_partition)dr::shp::matrix_partitionpure virtual
tile_shape(dr::index<> matrix_shape) const =0 (defined in dr::shp::matrix_partition)dr::shp::matrix_partitionpure virtual
~matrix_partition() (defined in dr::shp::matrix_partition)dr::shp::matrix_partitioninlinevirtual
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1matrix__partition.html b/doxygen/classdr_1_1shp_1_1matrix__partition.html new file mode 100644 index 0000000000..de8e82e830 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1matrix__partition.html @@ -0,0 +1,116 @@ + + + + + + + +Distributed Ranges: dr::shp::matrix_partition Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::shp::matrix_partition Class Referenceabstract
+
+
+
+Inheritance diagram for dr::shp::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_1shp_1_1matrix__partition__inherit__graph.map b/doxygen/classdr_1_1shp_1_1matrix__partition__inherit__graph.map new file mode 100644 index 0000000000..d7e34a488f --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1matrix__partition__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1matrix__partition__inherit__graph.md5 b/doxygen/classdr_1_1shp_1_1matrix__partition__inherit__graph.md5 new file mode 100644 index 0000000000..8c4d004f9c --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1matrix__partition__inherit__graph.md5 @@ -0,0 +1 @@ +1a1f38db8cbd5928ef53d5686469bd48 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1matrix__partition__inherit__graph.png b/doxygen/classdr_1_1shp_1_1matrix__partition__inherit__graph.png new file mode 100644 index 0000000000..2c8c0f0cde Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1matrix__partition__inherit__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1matrix__ref-members.html b/doxygen/classdr_1_1shp_1_1matrix__ref-members.html new file mode 100644 index 0000000000..82342f20dc --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1matrix__ref-members.html @@ -0,0 +1,109 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::matrix_ref< T, I, TRef > Member List
+
+
+ +

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

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

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

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

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

+ + + + + + + + + + + + + + + + + + + + +
const_iterator_accessor typedef (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
difference_type typedef (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
element_type typedef (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
iterator_accessor typedef (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
iterator_category typedef (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
nonconst_iterator_accessor typedef (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
operator*() const noexcept (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessorinline
operator+=(difference_type offset) noexcept (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessorinline
operator-(const iterator_accessor &other) const noexcept (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessorinline
operator<(const iterator_accessor &other) const noexcept (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessorinline
operator=(const segment_range_accessor &) noexcept=default (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
operator==(const iterator_accessor &other) const noexcept (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessorinline
reference typedef (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
segment_range_accessor() noexcept=default (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
segment_range_accessor(const segment_range_accessor &) noexcept=default (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
segment_range_accessor(size_type segment_id, size_type idx, size_type global_offset) noexcept (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessorinline
size_type typedef (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
value_type typedef (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
~segment_range_accessor() noexcept=default (defined in dr::shp::segment_range_accessor)dr::shp::segment_range_accessor
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1segment__range__accessor.html b/doxygen/classdr_1_1shp_1_1segment__range__accessor.html new file mode 100644 index 0000000000..a17254747a --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1segment__range__accessor.html @@ -0,0 +1,150 @@ + + + + + + + +Distributed Ranges: dr::shp::segment_range_accessor Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::shp::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_1shp_1_1span-members.html b/doxygen/classdr_1_1shp_1_1span-members.html new file mode 100644 index 0000000000..5d1a96168f --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1span-members.html @@ -0,0 +1,107 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::span< T, Iter > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + +
begin() const noexcept (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
difference_type typedef (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >
empty() const noexcept (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
end() const noexcept (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
first(size_type n) const (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
iterator typedef (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >
last(size_type n) const (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
operator=(const span &) noexcept=default (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >
operator[](size_type index) const (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
reference typedef (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >
size() const noexcept (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
size_type typedef (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >
span(R &&r) (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
span(Iter first, Iter last) (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
span(Iter first, std::size_t count) (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
span()=default (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >
span(const span &) noexcept=default (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >
subspan(std::size_t offset, std::size_t count) const (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >inline
value_type typedef (defined in dr::shp::span< T, Iter >)dr::shp::span< T, Iter >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1span.html b/doxygen/classdr_1_1shp_1_1span.html new file mode 100644 index 0000000000..b737297d3b --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1span.html @@ -0,0 +1,173 @@ + + + + + + + +Distributed Ranges: dr::shp::span< T, Iter > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::shp::span< T, Iter > Class Template Reference
+
+
+
+Inheritance diagram for dr::shp::span< T, Iter >:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for dr::shp::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_1shp_1_1span__coll__graph.map b/doxygen/classdr_1_1shp_1_1span__coll__graph.map new file mode 100644 index 0000000000..2b1b971c30 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1span__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1span__coll__graph.md5 b/doxygen/classdr_1_1shp_1_1span__coll__graph.md5 new file mode 100644 index 0000000000..45850b23c8 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1span__coll__graph.md5 @@ -0,0 +1 @@ +69377196b63bce2e6e7e341da8144374 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1span__coll__graph.png b/doxygen/classdr_1_1shp_1_1span__coll__graph.png new file mode 100644 index 0000000000..810e4c5084 Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1span__coll__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1span__inherit__graph.map b/doxygen/classdr_1_1shp_1_1span__inherit__graph.map new file mode 100644 index 0000000000..b581af9b87 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1span__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/classdr_1_1shp_1_1span__inherit__graph.md5 b/doxygen/classdr_1_1shp_1_1span__inherit__graph.md5 new file mode 100644 index 0000000000..9ef8c32ecb --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1span__inherit__graph.md5 @@ -0,0 +1 @@ +cc153c58563666210cf69bbae54b7cbc \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1span__inherit__graph.png b/doxygen/classdr_1_1shp_1_1span__inherit__graph.png new file mode 100644 index 0000000000..05854861dd Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1span__inherit__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1sparse__matrix-members.html b/doxygen/classdr_1_1shp_1_1sparse__matrix-members.html new file mode 100644 index 0000000000..3ac9ab4bf8 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1sparse__matrix-members.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::sparse_matrix< T, I > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
begin() (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
const_reference typedef (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >
const_scalar_reference typedef (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >
copy_tile(key_type tile_index, csr_matrix_view< T, I, Args... > tile_view) (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
copy_tile_async(key_type tile_index, csr_matrix_view< T, I, Args... > tile_view) (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
difference_type typedef (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >
end() (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
grid_shape() const noexcept (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
iterator typedef (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >
key_type typedef (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >
reference typedef (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >
scalar_reference typedef (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >
segment_type typedef (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >
segments() (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
shape() const noexcept (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
size() const noexcept (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
size_type typedef (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >
sparse_matrix(key_type shape) (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
sparse_matrix(key_type shape, double density) (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
sparse_matrix(key_type shape, double density, const matrix_partition &partition) (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
sparse_matrix(key_type shape, const matrix_partition &partition) (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
tile(key_type tile_index) (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
tile_shape() const noexcept (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
tiles() (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >inline
value_type typedef (defined in dr::shp::sparse_matrix< T, I >)dr::shp::sparse_matrix< T, I >
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1sparse__matrix.html b/doxygen/classdr_1_1shp_1_1sparse__matrix.html new file mode 100644 index 0000000000..fe74bfefcb --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1sparse__matrix.html @@ -0,0 +1,176 @@ + + + + + + + +Distributed Ranges: dr::shp::sparse_matrix< T, I > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Types | +Public Member Functions | +List of all members
+
dr::shp::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::shp::matrix_entry< T >
 
+using scalar_reference = rng::range_reference_t< dr::shp::device_vector< T, dr::shp::device_allocator< T > > >
 
+using const_scalar_reference = rng::range_reference_t< const dr::shp::device_vector< T, dr::shp::device_allocator< T > > >
 
+using reference = dr::shp::matrix_ref< T, scalar_reference >
 
+using const_reference = dr::shp::matrix_ref< const T, const_scalar_reference >
 
+using key_type = dr::index< I >
 
+using segment_type = dr::shp::csr_matrix_view< T, I, rng::iterator_t< dr::shp::device_vector< T, dr::shp::device_allocator< T > > >, rng::iterator_t< dr::shp::device_vector< I, dr::shp::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_1shp_1_1vector-members.html b/doxygen/classdr_1_1shp_1_1vector-members.html new file mode 100644 index 0000000000..f2d7451d6a --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1vector-members.html @@ -0,0 +1,129 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::vector< T, Allocator > Member List
+
+
+ +

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

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

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

+ + + +
operator()(R &&r) const (defined in dr::shp::views::enumerate_adapter_closure)dr::shp::views::enumerate_adapter_closureinline
operator| (defined in dr::shp::views::enumerate_adapter_closure)dr::shp::views::enumerate_adapter_closurefriend
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1views_1_1enumerate__adapter__closure.html b/doxygen/classdr_1_1shp_1_1views_1_1enumerate__adapter__closure.html new file mode 100644 index 0000000000..6d6f602954 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1views_1_1enumerate__adapter__closure.html @@ -0,0 +1,108 @@ + + + + + + + +Distributed Ranges: dr::shp::views::enumerate_adapter_closure Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Friends | +List of all members
+
dr::shp::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_1shp_1_1views_1_1enumerate__fn__-members.html b/doxygen/classdr_1_1shp_1_1views_1_1enumerate__fn__-members.html new file mode 100644 index 0000000000..236d560cd0 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1views_1_1enumerate__fn__-members.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::views::enumerate_fn_ Member List
+
+
+ +

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

+ + + +
enumerate() const (defined in dr::shp::views::enumerate_fn_)dr::shp::views::enumerate_fn_inline
operator()(R &&r) const (defined in dr::shp::views::enumerate_fn_)dr::shp::views::enumerate_fn_inline
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1views_1_1enumerate__fn__.html b/doxygen/classdr_1_1shp_1_1views_1_1enumerate__fn__.html new file mode 100644 index 0000000000..e6e39ed9b9 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1views_1_1enumerate__fn__.html @@ -0,0 +1,102 @@ + + + + + + + +Distributed Ranges: dr::shp::views::enumerate_fn_ Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
dr::shp::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_1shp_1_1views_1_1slice__adaptor__closure-members.html b/doxygen/classdr_1_1shp_1_1views_1_1slice__adaptor__closure-members.html new file mode 100644 index 0000000000..c9fe59781a --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1views_1_1slice__adaptor__closure-members.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::views::slice_adaptor_closure Member List
+
+
+ +

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

+ + + + +
operator()(R &&r) const (defined in dr::shp::views::slice_adaptor_closure)dr::shp::views::slice_adaptor_closureinline
operator| (defined in dr::shp::views::slice_adaptor_closure)dr::shp::views::slice_adaptor_closurefriend
slice_adaptor_closure(dr::index<> slice_indices) (defined in dr::shp::views::slice_adaptor_closure)dr::shp::views::slice_adaptor_closureinline
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1views_1_1slice__adaptor__closure.html b/doxygen/classdr_1_1shp_1_1views_1_1slice__adaptor__closure.html new file mode 100644 index 0000000000..0e9f583e62 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1views_1_1slice__adaptor__closure.html @@ -0,0 +1,110 @@ + + + + + + + +Distributed Ranges: dr::shp::views::slice_adaptor_closure Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Friends | +List of all members
+
dr::shp::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_1shp_1_1zip__accessor-members.html b/doxygen/classdr_1_1shp_1_1zip__accessor-members.html new file mode 100644 index 0000000000..4b03ca69f8 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1zip__accessor-members.html @@ -0,0 +1,107 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::zip_accessor< Iters > Member List
+
+
+ +

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

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

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

+ + + + + + + + + + + + + + +
begin() const (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >inline
difference_type typedef (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >
end() const (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >inline
get_view() const (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >inline
local() const noexcept (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >inline
num_views (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >static
operator[](std::size_t idx) const (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >inline
rank() const (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >inline
segments() const (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >inline
size() const noexcept (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >inline
size_type typedef (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >
zip_view(Rs... rs) (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >inline
zipped_segments() const (defined in dr::shp::zip_view< Rs >)dr::shp::zip_view< Rs >inline
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1zip__view.html b/doxygen/classdr_1_1shp_1_1zip__view.html new file mode 100644 index 0000000000..b46de831f1 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1zip__view.html @@ -0,0 +1,169 @@ + + + + + + + +Distributed Ranges: dr::shp::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::shp::zip_view< Rs > Class Template Reference
+
+
+ +

zip + More...

+ +

#include <zip_view.hpp>

+
+Inheritance diagram for dr::shp::zip_view< Rs >:
+
+
Inheritance graph
+ + + + +
[legend]
+
+Collaboration diagram for dr::shp::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::shp::zip_view< Rs >

zip

+

The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/classdr_1_1shp_1_1zip__view__coll__graph.map b/doxygen/classdr_1_1shp_1_1zip__view__coll__graph.map new file mode 100644 index 0000000000..465a8edb71 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1zip__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1zip__view__coll__graph.md5 b/doxygen/classdr_1_1shp_1_1zip__view__coll__graph.md5 new file mode 100644 index 0000000000..eacc95bba7 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1zip__view__coll__graph.md5 @@ -0,0 +1 @@ +2f7a2c568275448d8e42979e1bfb61f9 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1zip__view__coll__graph.png b/doxygen/classdr_1_1shp_1_1zip__view__coll__graph.png new file mode 100644 index 0000000000..7dc2016b44 Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1zip__view__coll__graph.png differ diff --git a/doxygen/classdr_1_1shp_1_1zip__view__inherit__graph.map b/doxygen/classdr_1_1shp_1_1zip__view__inherit__graph.map new file mode 100644 index 0000000000..465a8edb71 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1zip__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/classdr_1_1shp_1_1zip__view__inherit__graph.md5 b/doxygen/classdr_1_1shp_1_1zip__view__inherit__graph.md5 new file mode 100644 index 0000000000..eacc95bba7 --- /dev/null +++ b/doxygen/classdr_1_1shp_1_1zip__view__inherit__graph.md5 @@ -0,0 +1 @@ +2f7a2c568275448d8e42979e1bfb61f9 \ No newline at end of file diff --git a/doxygen/classdr_1_1shp_1_1zip__view__inherit__graph.png b/doxygen/classdr_1_1shp_1_1zip__view__inherit__graph.png new file mode 100644 index 0000000000..7dc2016b44 Binary files /dev/null and b/doxygen/classdr_1_1shp_1_1zip__view__inherit__graph.png differ 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..f9c0a3aaf3 --- /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..d10d2d164c --- /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..ac9c0c950a 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..ac9c0c950a 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..a8e9217cf2 --- /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..7c4d34228c --- /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..d058c46512 --- /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::mhp::__detail)
any (dr::mhp::__detail)
+
+
B
+
block_cyclic (dr::shp)
buffered_allocator (dr::shp)
+
+
C
+
communicator (dr)
coo_matrix (dr::shp::__detail)
csr_matrix_view (dr::shp)
csr_matrix_view_accessor (dr::shp)
+
+
D
+
default_memory (dr)
dense_matrix (dr::shp)
dense_matrix_accessor (dr::shp)
dense_matrix_column_accessor (dr::shp)
dense_matrix_column_view (dr::shp)
dense_matrix_row_accessor (dr::shp)
dense_matrix_row_view (dr::shp)
dense_matrix_view (dr::shp)
device_allocator (dr::shp)
device_policy (dr::mhp)
device_policy (dr::shp)
device_ptr (dr::shp)
device_ref (dr::shp)
device_span (dr::shp)
device_vector (dr::shp)
direct_iterator (dr::__detail)
distributed_dense_matrix (dr::shp)
distributed_dense_matrix_accessor (dr::shp)
distributed_mdarray (dr::mhp)
distributed_range_accessor (dr::shp)
distributed_span (dr::shp)
distributed_span_accessor (dr::shp)
distributed_vector (dr::mhp)
distributed_vector (dr::shp)
distributed_vector_accessor (dr::shp)
distribution (dr::mhp)
duplicated_vector (dr::shp)
dv_segment (dr::mhp)
dv_segment_iterator (dr::mhp)
dv_segment_reference (dr::mhp)
+
+
E
+
enumerate_adapter_closure (dr::__detail)
enumerate_adapter_closure (dr::mhp::views)
enumerate_adapter_closure (dr::shp::views)
enumerate_fn_ (dr::__detail)
enumerate_fn_ (dr::mhp::views)
enumerate_fn_ (dr::shp::views)
+
+
F
+
formatter< Mdspan, char > (fmt)
future (dr::shp)
+
+
G
+
global_context (dr::mhp::__detail)
+
+
H
+
halo_bounds (dr::mhp)
halo_impl (dr::mhp)
+
+
I
+
id (dr::shp)
index (dr)
index_group (dr::mhp)
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::mhp)
iterator_adaptor (dr)
+
+
L
+
local_fn_ (dr::ranges::__detail)
logger (dr)
+
+
M
+
matrix_entry (dr::shp)
matrix_partition (dr::shp)
matrix_ref (dr::shp)
halo_impl::max_op (dr::mhp)
md_segment (dr::mhp::__detail)
mdspan_adapter_closure (dr::mhp::views)
mdspan_fn_ (dr::mhp::views)
mdspan_iter_accessor (dr::__detail)
mdspan_view (dr::mhp)
mdsub_segment (dr::mhp::__detail)
mdtranspose (dr::__detail)
halo_impl::min_op (dr::mhp)
halo_impl::multiplies_op (dr::mhp)
+
+
N
+
normal_distributed_iterator_accessor (dr)
+
+
O
+
owning_view (dr::__detail)
+
+
P
+
halo_impl::plus_op (dr::mhp)
+
+
R
+
range_size (dr::mhp::views::__detail)
range_size< R > (dr::mhp::views::__detail)
device_allocator::rebind (dr::shp)
remote_subrange (dr)
rma_window (dr)
+
+
S
+
halo_impl::second_op (dr::mhp)
segment_range (dr::shp)
segment_range_accessor (dr::shp)
segmented_view (dr::mhp)
segmented_view_iterator (dr::mhp)
slice_adaptor_closure (dr::shp::views)
sliding_fn (dr::mhp::views::__detail)
source_location (nostd)
span (dr::shp)
span_group (dr::mhp)
span_halo (dr::mhp)
sparse_matrix (dr::shp)
submdspan_adapter_closure (dr::mhp::views)
submdspan_fn_ (dr::mhp::views)
submdspan_view (dr::mhp)
subrange (dr::mhp)
subrange_iterator (dr::mhp)
+
+
T
+
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::shp::matrix_entry< T, I > > (std)
tuple_element< Index, dr::shp::matrix_ref< T, I, TRef > > (std)
tuple_or_pair (dr::shp::__detail)
tuple_or_pair< T, U > (dr::shp::__detail)
tuple_size< dr::index< I > > (std)
tuple_size< dr::shp::matrix_entry< T, I > > (std)
tuple_size< dr::shp::matrix_ref< T, I, TRef > > (std)
+
+
U
+
unstructured_halo (dr::mhp)
+
+
V
+
vector (dr::shp)
+
+
Z
+
zip_accessor (dr::shp)
zip_iterator (dr::mhp)
zip_view (dr::mhp)
zip_view (dr::shp)
+
+
+ + + + 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/communicator_8hpp_source.html b/doxygen/communicator_8hpp_source.html new file mode 100644 index 0000000000..7dd3760fb5 --- /dev/null +++ b/doxygen/communicator_8hpp_source.html @@ -0,0 +1,336 @@ + + + + + + + +Distributed Ranges: /home/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
+
7namespace dr {
+
8
+ +
10public:
+
11 enum class tag {
+
12 invalid,
+
13 halo_forward,
+
14 halo_reverse,
+
15 halo_index,
+
16 };
+
17
+
18 communicator(MPI_Comm comm = MPI_COMM_WORLD) : mpi_comm_(comm) {
+
19 int rank, size;
+
20 MPI_Comm_rank(comm, &rank);
+
21 MPI_Comm_size(comm, &size);
+
22 rank_ = rank;
+
23 size_ = size;
+
24 }
+
25
+
26 auto size() const { return size_; }
+
27 auto rank() const { return rank_; }
+
28 auto prev() const { return (rank() + size() - 1) % size(); }
+
29 auto next() const { return (rank() + 1) % size(); }
+
30 auto first() const { return rank() == 0; }
+
31 auto last() const { return rank() == size() - 1; }
+
32
+
33 MPI_Comm mpi_comm() const { return mpi_comm_; }
+
34
+
35 void barrier() const { MPI_Barrier(mpi_comm_); }
+
36
+
37 void bcast(void *src, std::size_t count, std::size_t root) const {
+
38 MPI_Bcast(src, count, MPI_BYTE, root, mpi_comm_);
+
39 }
+
40
+
41 void scatter(const void *src, void *dst, std::size_t count,
+
42 std::size_t root) const {
+
43 MPI_Scatter(src, count, MPI_BYTE, dst, count, MPI_BYTE, root, mpi_comm_);
+
44 }
+
45
+
46 template <typename T>
+
47 void scatter(const std::span<T> src, T &dst, std::size_t root) const {
+
48 assert(rng::size(src) >= size_);
+
49 scatter(rng::data(src), &dst, sizeof(T), root);
+
50 }
+
51
+
52 void scatterv(const void *src, int *counts, int *offsets, void *dst,
+
53 int dst_count, std::size_t root) const {
+
54 assert(counts == nullptr || counts[rank()] == dst_count);
+
55 MPI_Scatterv(src, counts, offsets, MPI_BYTE, dst, dst_count, MPI_BYTE, root,
+
56 mpi_comm_);
+
57 }
+
58
+
59 void gather(const void *src, void *dst, std::size_t count,
+
60 std::size_t root) const {
+
61 MPI_Gather(src, count, MPI_BYTE, dst, count, MPI_BYTE, root, mpi_comm_);
+
62 }
+
63
+
64 template <typename T>
+
65 void gather(const T &src, std::span<T> dst, std::size_t root) const {
+
66 assert(rng::size(dst) >= size_);
+
67 gather(&src, rng::data(dst), sizeof(T), root);
+
68 }
+
69
+
70 template <typename T>
+
71 void all_gather(const T *src, T *dst, std::size_t count) const {
+
72 // Gather size elements from each rank
+
73 MPI_Allgather(src, count * sizeof(T), MPI_BYTE, dst, count * sizeof(T),
+
74 MPI_BYTE, mpi_comm_);
+
75 }
+
76
+
77 template <typename T>
+
78 void all_gather(const T &src, std::vector<T> &dst) const {
+
79 assert(rng::size(dst) >= size_);
+
80 all_gather(&src, rng::data(dst), 1);
+
81 }
+
82
+
83 template <rng::contiguous_range R>
+
84 void all_gather(const R &src, R &dst) const {
+
85 assert(rng::size(dst) >= size_ * rng::size(src));
+
86 all_gather(rng::data(src), rng::data(dst), rng::size(src));
+
87 }
+
88
+
89 template <typename T>
+
90 void i_all_gather(const T *src, T *dst, std::size_t count,
+
91 MPI_Request *req) const {
+
92 // Gather size elements from each rank
+
93 MPI_Iallgather(src, count * sizeof(T), MPI_BYTE, dst, count * sizeof(T),
+
94 MPI_BYTE, mpi_comm_, req);
+
95 }
+
96
+
97 template <typename T>
+
98 void i_all_gather(const T &src, std::vector<T> &dst, MPI_Request *req) const {
+
99 assert(rng::size(dst) >= size_);
+
100 i_all_gather(&src, rng::data(dst), 1, req);
+
101 }
+
102
+
103 void gatherv(const void *src, int *counts, int *offsets, void *dst,
+
104 std::size_t root) const {
+
105 MPI_Gatherv(src, counts[rank()], MPI_BYTE, dst, counts, offsets, MPI_BYTE,
+
106 root, mpi_comm_);
+
107 }
+
108
+
109 template <typename T>
+
110 void isend(const T *data, std::size_t count, std::size_t dst_rank, tag t,
+
111 MPI_Request *request) const {
+
112 MPI_Isend(data, count * sizeof(T), MPI_BYTE, dst_rank, int(t), mpi_comm_,
+
113 request);
+
114 }
+
115
+
116 template <rng::contiguous_range R>
+
117 void isend(const R &data, std::size_t dst_rank, tag t,
+
118 MPI_Request *request) const {
+
119 isend(rng::data(data), rng::size(data), dst_rank, t, request);
+
120 }
+
121
+
122 template <typename T>
+
123 void irecv(T *data, std::size_t size, std::size_t src_rank, tag t,
+
124 MPI_Request *request) const {
+
125 MPI_Irecv(data, size * sizeof(T), MPI_BYTE, src_rank, int(t), mpi_comm_,
+
126 request);
+
127 }
+
128
+
129 template <rng::contiguous_range R>
+
130 void irecv(R &data, std::size_t src_rank, tag t, MPI_Request *request) const {
+
131 irecv(rng::data(data), rng::size(data), src_rank, t, request);
+
132 }
+
133
+
134 template <rng::contiguous_range R>
+
135 void alltoall(const R &sendr, R &recvr, std::size_t count) {
+
136 using T = typename R::value_type;
+
137 MPI_Alltoall(rng::data(sendr), count * sizeof(T), MPI_BYTE,
+
138 rng::data(recvr), count * sizeof(T), MPI_BYTE, mpi_comm_);
+
139 }
+
140
+
141 template <rng::contiguous_range SendR, rng::contiguous_range RecvR>
+
142 void alltoallv(const SendR &sendbuf, const std::vector<std::size_t> &sendcnt,
+
143 const std::vector<std::size_t> &senddsp, RecvR &recvbuf,
+
144 const std::vector<std::size_t> &recvcnt,
+
145 const std::vector<std::size_t> &recvdsp) {
+
146 using valT = typename RecvR::value_type;
+
147
+
148 static_assert(std::is_same_v<std::ranges::range_value_t<SendR>,
+
149 std::ranges::range_value_t<RecvR>>);
+
150
+
151 assert(rng::size(sendcnt) == size_);
+
152 assert(rng::size(senddsp) == size_);
+
153 assert(rng::size(recvcnt) == size_);
+
154 assert(rng::size(recvdsp) == size_);
+
155
+
156 std::vector<int> _sendcnt(size_);
+
157 std::vector<int> _senddsp(size_);
+
158 std::vector<int> _recvcnt(size_);
+
159 std::vector<int> _recvdsp(size_);
+
160
+
161 rng::transform(sendcnt, _sendcnt.begin(),
+
162 [](auto e) { return e * sizeof(valT); });
+
163 rng::transform(senddsp, _senddsp.begin(),
+
164 [](auto e) { return e * sizeof(valT); });
+
165 rng::transform(recvcnt, _recvcnt.begin(),
+
166 [](auto e) { return e * sizeof(valT); });
+
167 rng::transform(recvdsp, _recvdsp.begin(),
+
168 [](auto e) { return e * sizeof(valT); });
+
169
+
170 MPI_Alltoallv(rng::data(sendbuf), rng::data(_sendcnt), rng::data(_senddsp),
+
171 MPI_BYTE, rng::data(recvbuf), rng::data(_recvcnt),
+
172 rng::data(_recvdsp), MPI_BYTE, mpi_comm_);
+
173 }
+
174
+
175 bool operator==(const communicator &other) const {
+
176 return mpi_comm_ == other.mpi_comm_;
+
177 }
+
178
+
179private:
+
180 MPI_Comm mpi_comm_;
+
181 std::size_t rank_;
+
182 std::size_t size_;
+
183};
+
184
+ +
186public:
+
187 void create(communicator comm, void *data, std::size_t size) {
+
188 local_data_ = data;
+
189 communicator_ = comm;
+
190 drlog.debug("win create:: size: {}\n", size);
+
191 MPI_Win_create(data, size, 1, MPI_INFO_NULL, comm.mpi_comm(), &win_);
+
192 }
+
193
+
194 template <typename T> auto local_data() {
+
195 return static_cast<T *>(local_data_);
+
196 }
+
197
+
198 void free() { MPI_Win_free(&win_); }
+
199
+
200 bool operator==(const rma_window other) const noexcept {
+
201 return this->win_ == other.win_;
+
202 }
+
203
+
204 void set_null() { win_ = MPI_WIN_NULL; }
+
205 bool null() const noexcept { return win_ == MPI_WIN_NULL; }
+
206
+
207 template <typename T> T get(std::size_t rank, std::size_t disp) const {
+
208 T dst;
+
209 get(&dst, sizeof(T), rank, disp * sizeof(T));
+
210 return dst;
+
211 }
+
212
+
213 void get(void *dst, std::size_t size, std::size_t rank,
+
214 std::size_t disp) const {
+
215 drlog.debug("comm get:: ({}:{}:{})\n", rank, disp, size);
+
216 MPI_Request request;
+
217 MPI_Rget(dst, size, MPI_BYTE, rank, disp, size, MPI_BYTE, win_, &request);
+
218 MPI_Wait(&request, MPI_STATUS_IGNORE);
+
219 }
+
220
+
221 void put(const auto &src, std::size_t rank, std::size_t disp) const {
+
222 put(&src, sizeof(src), rank, disp * sizeof(src));
+
223 }
+
224
+
225 void put(const void *src, std::size_t size, std::size_t rank,
+
226 std::size_t disp) const {
+
227 drlog.debug("comm put:: ({}:{}:{})\n", rank, disp, size);
+
228 MPI_Request request;
+
229 MPI_Rput(src, size, MPI_BYTE, rank, disp, size, MPI_BYTE, win_, &request);
+
230 MPI_Wait(&request, MPI_STATUS_IGNORE);
+
231 }
+
232
+
233 void fence() const { MPI_Win_fence(0, win_); }
+
234
+
235 void flush(std::size_t rank) const {
+
236 drlog.debug("flush:: rank: {}\n", rank);
+
237 MPI_Win_flush(rank, win_);
+
238 }
+
239
+
240 const auto &communicator() const { return communicator_; }
+
241 auto mpi_win() { return win_; }
+
242
+
243private:
+
244 dr::communicator communicator_;
+
245 MPI_Win win_ = MPI_WIN_NULL;
+
246 void *local_data_ = nullptr;
+
247};
+
248
+
249} // namespace dr
+
Definition: communicator.hpp:9
+
Definition: communicator.hpp:185
+
+ + + + 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_1mdspan__like.html b/doxygen/conceptdr_1_1____detail_1_1mdspan__like.html new file mode 100644 index 0000000000..d82e10ad93 --- /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:34
+
+ + + + 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__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_1mhp_1_1____detail_1_1is__distributed.html b/doxygen/conceptdr_1_1mhp_1_1____detail_1_1is__distributed.html new file mode 100644 index 0000000000..0b461d6a35 --- /dev/null +++ b/doxygen/conceptdr_1_1mhp_1_1____detail_1_1is__distributed.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: dr::mhp::__detail::is_distributed Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::__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_1mhp_1_1____detail_1_1one__argument.html b/doxygen/conceptdr_1_1mhp_1_1____detail_1_1one__argument.html new file mode 100644 index 0000000000..ef024c50ff --- /dev/null +++ b/doxygen/conceptdr_1_1mhp_1_1____detail_1_1one__argument.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::mhp::__detail::one_argument Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::__detail::one_argument Concept Reference
+
+
+

Concept definition

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

Concept definition

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

Concept definition

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

Concept definition

+
template<typename DR>
+
concept dr::mhp::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:251
+
+ + + + diff --git a/doxygen/conceptdr_1_1mhp_1_1has__segments.html b/doxygen/conceptdr_1_1mhp_1_1has__segments.html new file mode 100644 index 0000000000..8d9663a21c --- /dev/null +++ b/doxygen/conceptdr_1_1mhp_1_1has__segments.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: dr::mhp::has_segments Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::has_segments Concept Reference
+
+
+

Concept definition

+
template<typename T>
+
concept dr::mhp::has_segments = requires(T &t) { dr::ranges::segments(t); }
+
Definition: alignment.hpp:14
+
+ + + + diff --git a/doxygen/conceptdr_1_1mhp_1_1is__mdspan__view.html b/doxygen/conceptdr_1_1mhp_1_1is__mdspan__view.html new file mode 100644 index 0000000000..81307b33a8 --- /dev/null +++ b/doxygen/conceptdr_1_1mhp_1_1is__mdspan__view.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::mhp::is_mdspan_view Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::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:197
+
+ + + + diff --git a/doxygen/conceptdr_1_1mhp_1_1no__segments.html b/doxygen/conceptdr_1_1mhp_1_1no__segments.html new file mode 100644 index 0000000000..422a7008e0 --- /dev/null +++ b/doxygen/conceptdr_1_1mhp_1_1no__segments.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: dr::mhp::no_segments Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::mhp::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_0d13_1_1has__local__adl.html b/doxygen/conceptdr_1_1ranges_1_1_0d13_1_1has__local__adl.html new file mode 100644 index 0000000000..1a632e24c7 --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d13_1_1has__local__adl.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::ranges::@13::has_local_adl Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@13::has_local_adl Concept Reference
+
+
+

Concept definition

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

Concept definition

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

Concept definition

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

Concept definition

+
template<typename R>
+
concept dr::ranges::@13::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_0d13_1_1has__segments__method.html b/doxygen/conceptdr_1_1ranges_1_1_0d13_1_1has__segments__method.html new file mode 100644 index 0000000000..156af75a32 --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d13_1_1has__segments__method.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: dr::ranges::@13::has_segments_method Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@13::has_segments_method Concept Reference
+
+
+

Concept definition

+
template<typename R>
+
concept dr::ranges::@13::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_0d13_1_1is__localizable.html b/doxygen/conceptdr_1_1ranges_1_1_0d13_1_1is__localizable.html new file mode 100644 index 0000000000..70526cc927 --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d13_1_1is__localizable.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: dr::ranges::@13::is_localizable Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@13::is_localizable Concept Reference
+
+
+

Concept definition

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

Concept definition

+
template<typename Iter>
+
concept dr::ranges::@13::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_0d13_1_1iter__has__local__method.html b/doxygen/conceptdr_1_1ranges_1_1_0d13_1_1iter__has__local__method.html new file mode 100644 index 0000000000..e58b6a3062 --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d13_1_1iter__has__local__method.html @@ -0,0 +1,92 @@ + + + + + + + +Distributed Ranges: dr::ranges::@13::iter_has_local_method Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@13::iter_has_local_method Concept Reference
+
+
+

Concept definition

+
template<typename Iter>
+
concept dr::ranges::@13::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_0d13_1_1remote__range__shadow__impl__.html b/doxygen/conceptdr_1_1ranges_1_1_0d13_1_1remote__range__shadow__impl__.html new file mode 100644 index 0000000000..0a8c9ce667 --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d13_1_1remote__range__shadow__impl__.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: dr::ranges::@13::remote_range_shadow_impl_ Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@13::remote_range_shadow_impl_ Concept Reference
+
+
+

Concept definition

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

Concept definition

+
template<typename Segment>
+
concept dr::ranges::@13::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_0d13_1_1segments__range.html b/doxygen/conceptdr_1_1ranges_1_1_0d13_1_1segments__range.html new file mode 100644 index 0000000000..b8e7781250 --- /dev/null +++ b/doxygen/conceptdr_1_1ranges_1_1_0d13_1_1segments__range.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::ranges::@13::segments_range Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::ranges::@13::segments_range Concept Reference
+
+
+

Concept definition

+
template<typename R>
+
concept dr::ranges::@13::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_1shp_1_1____detail_1_1is__syclmemcopyable.html b/doxygen/conceptdr_1_1shp_1_1____detail_1_1is__syclmemcopyable.html new file mode 100644 index 0000000000..38cadb09ad --- /dev/null +++ b/doxygen/conceptdr_1_1shp_1_1____detail_1_1is__syclmemcopyable.html @@ -0,0 +1,90 @@ + + + + + + + +Distributed Ranges: dr::shp::__detail::is_syclmemcopyable Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::__detail::is_syclmemcopyable Concept Reference
+
+
+

Concept definition

+
template<typename Src, typename Dest>
+
concept dr::shp::__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_1shp_1_1____detail_1_1sycl__device__selector.html b/doxygen/conceptdr_1_1shp_1_1____detail_1_1sycl__device__selector.html new file mode 100644 index 0000000000..d0d83a5cbe --- /dev/null +++ b/doxygen/conceptdr_1_1shp_1_1____detail_1_1sycl__device__selector.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: dr::shp::__detail::sycl_device_selector Concept Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr::shp::__detail::sycl_device_selector Concept Reference
+
+
+

Concept definition

+
template<typename T>
+
concept dr::shp::__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..b44a2a406d --- /dev/null +++ b/doxygen/concepts.html @@ -0,0 +1,114 @@ + + + + + + + +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
 Nmhp
 N__detail
 Rone_argument
 Rtwo_arguments
 Rzipable
 Ris_distributed
 Rhas_segments
 Rno_segments
 Rhas_halo_method
 Ris_mdspan_view
 Nranges
 N__detail
 Rhas_local
 Nshp
 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
+
+
+ + + + diff --git a/doxygen/concepts_8hpp_source.html b/doxygen/concepts_8hpp_source.html new file mode 100644 index 0000000000..b2a76a8bb6 --- /dev/null +++ b/doxygen/concepts_8hpp_source.html @@ -0,0 +1,152 @@ + + + + + + + +Distributed Ranges: /home/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..f92c359878 --- /dev/null +++ b/doxygen/containers_2detail_8hpp_source.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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::shp {
+
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::shp
+
+ + + + diff --git a/doxygen/coo__matrix_8hpp_source.html b/doxygen/coo__matrix_8hpp_source.html new file mode 100644 index 0000000000..e2d716ddde --- /dev/null +++ b/doxygen/coo__matrix_8hpp_source.html @@ -0,0 +1,259 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/containers/matrix_entry.hpp>
+
8#include <memory>
+
9#include <vector>
+
10
+
11namespace dr::shp {
+
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::shp
+ +
Definition: coo_matrix.hpp:16
+
Definition: matrix_entry.hpp:15
+
Definition: matrix_entry.hpp:113
+
+ + + + diff --git a/doxygen/csr__matrix__view_8hpp_source.html b/doxygen/csr__matrix__view_8hpp_source.html new file mode 100644 index 0000000000..39a8318e54 --- /dev/null +++ b/doxygen/csr__matrix__view_8hpp_source.html @@ -0,0 +1,316 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/containers/matrix_entry.hpp>
+
9#include <iterator>
+
10
+
11namespace dr::shp {
+
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()[1], idx_offset_);
+
160 }
+
161
+
162 iterator end() const {
+
163 return iterator(values_, rowptr_, colind_, nnz_, shape()[1], shape()[1],
+
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::shp
+ +
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:113
+
+ + + + diff --git a/doxygen/dense__column__view_8hpp_source.html b/doxygen/dense__column__view_8hpp_source.html new file mode 100644 index 0000000000..8fe9ea1da6 --- /dev/null +++ b/doxygen/dense__column__view_8hpp_source.html @@ -0,0 +1,202 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/containers/matrix_entry.hpp>
+
9#include <iterator>
+
10
+
11namespace dr::shp {
+
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::shp
+
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:113
+
+ + + + diff --git a/doxygen/dense__matrix_8hpp_source.html b/doxygen/dense__matrix_8hpp_source.html new file mode 100644 index 0000000000..b0a7ded1da --- /dev/null +++ b/doxygen/dense__matrix_8hpp_source.html @@ -0,0 +1,232 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/containers/matrix_entry.hpp>
+
12#include <dr/shp/views/dense_column_view.hpp>
+
13#include <dr/shp/views/dense_matrix_iterator.hpp>
+
14#include <dr/shp/views/dense_row_view.hpp>
+
15
+
16namespace dr::shp {
+
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::shp
+
Definition: index.hpp:34
+
Definition: iterator_adaptor.hpp:23
+
Definition: dense_matrix.hpp:19
+
Definition: matrix_entry.hpp:113
+
+ + + + diff --git a/doxygen/dense__matrix__iterator_8hpp_source.html b/doxygen/dense__matrix__iterator_8hpp_source.html new file mode 100644 index 0000000000..06b59fc701 --- /dev/null +++ b/doxygen/dense__matrix__iterator_8hpp_source.html @@ -0,0 +1,199 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/containers/matrix_entry.hpp>
+
12#include <dr/shp/views/dense_column_view.hpp>
+
13#include <dr/shp/views/dense_row_view.hpp>
+
14
+
15namespace dr::shp {
+
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::shp
+
Definition: index.hpp:34
+
Definition: iterator_adaptor.hpp:23
+
Definition: dense_matrix_iterator.hpp:17
+
Definition: matrix_entry.hpp:15
+
Definition: matrix_entry.hpp:113
+
+ + + + diff --git a/doxygen/dense__matrix__view_8hpp_source.html b/doxygen/dense__matrix__view_8hpp_source.html new file mode 100644 index 0000000000..58b4065889 --- /dev/null +++ b/doxygen/dense__matrix__view_8hpp_source.html @@ -0,0 +1,214 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/containers/matrix_entry.hpp>
+
12#include <dr/shp/containers/sequential/dense_matrix.hpp>
+
13#include <dr/shp/views/dense_column_view.hpp>
+
14#include <dr/shp/views/dense_matrix_iterator.hpp>
+
15#include <dr/shp/views/dense_row_view.hpp>
+
16
+
17namespace dr::shp {
+
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::shp
+
Definition: index.hpp:34
+
Definition: iterator_adaptor.hpp:23
+
Definition: dense_matrix_view.hpp:21
+
Definition: dense_matrix.hpp:19
+
Definition: matrix_entry.hpp:113
+
+ + + + diff --git a/doxygen/dense__row__view_8hpp_source.html b/doxygen/dense__row__view_8hpp_source.html new file mode 100644 index 0000000000..df392a757b --- /dev/null +++ b/doxygen/dense__row__view_8hpp_source.html @@ -0,0 +1,200 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/containers/matrix_entry.hpp>
+
10#include <iterator>
+
11
+
12namespace dr::shp {
+
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::shp
+
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:113
+
+ + + + diff --git a/doxygen/detail_2enumerate_8hpp_source.html b/doxygen/detail_2enumerate_8hpp_source.html new file mode 100644 index 0000000000..e0311aea37 --- /dev/null +++ b/doxygen/detail_2enumerate_8hpp_source.html @@ -0,0 +1,149 @@ + + + + + + + +Distributed Ranges: /home/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..fa09564b55 --- /dev/null +++ b/doxygen/detail_8hpp_source.html @@ -0,0 +1,177 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/device_ptr.hpp>
+
10#include <dr/shp/init.hpp>
+
11#include <iterator>
+
12#include <sycl/sycl.hpp>
+
13
+
14namespace dr::shp {
+
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), shp::context());
+
27}
+
28
+
29template <typename T>
+
30sycl::usm::alloc get_pointer_type(shp::device_ptr<T> ptr) {
+
31 return sycl::get_pointer_type(ptr.get_raw_pointer(), shp::context());
+
32}
+
33
+
34template <std::contiguous_iterator Iter>
+
35sycl::device get_pointer_device(Iter iter) {
+
36 return sycl::get_pointer_device(std::to_address(iter), shp::context());
+
37}
+
38
+
39template <typename T> sycl::device get_pointer_device(shp::device_ptr<T> ptr) {
+
40 return sycl::get_pointer_device(ptr.get_raw_pointer(), shp::context());
+
41}
+
42
+
43template <typename InputIt> sycl::queue &get_queue_for_pointer(InputIt iter) {
+
44 if (get_pointer_type(iter) == sycl::usm::alloc::device) {
+
45 auto device = get_pointer_device(iter);
+
46 return __detail::queue(device);
+
47 } else {
+
48 return default_queue();
+
49 }
+
50}
+
51
+
52template <typename InputIt, typename OutputIt>
+
53sycl::queue &get_queue_for_pointers(InputIt iter, OutputIt iter2) {
+
54 if (get_pointer_type(iter) == sycl::usm::alloc::device) {
+
55 auto device = get_pointer_device(iter);
+
56 return __detail::queue(device);
+
57 } else if (get_pointer_type(iter2) == sycl::usm::alloc::device) {
+
58 auto device = get_pointer_device(iter2);
+
59 return __detail::queue(device);
+
60 } else {
+
61 return default_queue();
+
62 }
+
63}
+
64
+
65inline sycl::event combine_events(sycl::queue &q,
+
66 const std::vector<sycl::event> &events) {
+
67 auto e = q.submit([&](auto &&h) {
+
68 h.depends_on(events);
+
69 h.host_task([] {});
+
70 });
+
71
+
72 return e;
+
73}
+
74
+
75inline sycl::event combine_events(const std::vector<sycl::event> &events) {
+
76 auto &&q = __detail::queue(0);
+
77 return combine_events(q, events);
+
78}
+
79
+
80inline void wait(sycl::event &event) { event.wait(); }
+
81
+
82inline void wait(sycl::event &&event) { event.wait(); }
+
83
+
84inline void wait(const std::vector<sycl::event> &events) {
+
85 sycl::event::wait(events);
+
86}
+
87
+
88} // namespace __detail
+
89
+
90} // namespace dr::shp
+
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..cda03b0b2d --- /dev/null +++ b/doxygen/device__ptr_8hpp_source.html @@ -0,0 +1,231 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/device_ref.hpp>
+
12
+
13namespace dr::shp {
+
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::shp
+
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..cd5a0a247f --- /dev/null +++ b/doxygen/device__ref_8hpp_source.html @@ -0,0 +1,146 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/init.hpp>
+
8#include <sycl/sycl.hpp>
+
9#include <type_traits>
+
10
+
11namespace dr::shp {
+
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::shp::__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::shp::__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::shp
+
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..b8323e0945 --- /dev/null +++ b/doxygen/device__span_8hpp_source.html @@ -0,0 +1,185 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/span.hpp>
+
9#include <span>
+
10
+
11namespace dr::shp {
+
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::shp::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::shp::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::shp::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::shp::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::shp::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::shp
+
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..d41d51a96f --- /dev/null +++ b/doxygen/device__vector_8hpp_source.html @@ -0,0 +1,124 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/allocators.hpp>
+
8#include <dr/shp/vector.hpp>
+
9
+
10namespace dr::shp {
+
11
+
12template <typename T, typename Allocator>
+
13class device_vector : public dr::shp::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::shp
+
Definition: device_vector.hpp:13
+
Definition: vector.hpp:14
+
+ + + + diff --git a/doxygen/dir_14ee7c343b929a37ea63a8b178bcb898.html b/doxygen/dir_14ee7c343b929a37ea63a8b178bcb898.html new file mode 100644 index 0000000000..4463e0e659 --- /dev/null +++ b/doxygen/dir_14ee7c343b929a37ea63a8b178bcb898.html @@ -0,0 +1,120 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/algorithms Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
algorithms Directory Reference
+
+
+
+Directory dependency graph for algorithms:
+
+
/home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/algorithms
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  copy.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]
 
+
+ + + + diff --git a/doxygen/dir_14ee7c343b929a37ea63a8b178bcb898_dep.map b/doxygen/dir_14ee7c343b929a37ea63a8b178bcb898_dep.map new file mode 100644 index 0000000000..bc8c136b25 --- /dev/null +++ b/doxygen/dir_14ee7c343b929a37ea63a8b178bcb898_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_14ee7c343b929a37ea63a8b178bcb898_dep.md5 b/doxygen/dir_14ee7c343b929a37ea63a8b178bcb898_dep.md5 new file mode 100644 index 0000000000..f0ad1846ea --- /dev/null +++ b/doxygen/dir_14ee7c343b929a37ea63a8b178bcb898_dep.md5 @@ -0,0 +1 @@ +0fb521c3659e659ed2bed861b552f587 \ No newline at end of file diff --git a/doxygen/dir_14ee7c343b929a37ea63a8b178bcb898_dep.png b/doxygen/dir_14ee7c343b929a37ea63a8b178bcb898_dep.png new file mode 100644 index 0000000000..91f52dfd93 Binary files /dev/null and b/doxygen/dir_14ee7c343b929a37ea63a8b178bcb898_dep.png differ diff --git a/doxygen/dir_1cfe8e00bd9dfe72fc53a9846db2893f.html b/doxygen/dir_1cfe8e00bd9dfe72fc53a9846db2893f.html new file mode 100644 index 0000000000..c3d4c804d6 --- /dev/null +++ b/doxygen/dir_1cfe8e00bd9dfe72fc53a9846db2893f.html @@ -0,0 +1,100 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/containers/sequential Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
sequential Directory Reference
+
+
+
+Directory dependency graph for sequential:
+
+
/home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/containers/sequential
+ + + + +
+ + + + +

+Files

file  dense_matrix.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_1cfe8e00bd9dfe72fc53a9846db2893f_dep.map b/doxygen/dir_1cfe8e00bd9dfe72fc53a9846db2893f_dep.map new file mode 100644 index 0000000000..f63074a24f --- /dev/null +++ b/doxygen/dir_1cfe8e00bd9dfe72fc53a9846db2893f_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_1cfe8e00bd9dfe72fc53a9846db2893f_dep.md5 b/doxygen/dir_1cfe8e00bd9dfe72fc53a9846db2893f_dep.md5 new file mode 100644 index 0000000000..97266a7490 --- /dev/null +++ b/doxygen/dir_1cfe8e00bd9dfe72fc53a9846db2893f_dep.md5 @@ -0,0 +1 @@ +a1f7d26e6a937dbffe47d83f2a6d4d70 \ No newline at end of file diff --git a/doxygen/dir_1cfe8e00bd9dfe72fc53a9846db2893f_dep.png b/doxygen/dir_1cfe8e00bd9dfe72fc53a9846db2893f_dep.png new file mode 100644 index 0000000000..bc515b344f Binary files /dev/null and b/doxygen/dir_1cfe8e00bd9dfe72fc53a9846db2893f_dep.png differ diff --git a/doxygen/dir_323acea4eb551240b18003d2e88b28b7.html b/doxygen/dir_323acea4eb551240b18003d2e88b28b7.html new file mode 100644 index 0000000000..5aade510c4 --- /dev/null +++ b/doxygen/dir_323acea4eb551240b18003d2e88b28b7.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: /home/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:
+
+
/home/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..43db66f2d0 --- /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..cd4aa5d34f --- /dev/null +++ b/doxygen/dir_323acea4eb551240b18003d2e88b28b7_dep.md5 @@ -0,0 +1 @@ +27a9bf0ad8e4243896a59931a0324dee \ 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..24ac51fecf 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..64beb38b42 --- /dev/null +++ b/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f.html @@ -0,0 +1,101 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/vendor Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
vendor Directory Reference
+
+
+
+Directory dependency graph for vendor:
+
+
/home/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..16307a484e --- /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..79180a9a7f --- /dev/null +++ b/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f_dep.md5 @@ -0,0 +1 @@ +57333db0dd1f7ab177a95a718abe64d1 \ 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..34670d25ad Binary files /dev/null and b/doxygen/dir_3e0780f9fd691ce6aa718969242efd7f_dep.png differ diff --git a/doxygen/dir_4a11d3f5fb7a8fdc61e1e1f87277b621.html b/doxygen/dir_4a11d3f5fb7a8fdc61e1e1f87277b621.html new file mode 100644 index 0000000000..c8b4d76936 --- /dev/null +++ b/doxygen/dir_4a11d3f5fb7a8fdc61e1e1f87277b621.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/util Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
util Directory Reference
+
+
+
+Directory dependency graph for util:
+
+
/home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/util
+ + + + +
+ + + + + + + + +

+Files

file  coo_matrix.hpp [code]
 
file  generate_random.hpp [code]
 
file  matrix_io.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_4a11d3f5fb7a8fdc61e1e1f87277b621_dep.map b/doxygen/dir_4a11d3f5fb7a8fdc61e1e1f87277b621_dep.map new file mode 100644 index 0000000000..1ffb30c920 --- /dev/null +++ b/doxygen/dir_4a11d3f5fb7a8fdc61e1e1f87277b621_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_4a11d3f5fb7a8fdc61e1e1f87277b621_dep.md5 b/doxygen/dir_4a11d3f5fb7a8fdc61e1e1f87277b621_dep.md5 new file mode 100644 index 0000000000..fb1e20355b --- /dev/null +++ b/doxygen/dir_4a11d3f5fb7a8fdc61e1e1f87277b621_dep.md5 @@ -0,0 +1 @@ +1977673504be3dd98bea95f980536647 \ No newline at end of file diff --git a/doxygen/dir_4a11d3f5fb7a8fdc61e1e1f87277b621_dep.png b/doxygen/dir_4a11d3f5fb7a8fdc61e1e1f87277b621_dep.png new file mode 100644 index 0000000000..a0e16e0eaa Binary files /dev/null and b/doxygen/dir_4a11d3f5fb7a8fdc61e1e1f87277b621_dep.png differ diff --git a/doxygen/dir_4c0da47f5488ee935cb4372f760579e2.html b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2.html new file mode 100644 index 0000000000..bec806d58f --- /dev/null +++ b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2.html @@ -0,0 +1,120 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dr Directory Reference
+
+
+
+Directory dependency graph for dr:
+
+
/home/runner/work/distributed-ranges/distributed-ranges/include/dr
+ + + + + + + + + +
+ + + + + + + + + + + + +

+Directories

directory  concepts
 
directory  detail
 
directory  mhp
 
directory  shp
 
directory  views
 
+ + + + + +

+Files

file  mhp.hpp [code]
 
file  shp.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.map b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.map new file mode 100644 index 0000000000..31818a94d0 --- /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..9de90c0c33 --- /dev/null +++ b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.md5 @@ -0,0 +1 @@ +8ff740fbb356841cc4147fa5a7933833 \ 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..134592b1c4 Binary files /dev/null and b/doxygen/dir_4c0da47f5488ee935cb4372f760579e2_dep.png differ diff --git a/doxygen/dir_5915a580df0ec2fa6a1c1b2debb4bdbd.html b/doxygen/dir_5915a580df0ec2fa6a1c1b2debb4bdbd.html new file mode 100644 index 0000000000..432e1bfa11 --- /dev/null +++ b/doxygen/dir_5915a580df0ec2fa6a1c1b2debb4bdbd.html @@ -0,0 +1,118 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
mhp Directory Reference
+
+
+
+Directory dependency graph for mhp:
+
+
/home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp
+ + + + + + + +
+ + + + + + + + +

+Directories

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

+Files

file  alignment.hpp [code]
 
file  global.hpp [code]
 
file  halo.hpp [code]
 
file  sycl_support.hpp [code]
 
+
+ + + + diff --git a/doxygen/dir_5915a580df0ec2fa6a1c1b2debb4bdbd_dep.map b/doxygen/dir_5915a580df0ec2fa6a1c1b2debb4bdbd_dep.map new file mode 100644 index 0000000000..aea8744037 --- /dev/null +++ b/doxygen/dir_5915a580df0ec2fa6a1c1b2debb4bdbd_dep.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/doxygen/dir_5915a580df0ec2fa6a1c1b2debb4bdbd_dep.md5 b/doxygen/dir_5915a580df0ec2fa6a1c1b2debb4bdbd_dep.md5 new file mode 100644 index 0000000000..02604de74a --- /dev/null +++ b/doxygen/dir_5915a580df0ec2fa6a1c1b2debb4bdbd_dep.md5 @@ -0,0 +1 @@ +1c6fec9e962bd7fc2058dc7c138e5596 \ No newline at end of file diff --git a/doxygen/dir_5915a580df0ec2fa6a1c1b2debb4bdbd_dep.png b/doxygen/dir_5915a580df0ec2fa6a1c1b2debb4bdbd_dep.png new file mode 100644 index 0000000000..110772fc62 Binary files /dev/null and b/doxygen/dir_5915a580df0ec2fa6a1c1b2debb4bdbd_dep.png differ diff --git a/doxygen/dir_6619e339e135944080d183968eaad8ad.html b/doxygen/dir_6619e339e135944080d183968eaad8ad.html new file mode 100644 index 0000000000..35508b5bea --- /dev/null +++ b/doxygen/dir_6619e339e135944080d183968eaad8ad.html @@ -0,0 +1,108 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/containers Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
containers Directory Reference
+
+
+
+Directory dependency graph for containers:
+
+
/home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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_6619e339e135944080d183968eaad8ad_dep.map b/doxygen/dir_6619e339e135944080d183968eaad8ad_dep.map new file mode 100644 index 0000000000..dd2471b7c6 --- /dev/null +++ b/doxygen/dir_6619e339e135944080d183968eaad8ad_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_6619e339e135944080d183968eaad8ad_dep.md5 b/doxygen/dir_6619e339e135944080d183968eaad8ad_dep.md5 new file mode 100644 index 0000000000..7cb13fc9b8 --- /dev/null +++ b/doxygen/dir_6619e339e135944080d183968eaad8ad_dep.md5 @@ -0,0 +1 @@ +57b78d028a61b2ec0511a5f73b4ec6c4 \ No newline at end of file diff --git a/doxygen/dir_6619e339e135944080d183968eaad8ad_dep.png b/doxygen/dir_6619e339e135944080d183968eaad8ad_dep.png new file mode 100644 index 0000000000..fffd1fdf7f Binary files /dev/null and b/doxygen/dir_6619e339e135944080d183968eaad8ad_dep.png differ diff --git a/doxygen/dir_73601acfd5a2822dd473820b789b56e4.html b/doxygen/dir_73601acfd5a2822dd473820b789b56e4.html new file mode 100644 index 0000000000..9725504595 --- /dev/null +++ b/doxygen/dir_73601acfd5a2822dd473820b789b56e4.html @@ -0,0 +1,140 @@ + + + + + + + +Distributed Ranges: /home/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:
+
+
/home/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  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..ea1fbd11a5 --- /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..299ca8fcd9 --- /dev/null +++ b/doxygen/dir_73601acfd5a2822dd473820b789b56e4_dep.md5 @@ -0,0 +1 @@ +7fee69b8901775bb58b5321016cd8b9d \ 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..59939980ae Binary files /dev/null and b/doxygen/dir_73601acfd5a2822dd473820b789b56e4_dep.png differ diff --git a/doxygen/dir_773570e071a7f6eb5f21c8991c43558c.html b/doxygen/dir_773570e071a7f6eb5f21c8991c43558c.html new file mode 100644 index 0000000000..de69b16b72 --- /dev/null +++ b/doxygen/dir_773570e071a7f6eb5f21c8991c43558c.html @@ -0,0 +1,112 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/views Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
views Directory Reference
+
+
+
+Directory dependency graph for views:
+
+
/home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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_773570e071a7f6eb5f21c8991c43558c_dep.map b/doxygen/dir_773570e071a7f6eb5f21c8991c43558c_dep.map new file mode 100644 index 0000000000..acc86153cb --- /dev/null +++ b/doxygen/dir_773570e071a7f6eb5f21c8991c43558c_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_773570e071a7f6eb5f21c8991c43558c_dep.md5 b/doxygen/dir_773570e071a7f6eb5f21c8991c43558c_dep.md5 new file mode 100644 index 0000000000..b295f487c8 --- /dev/null +++ b/doxygen/dir_773570e071a7f6eb5f21c8991c43558c_dep.md5 @@ -0,0 +1 @@ +c155e03fca4b4c589000ea3c2f987658 \ No newline at end of file diff --git a/doxygen/dir_773570e071a7f6eb5f21c8991c43558c_dep.png b/doxygen/dir_773570e071a7f6eb5f21c8991c43558c_dep.png new file mode 100644 index 0000000000..bb4924d240 Binary files /dev/null and b/doxygen/dir_773570e071a7f6eb5f21c8991c43558c_dep.png differ diff --git a/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108.html b/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108.html new file mode 100644 index 0000000000..cbc4f2498d --- /dev/null +++ b/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108.html @@ -0,0 +1,100 @@ + + + + + + + +Distributed Ranges: /home/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:
+
+
/home/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..5c0f3fc0ff --- /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..524f4d2ec1 --- /dev/null +++ b/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108_dep.md5 @@ -0,0 +1 @@ +d69a68313ec0240dfdba59593c90f9d1 \ 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..d23d643d16 Binary files /dev/null and b/doxygen/dir_a385eca21dc3d8045dcdc4e17916b108_dep.png differ diff --git a/doxygen/dir_aa3ba46e7b5e341940d314e57af78bea.html b/doxygen/dir_aa3ba46e7b5e341940d314e57af78bea.html new file mode 100644 index 0000000000..fd4a51226e --- /dev/null +++ b/doxygen/dir_aa3ba46e7b5e341940d314e57af78bea.html @@ -0,0 +1,145 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
shp Directory Reference
+
+
+
+Directory dependency graph for shp:
+
+
/home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp
+ + + + + + + + +
+ + + + + + + + + + +

+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_aa3ba46e7b5e341940d314e57af78bea_dep.map b/doxygen/dir_aa3ba46e7b5e341940d314e57af78bea_dep.map new file mode 100644 index 0000000000..ad52930ea5 --- /dev/null +++ b/doxygen/dir_aa3ba46e7b5e341940d314e57af78bea_dep.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doxygen/dir_aa3ba46e7b5e341940d314e57af78bea_dep.md5 b/doxygen/dir_aa3ba46e7b5e341940d314e57af78bea_dep.md5 new file mode 100644 index 0000000000..1348d0a4df --- /dev/null +++ b/doxygen/dir_aa3ba46e7b5e341940d314e57af78bea_dep.md5 @@ -0,0 +1 @@ +06d44312574224ab1c98e48f99b39a4e \ No newline at end of file diff --git a/doxygen/dir_aa3ba46e7b5e341940d314e57af78bea_dep.png b/doxygen/dir_aa3ba46e7b5e341940d314e57af78bea_dep.png new file mode 100644 index 0000000000..61e4f8e222 Binary files /dev/null and b/doxygen/dir_aa3ba46e7b5e341940d314e57af78bea_dep.png differ diff --git a/doxygen/dir_ad1fcb57fe88fc977cd33acae3e499c7.html b/doxygen/dir_ad1fcb57fe88fc977cd33acae3e499c7.html new file mode 100644 index 0000000000..0764cb3401 --- /dev/null +++ b/doxygen/dir_ad1fcb57fe88fc977cd33acae3e499c7.html @@ -0,0 +1,126 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/algorithms Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
algorithms Directory Reference
+
+
+
+Directory dependency graph for algorithms:
+
+
/home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/algorithms
+ + + + + +
+ + + + +

+Directories

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

+Files

file  algorithms.hpp [code]
 
file  copy.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_ad1fcb57fe88fc977cd33acae3e499c7_dep.map b/doxygen/dir_ad1fcb57fe88fc977cd33acae3e499c7_dep.map new file mode 100644 index 0000000000..451c720b81 --- /dev/null +++ b/doxygen/dir_ad1fcb57fe88fc977cd33acae3e499c7_dep.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/dir_ad1fcb57fe88fc977cd33acae3e499c7_dep.md5 b/doxygen/dir_ad1fcb57fe88fc977cd33acae3e499c7_dep.md5 new file mode 100644 index 0000000000..eac972b0e2 --- /dev/null +++ b/doxygen/dir_ad1fcb57fe88fc977cd33acae3e499c7_dep.md5 @@ -0,0 +1 @@ +696e7c6f545a92c8b2b7de8d1bcf8890 \ No newline at end of file diff --git a/doxygen/dir_ad1fcb57fe88fc977cd33acae3e499c7_dep.png b/doxygen/dir_ad1fcb57fe88fc977cd33acae3e499c7_dep.png new file mode 100644 index 0000000000..81858b9e28 Binary files /dev/null and b/doxygen/dir_ad1fcb57fe88fc977cd33acae3e499c7_dep.png differ diff --git a/doxygen/dir_b55ceb0166778f6f645d8761656b8ad8.html b/doxygen/dir_b55ceb0166778f6f645d8761656b8ad8.html new file mode 100644 index 0000000000..2a66750117 --- /dev/null +++ b/doxygen/dir_b55ceb0166778f6f645d8761656b8ad8.html @@ -0,0 +1,114 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/views Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
views Directory Reference
+
+
+
+Directory dependency graph for views:
+
+
/home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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_b55ceb0166778f6f645d8761656b8ad8_dep.map b/doxygen/dir_b55ceb0166778f6f645d8761656b8ad8_dep.map new file mode 100644 index 0000000000..d31f897ed4 --- /dev/null +++ b/doxygen/dir_b55ceb0166778f6f645d8761656b8ad8_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_b55ceb0166778f6f645d8761656b8ad8_dep.md5 b/doxygen/dir_b55ceb0166778f6f645d8761656b8ad8_dep.md5 new file mode 100644 index 0000000000..5552257e8f --- /dev/null +++ b/doxygen/dir_b55ceb0166778f6f645d8761656b8ad8_dep.md5 @@ -0,0 +1 @@ +b7437a9d7fb2958a48646729a5983a5b \ No newline at end of file diff --git a/doxygen/dir_b55ceb0166778f6f645d8761656b8ad8_dep.png b/doxygen/dir_b55ceb0166778f6f645d8761656b8ad8_dep.png new file mode 100644 index 0000000000..416919fb5c Binary files /dev/null and b/doxygen/dir_b55ceb0166778f6f645d8761656b8ad8_dep.png differ diff --git a/doxygen/dir_c8b8cfb288a36c9e6df9dd28eaffc0ac.html b/doxygen/dir_c8b8cfb288a36c9e6df9dd28eaffc0ac.html new file mode 100644 index 0000000000..6ad31f6a17 --- /dev/null +++ b/doxygen/dir_c8b8cfb288a36c9e6df9dd28eaffc0ac.html @@ -0,0 +1,108 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/algorithms/matrix Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
matrix Directory Reference
+
+
+
+Directory dependency graph for matrix:
+
+
/home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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_c8b8cfb288a36c9e6df9dd28eaffc0ac_dep.map b/doxygen/dir_c8b8cfb288a36c9e6df9dd28eaffc0ac_dep.map new file mode 100644 index 0000000000..fe77c577c2 --- /dev/null +++ b/doxygen/dir_c8b8cfb288a36c9e6df9dd28eaffc0ac_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/dir_c8b8cfb288a36c9e6df9dd28eaffc0ac_dep.md5 b/doxygen/dir_c8b8cfb288a36c9e6df9dd28eaffc0ac_dep.md5 new file mode 100644 index 0000000000..163343fc0d --- /dev/null +++ b/doxygen/dir_c8b8cfb288a36c9e6df9dd28eaffc0ac_dep.md5 @@ -0,0 +1 @@ +6225e6d198a7a8de2513a340af30cddd \ No newline at end of file diff --git a/doxygen/dir_c8b8cfb288a36c9e6df9dd28eaffc0ac_dep.png b/doxygen/dir_c8b8cfb288a36c9e6df9dd28eaffc0ac_dep.png new file mode 100644 index 0000000000..9a70345818 Binary files /dev/null and b/doxygen/dir_c8b8cfb288a36c9e6df9dd28eaffc0ac_dep.png differ diff --git a/doxygen/dir_ce06eccc165702df51b9ab16680c58ae.html b/doxygen/dir_ce06eccc165702df51b9ab16680c58ae.html new file mode 100644 index 0000000000..bcc3050b3e --- /dev/null +++ b/doxygen/dir_ce06eccc165702df51b9ab16680c58ae.html @@ -0,0 +1,116 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/containers Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Distributed Ranges +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
containers Directory Reference
+
+
+
+Directory dependency graph for containers:
+
+
/home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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_ce06eccc165702df51b9ab16680c58ae_dep.map b/doxygen/dir_ce06eccc165702df51b9ab16680c58ae_dep.map new file mode 100644 index 0000000000..2cc0c21745 --- /dev/null +++ b/doxygen/dir_ce06eccc165702df51b9ab16680c58ae_dep.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/dir_ce06eccc165702df51b9ab16680c58ae_dep.md5 b/doxygen/dir_ce06eccc165702df51b9ab16680c58ae_dep.md5 new file mode 100644 index 0000000000..bf99415ff4 --- /dev/null +++ b/doxygen/dir_ce06eccc165702df51b9ab16680c58ae_dep.md5 @@ -0,0 +1 @@ +4fbc0680dc752583223bc4fdc06dbc3c \ No newline at end of file diff --git a/doxygen/dir_ce06eccc165702df51b9ab16680c58ae_dep.png b/doxygen/dir_ce06eccc165702df51b9ab16680c58ae_dep.png new file mode 100644 index 0000000000..4b7c4de63d Binary files /dev/null and b/doxygen/dir_ce06eccc165702df51b9ab16680c58ae_dep.png differ diff --git a/doxygen/dir_d44c64559bbebec7f509842c48db8b23.html b/doxygen/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 0000000000..791cac6233 --- /dev/null +++ b/doxygen/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: /home/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..100118108d --- /dev/null +++ b/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e.html @@ -0,0 +1,100 @@ + + + + + + + +Distributed Ranges: /home/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:
+
+
/home/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..a6ec4f01c4 --- /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..3c86f602bc --- /dev/null +++ b/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e_dep.md5 @@ -0,0 +1 @@ +e4fcc196c267e7f76e97f53230336354 \ 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..44f72ecd13 Binary files /dev/null and b/doxygen/dir_d7c528dc6ed0943eef8ba09c0b02746e_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..2080226a52 --- /dev/null +++ b/doxygen/distributed__dense__matrix_8hpp_source.html @@ -0,0 +1,431 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/containers/matrix_entry.hpp>
+
12#include <dr/shp/containers/matrix_partition.hpp>
+
13#include <dr/shp/containers/sequential/dense_matrix.hpp>
+
14#include <dr/shp/device_vector.hpp>
+
15#include <dr/shp/future.hpp>
+
16#include <dr/shp/views/dense_matrix_view.hpp>
+
17
+
18namespace dr::shp {
+
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::shp::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<T, rng::iterator_t<dr::shp::device_vector<
+ +
216 iter, key_type{tm, tn}, tile_shape()[1],
+
217 tiles_[i * grid_shape()[1] + j].rank());
+
218 }
+
219
+
220 std::vector<dense_matrix_view<T, rng::iterator_t<dr::shp::device_vector<
+ +
222 tiles() {
+
223 std::vector<dense_matrix_view<T, rng::iterator_t<dr::shp::device_vector<
+ +
225 views_;
+
226
+
227 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
+
228 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
+
229 auto iter = tiles_[i * grid_shape_[1] + j].begin();
+
230
+
231 std::size_t tm =
+
232 std::min(tile_shape_[0], shape()[0] - i * tile_shape_[0]);
+
233 std::size_t tn =
+
234 std::min(tile_shape_[1], shape()[1] - j * tile_shape_[1]);
+
235
+
236 views_.emplace_back(iter, key_type{tm, tn}, tile_shape_[1],
+
237 tiles_[i * grid_shape_[1] + j].rank());
+
238 }
+
239 }
+
240 return views_;
+
241 }
+
242
+
243 template <typename Allocator = std::allocator<T>>
+
244 auto get_tile(key_type tile_index, const Allocator &alloc = Allocator{}) {
+
245 std::size_t nrows = get_tile_shape_(tile_index)[0];
+
246 std::size_t ld = tile_shape_[1];
+
247 std::size_t tile_size = nrows * ld;
+
248 dense_matrix<T, Allocator> local_tile(get_tile_shape_(tile_index), ld,
+
249 alloc);
+
250 auto remote_tile = tile(tile_index);
+
251 shp::copy(remote_tile.data(), remote_tile.data() + tile_size,
+
252 local_tile.data());
+
253 return local_tile;
+
254 }
+
255
+
256 template <typename Allocator = std::allocator<T>>
+
257 auto get_tile_async(key_type tile_index,
+
258 const Allocator &alloc = Allocator{}) {
+
259 std::size_t nrows = get_tile_shape_(tile_index)[0];
+
260 std::size_t ld = tile_shape_[1];
+
261 std::size_t tile_size = nrows * ld;
+
262 dense_matrix<T, Allocator> local_tile(get_tile_shape_(tile_index), ld,
+
263 alloc);
+
264 auto remote_tile = tile(tile_index);
+
265 auto event = shp::copy_async(
+
266 remote_tile.data(), remote_tile.data() + tile_size, local_tile.data());
+
267 return future(std::move(local_tile), {event});
+
268 }
+
269
+
270 auto segments() {
+
271 std::vector<dense_matrix_view<T, rng::iterator_t<dr::shp::device_vector<
+ +
273 views_;
+
274
+
275 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
+
276 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
+
277 auto iter = tiles_[i * grid_shape_[1] + j].begin();
+
278
+
279 std::size_t tm =
+
280 std::min(tile_shape_[0], shape()[0] - i * tile_shape_[0]);
+
281 std::size_t tn =
+
282 std::min(tile_shape_[1], shape()[1] - j * tile_shape_[1]);
+
283
+
284 std::size_t m_offset = i * tile_shape_[0];
+
285 std::size_t n_offset = j * tile_shape_[1];
+
286
+
287 views_.emplace_back(iter, key_type{tm, tn},
+
288 key_type{m_offset, n_offset}, tile_shape_[1],
+
289 tiles_[i * grid_shape_[1] + j].rank());
+
290 }
+
291 }
+
292 return dr::__detail::owning_view(std::move(views_));
+
293 }
+
294
+
295private:
+
296 void init_() {
+
297 grid_shape_ = partition_->grid_shape(shape());
+
298 tile_shape_ = partition_->tile_shape(shape());
+
299
+
300 tiles_.reserve(grid_shape_[0] * grid_shape_[1]);
+
301
+
302 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
+
303 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
+
304 std::size_t rank = partition_->tile_rank(shape(), {i, j});
+
305
+
306 auto device = dr::shp::devices()[rank];
+
307 dr::shp::device_allocator<T> alloc(dr::shp::context(), device);
+
308
+
309 std::size_t tile_size = tile_shape_[0] * tile_shape_[1];
+
310
+
311 tiles_.emplace_back(tile_size, alloc, rank);
+
312 }
+
313 }
+
314 }
+
315
+
316 key_type get_tile_shape_(key_type tile_index) {
+
317 auto &&[i, j] = tile_index;
+
318 std::size_t tm = std::min(tile_shape_[0], shape()[0] - i * tile_shape_[0]);
+
319 std::size_t tn = std::min(tile_shape_[1], shape()[1] - j * tile_shape_[1]);
+
320 return key_type{tm, tn};
+
321 }
+
322
+
323private:
+
324 key_type shape_;
+
325 key_type grid_shape_;
+
326 key_type tile_shape_;
+
327 std::unique_ptr<dr::shp::matrix_partition> partition_;
+
328
+
329 std::vector<dr::shp::device_vector<T, dr::shp::device_allocator<T>>> tiles_;
+
330};
+
331
+
332} // namespace dr::shp
+
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:113
+
+ + + + diff --git a/doxygen/distributed__mdarray_8hpp_source.html b/doxygen/distributed__mdarray_8hpp_source.html new file mode 100644 index 0000000000..df97e2d949 --- /dev/null +++ b/doxygen/distributed__mdarray_8hpp_source.html @@ -0,0 +1,184 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/views/mdspan_view.hpp>
+
9
+
10namespace dr::mhp {
+
11
+
12template <typename T, std::size_t Rank> class distributed_mdarray {
+
13public:
+
14 using shape_type = dr::__detail::dr_extents<Rank>;
+
15
+
16 distributed_mdarray(dr::__detail::dr_extents<Rank> shape,
+ +
18 : tile_shape_(tile_shape(shape)), dv_(dv_size(), dv_dist(dist, shape)),
+
19 md_view_(make_md_view(dv_, shape, tile_shape_)) {}
+
20
+
21 auto begin() const { return rng::begin(md_view_); }
+
22 auto end() const { return rng::end(md_view_); }
+
23 auto size() const { return rng::size(md_view_); }
+
24 auto operator[](auto n) { return md_view_[n]; }
+
25
+
26 auto segments() { return dr::ranges::segments(md_view_); }
+
27 auto &halo() const { return dr::mhp::halo(dv_); }
+
28
+
29 auto mdspan() const { return md_view_.mdspan(); }
+
30 auto extent(std::size_t r) const { return mdspan().extent(r); }
+
31 auto grid() { return md_view_.grid(); }
+
32 auto view() const { return md_view_; }
+
33
+
34 auto operator==(const distributed_mdarray &other) const {
+
35 return std::equal(begin(), end(), other.begin());
+
36 }
+
37
+
38private:
+ +
40
+
41 static auto tile_shape(auto shape) {
+
42 std::size_t n = default_comm().size(); // dr-style ignore
+
43 shape[0] = dr::__detail::partition_up(shape[0], n);
+
44 return shape;
+
45 }
+
46
+
47 static auto md_size(auto shape) {
+
48 std::size_t size = 1;
+
49 for (auto extent : shape) {
+
50 size *= extent;
+
51 }
+
52 return size;
+
53 }
+
54
+
55 auto dv_size() {
+
56 return default_comm().size() * md_size(tile_shape_); // dr-style ignore
+
57 }
+
58
+
59 static auto dv_dist(distribution incoming_dist, auto shape) {
+
60 // Decomp is 1 "row" in decomp dimension
+
61 // TODO: only supports dist on leading dimension
+
62 shape[0] = 1;
+
63 std::size_t row_size = md_size(shape);
+
64 auto incoming_halo = incoming_dist.halo();
+
65 return distribution().halo(incoming_halo.prev * row_size,
+
66 incoming_halo.next * row_size);
+
67 }
+
68
+
69 // This wrapper seems to avoid an issue with template argument
+
70 // deduction for mdspan_view
+
71 static auto make_md_view(const DV &dv, shape_type shape,
+
72 shape_type tile_shape) {
+
73 return views::mdspan(dv, shape, tile_shape);
+
74 }
+
75
+
76 shape_type tile_shape_;
+
77 DV dv_;
+
78 using mdspan_type =
+
79 decltype(make_md_view(std::declval<DV>(), std::declval<shape_type>(),
+
80 std::declval<shape_type>()));
+
81 mdspan_type md_view_;
+
82};
+
83
+
84template <typename T, std::size_t Rank>
+
85auto &halo(const distributed_mdarray<T, Rank> &mdarray) {
+
86 return mdarray.halo();
+
87}
+
88
+
89template <typename T, std::size_t Rank>
+
90std::ostream &operator<<(std::ostream &os,
+
91 const distributed_mdarray<T, Rank> &mdarray) {
+
92 os << fmt::format("\n{}", mdarray.mdspan());
+
93 return os;
+
94}
+
95
+
96} // namespace dr::mhp
+
Definition: distributed_mdarray.hpp:12
+
distributed vector
Definition: distributed_vector.hpp:14
+
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..6827b1d846 --- /dev/null +++ b/doxygen/distributed__span_8hpp_source.html @@ -0,0 +1,347 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/device_span.hpp>
+
14
+
15namespace dr::shp {
+
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::shp
+
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..2552b18b21 --- /dev/null +++ b/doxygen/distribution_8hpp_source.html @@ -0,0 +1,133 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/halo.hpp>
+
8
+
9namespace dr::mhp {
+
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::mhp
+
Definition: distribution.hpp:11
+
Definition: halo.hpp:354
+
+ + + + 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..0900890a3f --- /dev/null +++ b/doxygen/duplicated__vector_8hpp_source.html @@ -0,0 +1,135 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/allocators.hpp>
+
8#include <dr/shp/device_vector.hpp>
+
9
+
10namespace dr::shp {
+
11
+
12template <typename T, typename Allocator = dr::shp::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::shp::devices()) {
+
29 segments_.emplace_back(
+
30 segment_type(size(), Allocator(dr::shp::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::shp
+
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: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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::shp {
+
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::shp
+
Definition: execution_policy.hpp:13
+
+ + + + diff --git a/doxygen/files.html b/doxygen/files.html new file mode 100644 index 0000000000..56378b74e9 --- /dev/null +++ b/doxygen/files.html @@ -0,0 +1,208 @@ + + + + + + + +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
 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
  mhp
  algorithms
  containers
  views
 alignment.hpp
 global.hpp
 halo.hpp
 sycl_support.hpp
  shp
  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
 mhp.hpp
 shp.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..192218e638 --- /dev/null +++ b/doxygen/format__shim_8hpp_source.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: /home/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..095eaef648 --- /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..ef0bc58dd8 --- /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..aa59a48046 --- /dev/null +++ b/doxygen/future_8hpp_source.html @@ -0,0 +1,134 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/detail.hpp>
+
11
+
12namespace dr::shp {
+
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::shp
+
Definition: future.hpp:14
+
+ + + + diff --git a/doxygen/gemm_8hpp_source.html b/doxygen/gemm_8hpp_source.html new file mode 100644 index 0000000000..39aa18bfa9 --- /dev/null +++ b/doxygen/gemm_8hpp_source.html @@ -0,0 +1,333 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/algorithms/matrix/local_gemm.hpp>
+
8#include <dr/shp/containers/distributed_dense_matrix.hpp>
+
9
+
10namespace dr::shp {
+
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::shp::device_allocator<T> gpu_allocator(q);
+
101 dr::shp::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::shp::dense_matrix_view a_local(a_tile);
+
118 dr::shp::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::shp::device_allocator<T> gpu_allocator(q);
+
178 dr::shp::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::shp::dense_matrix_view a_local(a_tile);
+
206 dr::shp::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::shp
+
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..0df99604b6 --- /dev/null +++ b/doxygen/gemv_8hpp_source.html @@ -0,0 +1,299 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/algorithms/matrix/local_gemv.hpp>
+
11#include <dr/shp/containers/duplicated_vector.hpp>
+
12#include <dr/shp/containers/sparse_matrix.hpp>
+
13#include <dr/shp/device_vector.hpp>
+
14#include <dr/shp/distributed_span.hpp>
+
15#include <dr/shp/util.hpp>
+
16
+
17namespace dr::shp {
+
18
+
19template <dr::distributed_range C, typename T, typename I,
+ +
21void flat_gemv(C &&c, dr::shp::sparse_matrix<T, I> &a, B &&b) {
+
22 assert(c.size() == b.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::shp::devices();
+
28
+
29 using b_scalar_type = rng::range_value_t<B>;
+
30
+
31 using local_vector_type =
+
32 dr::shp::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::shp::device_allocator<T> allocator(dr::shp::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::shp::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::shp::sparse_matrix<T, I> &a, B &&b,
+
81 shp::duplicated_vector<rng::range_value_t<B>> &scratch) {
+
82 assert(c.size() == b.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(shp::nprocs());
+
92 comp_events.reserve(a.grid_shape()[0]);
+
93
+
94 for (std::size_t i = 0; i < shp::nprocs(); i++) {
+
95 auto &&l_b = b_duplicated.local_vector(i);
+
96 auto event = dr::shp::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 auto &&q = __detail::queue(a_tile.rank());
+
108
+
109 auto event = __detail::local_gemv(q, a_tile, b_iter, c_iter,
+
110 {copy_events[a_tile.rank()]});
+
111 comp_events.push_back(event);
+
112 }
+
113
+
114 __detail::wait(comp_events);
+
115}
+
116
+
117template <dr::distributed_range C, typename T, typename I,
+ +
119void gemv(C &&c, dr::shp::sparse_matrix<T, I> &a, B &&b) {
+ +
121
+
122 gemv(c, a, b, b_duplicated);
+
123}
+
124
+
125template <dr::distributed_range C, typename T, typename I,
+ +
127void gemv_square(C &&c, dr::shp::sparse_matrix<T, I> &a, B &&b) {
+
128 assert(a.shape()[0] == c.size());
+
129 assert(a.shape()[1] == b.size());
+
130 assert(a.grid_shape()[0] == c.segments().size());
+
131 assert(a.grid_shape()[1] == b.segments().size());
+
132
+
133 std::vector<sycl::event> events;
+
134
+
135 for (std::size_t i = 0; i < a.grid_shape()[0]; i++) {
+
136 std::size_t k_offset = i;
+
137 for (std::size_t k_ = 0; k_ < a.grid_shape()[1]; k_++) {
+
138 std::size_t k = (k_ + k_offset) % a.grid_shape()[1];
+
139 auto a_tile = a.tile(dr::index<I>(i, k));
+
140 auto b_segment = b.segments()[k];
+
141 auto c_segment = c.segments()[i];
+
142
+
143 auto b_iter = dr::ranges::local(b_segment.begin());
+
144 auto c_iter = dr::ranges::local(c_segment.begin());
+
145
+
146 auto &&q = __detail::queue(a_tile.rank());
+
147
+
148 auto event = __detail::custom_gemv(q, a_tile, b_iter, c_iter);
+
149 events.push_back(event);
+
150 }
+
151 }
+
152
+
153 __detail::wait(events);
+
154}
+
155
+
156template <dr::distributed_range C, typename T, typename I,
+ +
158void gemv_square_copy(C &&c, dr::shp::sparse_matrix<T, I> &a, B &&b) {
+
159 assert(a.shape()[0] == c.size());
+
160 assert(a.shape()[1] == b.size());
+
161 assert(a.grid_shape()[0] == c.segments().size());
+
162 assert(a.grid_shape()[1] == b.segments().size());
+
163
+
164 auto &&devices = dr::shp::devices();
+
165
+
166 using b_scalar_type = rng::range_value_t<B>;
+
167
+
168 using local_vector_type =
+
169 dr::shp::device_vector<b_scalar_type,
+ +
171
+
172 std::vector<local_vector_type> local_b;
+
173 std::vector<sycl::event> events;
+
174
+
175 local_b.reserve(a.grid_shape()[0]);
+
176
+
177 for (std::size_t i = 0; i < a.grid_shape()[0]; i++) {
+ +
179 dr::shp::context(), devices[a.tile(dr::index<I>(i, 0)).rank()]);
+
180 local_b.emplace_back(b.size(), allocator,
+
181 a.tile(dr::index<I>(i, 0)).rank());
+
182 }
+
183
+
184 for (std::size_t i = 0; i < a.grid_shape()[0]; i++) {
+
185 std::size_t k_offset = i;
+
186 for (std::size_t k_ = 0; k_ < a.grid_shape()[1]; k_++) {
+
187 std::size_t k = (k_ + k_offset) % a.grid_shape()[1];
+
188 auto a_tile = a.tile({i, k});
+
189 auto b_iter = local_b[i].begin() + (k * a.tile_shape()[1]);
+
190 auto c_iter = c.segments()[i].begin();
+
191
+
192 auto &&b_segment = b.segments()[k];
+
193 auto &&q = __detail::queue(a_tile.rank());
+
194
+
195 auto ce =
+
196 dr::shp::copy_async(q, b_segment.begin(), b_segment.end(), b_iter);
+
197
+
198 auto event = __detail::custom_gemv(q, a_tile, b_iter.local(),
+
199 c_iter.local(), {ce});
+
200
+
201 events.push_back(event);
+
202 }
+
203 }
+
204
+
205 __detail::wait(events);
+
206}
+
207
+
208} // namespace dr::shp
+
Definition: index.hpp:34
+
Definition: allocators.hpp:20
+
Definition: device_vector.hpp:13
+
Definition: duplicated_vector.hpp:13
+
Definition: sparse_matrix.hpp:126
+
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..4bd55ac0f7 --- /dev/null +++ b/doxygen/generate__random_8hpp_source.html @@ -0,0 +1,178 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/views/csr_matrix_view.hpp>
+
9#include <map>
+
10#include <random>
+
11
+
12namespace dr::shp {
+
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::shp
+
Definition: index.hpp:34
+
+ + + + diff --git a/doxygen/global_8hpp_source.html b/doxygen/global_8hpp_source.html new file mode 100644 index 0000000000..5268176bb8 --- /dev/null +++ b/doxygen/global_8hpp_source.html @@ -0,0 +1,334 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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#include <unistd.h>
+
8#ifdef DRISHMEM
+
9#include <ishmem.h>
+
10#endif
+
11#include <dr/detail/sycl_utils.hpp>
+
12#include <dr/mhp/sycl_support.hpp>
+
13
+
14namespace dr::mhp {
+
15
+
16namespace __detail {
+
17
+ +
19 void init() {
+
20 void *data = nullptr;
+
21 std::size_t size = 0;
+
22 if (comm_.rank() == 0) {
+
23 root_scratchpad_.resize(scratchpad_size_);
+
24 data = root_scratchpad_.data();
+
25 size = rng::size(root_scratchpad_) * sizeof(root_scratchpad_[0]);
+
26 }
+
27 root_win_.create(comm_, data, size);
+
28 root_win_.fence();
+
29 }
+
30
+ +
32 root_win_.fence();
+
33 root_win_.free();
+
34 }
+
35
+
36 global_context() { init(); }
+
37#ifdef SYCL_LANGUAGE_VERSION
+
38 global_context(sycl::queue q, sycl::usm::alloc kind)
+
39 : sycl_queue_(q), sycl_mem_kind_(kind), dpl_policy_(q), use_sycl_(true) {
+
40 init();
+
41 }
+
42
+
43 sycl::queue sycl_queue_;
+
44 sycl::usm::alloc sycl_mem_kind_;
+
45 decltype(oneapi::dpl::execution::make_device_policy(
+
46 std::declval<sycl::queue>())) dpl_policy_;
+
47#endif
+
48
+
49 static constexpr std::size_t scratchpad_size_ = 1000000;
+
50 bool use_sycl_ = false;
+
51 dr::communicator comm_;
+
52 // container owns the window, we just track MPI handle
+
53 std::set<MPI_Win> wins_;
+
54 dr::rma_window root_win_;
+
55 std::vector<char> root_scratchpad_;
+
56};
+
57
+
58inline global_context *global_context_ = nullptr;
+
59
+
60inline bool finalized_ = false;
+
61inline bool we_initialized_mpi_ = false;
+
62
+
63inline auto gcontext() {
+
64 assert(global_context_ && "Call mhp::init() after MPI_Init()");
+
65 return global_context_;
+
66}
+
67
+
68// Initialize MPI if not already initialized.
+
69inline void initialize_mpi() {
+
70 int initialized;
+
71 MPI_Initialized(&initialized);
+
72 if (!initialized) {
+
73 MPI_Init(nullptr, nullptr);
+
74 we_initialized_mpi_ = true;
+
75 }
+
76
+
77#ifdef DRISHMEM
+
78 ishmem_init();
+
79#endif
+
80}
+
81
+
82// Finalize MPI *if* we initialized it and it has not been finalized.
+
83inline void finalize_mpi() {
+
84 int finalized;
+
85 MPI_Finalized(&finalized);
+
86
+
87 if (we_initialized_mpi_ && !finalized) {
+
88 MPI_Finalize();
+
89 }
+
90
+
91#ifdef DRISHMEM
+
92 ishmem_finalize();
+
93#endif
+
94}
+
95
+
96} // namespace __detail
+
97
+
98inline auto root_win() { return __detail::gcontext()->root_win_; }
+
99inline dr::communicator &default_comm() { return __detail::gcontext()->comm_; }
+
100
+
101inline bool finalized() { return __detail::finalized_; }
+
102inline std::size_t rank() { return default_comm().rank(); }
+
103inline std::size_t nprocs() { return default_comm().size(); } // dr-style ignore
+
104
+
105inline std::set<MPI_Win> &active_wins() { return __detail::gcontext()->wins_; }
+
106
+
107inline void barrier() { __detail::gcontext()->comm_.barrier(); }
+
108inline auto use_sycl() { return __detail::gcontext()->use_sycl_; }
+
109
+
110inline void fence() {
+
111 dr::drlog.debug("fence\n");
+
112 for (auto win : __detail::gcontext()->wins_) {
+
113 MPI_Win_fence(0, win);
+
114 }
+
115}
+
116
+
117inline void init() {
+
118 __detail::initialize_mpi();
+
119 assert(__detail::global_context_ == nullptr &&
+
120 "Do not call mhp::init() more than once");
+
121 __detail::global_context_ = new __detail::global_context;
+
122}
+
123
+
124inline void finalize() {
+
125 assert(__detail::global_context_ != nullptr);
+
126 delete __detail::global_context_;
+
127 __detail::global_context_ = nullptr;
+
128 __detail::finalize_mpi();
+
129 __detail::finalized_ = true;
+
130}
+
131
+
132inline std::string hostname() {
+
133 constexpr std::size_t MH = 2048;
+
134 char buf[MH + 1];
+
135 gethostname(buf, MH);
+
136 return std::string(buf);
+
137}
+
138
+
139#ifdef SYCL_LANGUAGE_VERSION
+
140inline sycl::queue &sycl_queue() { return __detail::gcontext()->sycl_queue_; }
+
141inline auto sycl_mem_kind() { return __detail::gcontext()->sycl_mem_kind_; }
+
142inline auto dpl_policy() { return __detail::gcontext()->dpl_policy_; }
+
143
+
144inline sycl::queue select_queue(bool check_different_devices = false) {
+
145 std::vector<sycl::device> devices;
+
146
+
147 auto root_devices = sycl::platform().get_devices();
+
148
+
149 for (auto &&root_device : root_devices) {
+
150 dr::drlog.debug("Root device: {}\n",
+
151 root_device.get_info<sycl::info::device::name>());
+
152 if (dr::__detail::partitionable(root_device)) {
+
153 auto subdevices = root_device.create_sub_devices<
+
154 sycl::info::partition_property::partition_by_affinity_domain>(
+
155 sycl::info::partition_affinity_domain::numa);
+
156 assert(rng::size(subdevices) > 0);
+
157
+
158 for (auto &&subdevice : subdevices) {
+
159 dr::drlog.debug(" add subdevice: {}\n",
+
160 subdevice.get_info<sycl::info::device::name>());
+
161 devices.push_back(subdevice);
+
162 }
+
163 } else {
+
164 dr::drlog.debug(" add root device: {}\n",
+
165 root_device.get_info<sycl::info::device::name>());
+
166 devices.push_back(root_device);
+
167 }
+
168 }
+
169
+
170 assert(rng::size(devices) > 0);
+
171 const auto my_rank = dr::communicator(MPI_COMM_WORLD).rank();
+
172 assert(!check_different_devices || my_rank < rng::size(devices));
+
173
+
174 // Round robin assignment of devices to ranks
+
175 return sycl::queue(devices[my_rank % rng::size(devices)]);
+
176}
+
177
+
178inline void init(sycl::queue q,
+
179 sycl::usm::alloc kind = sycl::usm::alloc::shared) {
+
180 __detail::initialize_mpi();
+
181 assert(__detail::global_context_ == nullptr &&
+
182 "Do not call mhp::init() more than once");
+
183 __detail::global_context_ = new __detail::global_context(q, kind);
+
184}
+
185
+
186template <typename Selector = decltype(sycl::default_selector_v)>
+
187inline void init(Selector &&selector = sycl::default_selector_v) {
+
188 __detail::initialize_mpi();
+
189 sycl::queue q = mhp::select_queue();
+
190 init(q);
+
191}
+
192
+
193#else // SYCL_LANGUAGE_VERSION
+
194inline auto sycl_queue() {
+
195 assert(false);
+
196 return 0;
+
197}
+
198inline const auto &dpl_policy() {
+
199 assert(false);
+
200 return std::execution::seq;
+
201}
+
202
+
203#endif // SYCL_LANGUAGE_VERSION
+
204
+
205} // namespace dr::mhp
+
206
+
207namespace dr::mhp::__detail {
+
208
+
209template <typename T> class allocator {
+
210
+
211public:
+
212 T *allocate(std::size_t sz) {
+
213 if (sz == 0) {
+
214 return nullptr;
+
215 }
+
216#ifdef SYCL_LANGUAGE_VERSION
+
217 if (mhp::use_sycl()) {
+
218 return sycl::malloc<T>(sz, sycl_queue(), sycl_mem_kind());
+
219 }
+
220#endif
+
221
+
222 return std_allocator_.allocate(sz);
+
223 }
+
224
+
225 void deallocate(T *ptr, std::size_t sz) {
+
226 if (sz == 0) {
+
227 assert(ptr == nullptr);
+
228 return;
+
229 }
+
230 assert(ptr != nullptr);
+
231#ifdef SYCL_LANGUAGE_VERSION
+
232 if (mhp::use_sycl()) {
+
233 sycl::free(ptr, sycl_queue());
+
234 return;
+
235 }
+
236#endif
+
237
+
238 std_allocator_.deallocate(ptr, sz);
+
239 }
+
240
+
241private:
+
242 std::allocator<T> std_allocator_;
+
243};
+
244
+
245} // namespace dr::mhp::__detail
+
Definition: communicator.hpp:9
+
Definition: global.hpp:209
+
Definition: communicator.hpp:185
+
Definition: global.hpp:18
+
+ + + + 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..8c1424706c 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..dd62d5436a --- /dev/null +++ b/doxygen/halo_8hpp_source.html @@ -0,0 +1,523 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/global.hpp>
+
8#include <dr/mhp/sycl_support.hpp>
+
9
+
10namespace dr::mhp {
+
11
+
12template <typename Group> class halo_impl {
+
13 using T = typename Group::element_type;
+
14 using Memory = typename Group::memory_type;
+
15
+
16public:
+
17 using group_type = Group;
+
18
+
19 // Destructor frees buffer_, so cannot copy
+
20 halo_impl(const halo_impl &) = delete;
+
21 halo_impl operator=(const halo_impl &) = delete;
+
22
+
24 halo_impl(communicator comm, const std::vector<Group> &owned_groups,
+
25 const std::vector<Group> &halo_groups,
+
26 const Memory &memory = Memory())
+
27 : comm_(comm), halo_groups_(halo_groups), owned_groups_(owned_groups),
+
28 memory_(memory) {
+
29 drlog.debug(nostd::source_location::current(),
+
30 "Halo constructed with {}/{} owned/halo\n",
+
31 rng::size(owned_groups), rng::size(halo_groups));
+
32 buffer_size_ = 0;
+
33 std::size_t i = 0;
+
34 std::vector<std::size_t> buffer_index;
+
35 for (auto &g : owned_groups_) {
+
36 buffer_index.push_back(buffer_size_);
+
37 g.request_index = i++;
+
38 buffer_size_ += g.buffer_size();
+
39 map_.push_back(&g);
+
40 }
+
41 for (auto &g : halo_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 buffer_ = memory_.allocate(buffer_size_);
+
48 assert(buffer_ != nullptr);
+
49 i = 0;
+
50 for (auto &g : owned_groups_) {
+
51 g.buffer = &buffer_[buffer_index[i++]];
+
52 }
+
53 for (auto &g : halo_groups_) {
+
54 g.buffer = &buffer_[buffer_index[i++]];
+
55 }
+
56 requests_.resize(i);
+
57 }
+
58
+ +
61 drlog.debug("Halo exchange begin\n");
+
62 receive(halo_groups_);
+
63 send(owned_groups_);
+
64 }
+
65
+ + +
69 drlog.debug("Halo exchange finalize\n");
+
70 }
+
71
+
72 void exchange() {
+ + +
75 }
+
76
+
78 void reduce_begin() {
+
79 receive(owned_groups_);
+
80 send(halo_groups_);
+
81 }
+
82
+
84 void reduce_finalize(const auto &op) {
+
85 for (int pending = rng::size(requests_); pending > 0; pending--) {
+
86 int completed;
+
87 MPI_Waitany(rng::size(requests_), requests_.data(), &completed,
+
88 MPI_STATUS_IGNORE);
+
89 drlog.debug("Completed: {}\n", completed);
+
90 auto &g = *map_[completed];
+
91 if (g.receive && g.buffered) {
+
92 g.unpack(op);
+
93 }
+
94 }
+
95 }
+
96
+ +
99 for (int pending = rng::size(requests_); pending > 0; pending--) {
+
100 int completed;
+
101 MPI_Waitany(rng::size(requests_), requests_.data(), &completed,
+
102 MPI_STATUS_IGNORE);
+
103 drlog.debug("Completed: {}\n", completed);
+
104 auto &g = *map_[completed];
+
105 if (g.receive && g.buffered) {
+
106 g.unpack();
+
107 }
+
108 }
+
109 }
+
110
+
111 struct second_op {
+
112 T operator()(T &a, T &b) const { return b; }
+
113 } second;
+
114
+
115 struct plus_op {
+
116 T operator()(T &a, T &b) const { return a + b; }
+
117 } plus;
+
118
+
119 struct max_op {
+
120 T operator()(T &a, T &b) const { return std::max(a, b); }
+
121 } max;
+
122
+
123 struct min_op {
+
124 T operator()(T &a, T &b) const { return std::min(a, b); }
+
125 } min;
+
126
+ +
128 T operator()(T &a, T &b) const { return a * b; }
+
129 } multiplies;
+
130
+
131 ~halo_impl() {
+
132 if (buffer_) {
+
133 memory_.deallocate(buffer_, buffer_size_);
+
134 buffer_ = nullptr;
+
135 }
+
136 }
+
137
+
138private:
+
139 void send(std::vector<Group> &sends) {
+
140 for (auto &g : sends) {
+
141 g.pack();
+
142 g.receive = false;
+
143 drlog.debug("Sending: {}\n", g.request_index);
+
144 comm_.isend(g.data_pointer(), g.data_size(), g.rank(), g.tag(),
+
145 &requests_[g.request_index]);
+
146 }
+
147 }
+
148
+
149 void receive(std::vector<Group> &receives) {
+
150 for (auto &g : receives) {
+
151 g.receive = true;
+
152 drlog.debug("Receiving: {}\n", g.request_index);
+
153 comm_.irecv(g.data_pointer(), g.data_size(), g.rank(), g.tag(),
+
154 &requests_[g.request_index]);
+
155 }
+
156 }
+
157
+
158 communicator comm_;
+
159 std::vector<Group> halo_groups_, owned_groups_;
+
160 T *buffer_ = nullptr;
+
161 std::size_t buffer_size_;
+
162 std::vector<MPI_Request> requests_;
+
163 std::vector<Group *> map_;
+
164 Memory memory_;
+
165};
+
166
+
167template <typename T, typename Memory = default_memory<T>> class index_group {
+
168public:
+
169 using element_type = T;
+
170 using memory_type = Memory;
+
171 T *buffer = nullptr;
+
172 std::size_t request_index;
+
173 bool receive;
+
174 bool buffered;
+
175
+
177 index_group(T *data, std::size_t rank,
+
178 const std::vector<std::size_t> &indices, const Memory &memory)
+
179 : memory_(memory), data_(data), rank_(rank) {
+
180 buffered = false;
+
181 for (std::size_t i = 0; i < rng::size(indices) - 1; i++) {
+
182 buffered = buffered || (indices[i + 1] - indices[i] != 1);
+
183 }
+
184 indices_size_ = rng::size(indices);
+
185 indices_ = memory_.template allocate<std::size_t>(indices_size_);
+
186 assert(indices_ != nullptr);
+
187 memory_.memcpy(indices_, indices.data(),
+
188 indices_size_ * sizeof(std::size_t));
+
189 }
+
190
+
191 index_group(const index_group &o)
+
192 : buffer(o.buffer), request_index(o.request_index), receive(o.receive),
+
193 buffered(o.buffered), memory_(o.memory_), data_(o.data_),
+
194 rank_(o.rank_), indices_size_(o.indices_size_), tag_(o.tag_) {
+
195 indices_ = memory_.template allocate<std::size_t>(indices_size_);
+
196 assert(indices_ != nullptr);
+
197 memory_.memcpy(indices_, o.indices_, indices_size_ * sizeof(std::size_t));
+
198 }
+
199
+
200 void unpack(const auto &op) {
+
201 T *dpt = data_;
+
202 auto n = indices_size_;
+
203 auto *ipt = indices_;
+
204 auto *b = buffer;
+
205 memory_.offload([=]() {
+
206 for (std::size_t i = 0; i < n; i++) {
+
207 dpt[ipt[i]] = op(dpt[ipt[i]], b[i]);
+
208 }
+
209 });
+
210 }
+
211
+
212 void pack() {
+
213 T *dpt = data_;
+
214 auto n = indices_size_;
+
215 auto *ipt = indices_;
+
216 auto *b = buffer;
+
217 memory_.offload([=]() {
+
218 for (std::size_t i = 0; i < n; i++) {
+
219 b[i] = dpt[ipt[i]];
+
220 }
+
221 });
+
222 }
+
223
+
224 std::size_t buffer_size() {
+
225 if (buffered) {
+
226 return indices_size_;
+
227 }
+
228 return 0;
+
229 }
+
230
+
231 T *data_pointer() {
+
232 if (buffered) {
+
233 return buffer;
+
234 } else {
+
235 return &data_[indices_[0]];
+
236 }
+
237 }
+
238
+
239 std::size_t data_size() { return indices_size_; }
+
240
+
241 std::size_t rank() { return rank_; }
+
242 auto tag() { return tag_; }
+
243
+
244 ~index_group() {
+
245 if (indices_) {
+
246 memory_.template deallocate<std::size_t>(indices_, indices_size_);
+
247 indices_ = nullptr;
+
248 }
+
249 }
+
250
+
251private:
+
252 Memory memory_;
+
253 T *data_ = nullptr;
+
254 std::size_t rank_;
+
255 std::size_t indices_size_;
+
256 std::size_t *indices_;
+
257 communicator::tag tag_ = communicator::tag::halo_index;
+
258};
+
259
+
260template <typename T, typename Memory>
+
261using unstructured_halo_impl = halo_impl<index_group<T, Memory>>;
+
262
+
263template <typename T, typename Memory = default_memory<T>>
+
264class unstructured_halo : public unstructured_halo_impl<T, Memory> {
+
265public:
+ +
267 using index_map = std::pair<std::size_t, std::vector<std::size_t>>;
+
268
+ +
273 const std::vector<index_map> &owned,
+
274 const std::vector<index_map> &halo,
+
275 const Memory &memory = Memory())
+
276 : unstructured_halo_impl<T, Memory>(
+
277 comm, make_groups(comm, data, owned, memory),
+
278 make_groups(comm, data, halo, memory), memory) {}
+
279
+
280private:
+
281 static std::vector<group_type> make_groups(communicator comm, T *data,
+
282 const std::vector<index_map> &map,
+
283 const Memory &memory) {
+
284 std::vector<group_type> groups;
+
285 for (auto const &[rank, indices] : map) {
+
286 groups.emplace_back(data, rank, indices, memory);
+
287 }
+
288 return groups;
+
289 }
+
290};
+
291
+
292template <typename T, typename Memory = default_memory<T>> class span_group {
+
293public:
+
294 using element_type = T;
+
295 using memory_type = Memory;
+
296 T *buffer = nullptr;
+
297 std::size_t request_index = 0;
+
298 bool receive = false;
+
299 bool buffered = false;
+
300
+
301 span_group(std::span<T> data, std::size_t rank, communicator::tag tag)
+
302 : data_(data), rank_(rank), tag_(tag) {
+
303#ifdef SYCL_LANGUAGE_VERSION
+
304 if (use_sycl() && sycl_mem_kind() == sycl::usm::alloc::shared) {
+
305 buffered = true;
+
306 }
+
307#endif
+
308 }
+
309
+
310 void unpack() {
+
311 if (buffered) {
+
312 if (mhp::use_sycl()) {
+
313 __detail::sycl_copy(buffer, buffer + rng::size(data_), data_.data());
+
314 } else {
+
315 std::copy(buffer, buffer + rng::size(data_), data_.data());
+
316 }
+
317 }
+
318 }
+
319
+
320 void pack() {
+
321 if (buffered) {
+
322 if (mhp::use_sycl()) {
+
323 __detail::sycl_copy(data_.data(), data_.data() + rng::size(data_),
+
324 buffer);
+
325 } else {
+
326 std::copy(data_.begin(), data_.end(), buffer);
+
327 }
+
328 }
+
329 }
+
330 std::size_t buffer_size() { return rng::size(data_); }
+
331
+
332 std::size_t data_size() { return rng::size(data_); }
+
333
+
334 T *data_pointer() {
+
335 if (buffered) {
+
336 return buffer;
+
337 } else {
+
338 return data_.data();
+
339 }
+
340 }
+
341
+
342 std::size_t rank() { return rank_; }
+
343
+
344 auto tag() { return tag_; }
+
345
+
346private:
+
347 Memory memory_;
+
348 std::span<T> data_;
+
349 std::size_t rank_;
+
350 communicator::tag tag_ = communicator::tag::invalid;
+
351 ;
+
352};
+
353
+ +
355 std::size_t prev = 0, next = 0;
+
356 bool periodic = false;
+
357};
+
358
+
359template <typename T, typename Memory>
+ +
361
+
362template <typename T, typename Memory = default_memory<T>>
+
363class span_halo : public span_halo_impl<T, Memory> {
+
364public:
+ +
366
+ +
368
+
369 span_halo(communicator comm, T *data, std::size_t size, halo_bounds hb)
+
370 : span_halo_impl<T, Memory>(comm, owned_groups(comm, {data, size}, hb),
+
371 halo_groups(comm, {data, size}, hb)) {
+
372 check(size, hb);
+
373 }
+
374
+
375 span_halo(communicator comm, std::span<T> span, halo_bounds hb)
+
376 : span_halo_impl<T, Memory>(comm, owned_groups(comm, span, hb),
+
377 halo_groups(comm, span, hb)) {}
+
378
+
379private:
+
380 void check(auto size, auto hb) {
+
381 assert(size >= hb.prev + hb.next + std::max(hb.prev, hb.next));
+
382 }
+
383
+
384 static std::vector<group_type>
+
385 owned_groups(communicator comm, std::span<T> span, halo_bounds hb) {
+
386 std::vector<group_type> owned;
+
387 drlog.debug(nostd::source_location::current(),
+
388 "owned groups {}/{} first/last\n", comm.first(), comm.last());
+
389 if (hb.next > 0 && (hb.periodic || !comm.first())) {
+
390 owned.emplace_back(span.subspan(hb.prev, hb.next), comm.prev(),
+
391 communicator::tag::halo_reverse);
+
392 }
+
393 if (hb.prev > 0 && (hb.periodic || !comm.last())) {
+
394 owned.emplace_back(
+
395 span.subspan(rng::size(span) - (hb.prev + hb.next), hb.prev),
+
396 comm.next(), communicator::tag::halo_forward);
+
397 }
+
398 return owned;
+
399 }
+
400
+
401 static std::vector<group_type>
+
402 halo_groups(communicator comm, std::span<T> span, halo_bounds hb) {
+
403 std::vector<group_type> halo;
+
404 if (hb.prev > 0 && (hb.periodic || !comm.first())) {
+
405 halo.emplace_back(span.first(hb.prev), comm.prev(),
+
406 communicator::tag::halo_forward);
+
407 }
+
408 if (hb.next > 0 && (hb.periodic || !comm.last())) {
+
409 halo.emplace_back(span.last(hb.next), comm.next(),
+
410 communicator::tag::halo_reverse);
+
411 }
+
412 return halo;
+
413 }
+
414};
+
415
+
416} // namespace dr::mhp
+
417
+
418#ifdef DR_FORMAT
+
419
+
420template <>
+
421struct fmt::formatter<dr::mhp::halo_bounds> : formatter<string_view> {
+
422 template <typename FmtContext>
+
423 auto format(dr::mhp::halo_bounds hb, FmtContext &ctx) {
+
424 return format_to(ctx.out(), "prev: {} next: {}", hb.prev, hb.next);
+
425 }
+
426};
+
427
+
428#endif
+
Definition: communicator.hpp:9
+
Definition: halo.hpp:12
+
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:24
+
void reduce_begin()
Begin a halo reduction.
Definition: halo.hpp:78
+
void exchange_finalize()
Complete a halo exchange.
Definition: halo.hpp:67
+
void exchange_begin()
Begin a halo exchange.
Definition: halo.hpp:60
+
void reduce_finalize(const auto &op)
Complete a halo reduction.
Definition: halo.hpp:84
+
void reduce_finalize()
Complete a halo reduction.
Definition: halo.hpp:98
+
Definition: halo.hpp:167
+
index_group(T *data, std::size_t rank, const std::vector< std::size_t > &indices, const Memory &memory)
Constructor.
Definition: halo.hpp:177
+
Definition: halo.hpp:292
+
Definition: halo.hpp:363
+
Definition: halo.hpp:264
+
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:272
+
Definition: halo.hpp:354
+
Definition: halo.hpp:119
+
Definition: halo.hpp:123
+
Definition: halo.hpp:127
+
Definition: halo.hpp:115
+
Definition: halo.hpp:111
+
+ + + + diff --git a/doxygen/hierarchy.html b/doxygen/hierarchy.html new file mode 100644 index 0000000000..8af81e99ee --- /dev/null +++ b/doxygen/hierarchy.html @@ -0,0 +1,229 @@ + + + + + + + +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::mhp::__detail::allocator< T >
 Cdr::mhp::__detail::any
 CBaseSegment
 Cdr::shp::buffered_allocator< Allocator >
 Cdr::communicator
 Cdr::shp::__detail::coo_matrix< T, I, Allocator >
 Cdr::shp::csr_matrix_view_accessor< T, I, TIter, IIter >
 Cdr::default_memory< T >
 Cdr::shp::dense_matrix< T, Allocator >
 Cdr::shp::dense_matrix_accessor< T, Iter >
 Cdr::shp::dense_matrix_column_accessor< T, Iter >
 Cdr::shp::dense_matrix_column_view< T, Iter >
 Cdr::shp::dense_matrix_row_accessor< T, Iter >
 Cdr::shp::dense_matrix_row_view< T, Iter >
 Cdr::shp::device_allocator< T, Alignment >
 Cdr::mhp::device_policy
 Cdr::shp::device_policy
 Cdr::shp::device_ptr< T >
 Cdr::shp::device_ref< T >
 Cdr::__detail::direct_iterator< Iter >
 Cdr::shp::distributed_dense_matrix< T >
 Cdr::shp::distributed_dense_matrix_accessor< T, L >
 Cdr::mhp::distributed_mdarray< T, Rank >
 Cdr::shp::distributed_range_accessor< Segments >
 Cdr::shp::distributed_span_accessor< T, L >
 Cdr::mhp::distributed_vector< T >Distributed vector
 Cdr::shp::distributed_vector< T, Allocator >Distributed vector
 Cdr::shp::distributed_vector_accessor< T, L >
 Cdr::mhp::distribution
 Cdr::shp::duplicated_vector< T, Allocator >
 Cdr::mhp::dv_segment< DV >
 Cdr::mhp::dv_segment_iterator< DV >
 Cdr::mhp::dv_segment_reference< DV >
 Cdr::__detail::enumerate_adapter_closure
 Cdr::mhp::views::enumerate_adapter_closure
 Cdr::shp::views::enumerate_adapter_closure
 Cdr::__detail::enumerate_fn_
 Cdr::mhp::views::enumerate_fn_
 Cdr::shp::views::enumerate_fn_
 Cstd::false_type
 Cformatter
 Cdr::shp::future< T, Event >
 Cdr::mhp::__detail::global_context
 Cdr::mhp::halo_bounds
 Cdr::mhp::halo_impl< Group >
 Cdr::shp::id< dimensions >
 Cdr::index< T >
 Cdr::index< I >
 Cdr::index< std::int64_t >
 Cdr::index< std::size_t >
 Cdr::mhp::index_group< T, Memory >
 Cintegral_constant
 Cdr::views::iota_fn_
 Cdr::mhp::distributed_vector< T >::iterator
 Cdr::iterator_adaptor< Accessor >
 Cdr::ranges::__detail::local_fn_
 Cdr::logger
 Cdr::shp::matrix_entry< T, I >
 Cdr::shp::matrix_partition
 Cdr::shp::matrix_ref< T, I, TRef >
 Cdr::mhp::halo_impl< Group >::max_op
 CMdspan
 Cdr::mhp::views::mdspan_adapter_closure< Rank >
 Cdr::mhp::views::mdspan_fn_
 Cdr::__detail::mdspan_iter_accessor< Iter >
 Cdr::mhp::halo_impl< Group >::min_op
 Cdr::mhp::halo_impl< Group >::multiplies_op
 Cdr::normal_distributed_iterator_accessor< V >
 Cdr::mhp::halo_impl< Group >::plus_op
 Cdr::mhp::views::__detail::range_size< R >
 Cdr::mhp::views::__detail::range_size< R >
 Cdr::shp::device_allocator< T, Alignment >::rebind< U >
 Cdr::rma_window
 Cdr::mhp::halo_impl< Group >::second_op
 Cdr::shp::segment_range< dimensions >
 Cdr::shp::segment_range_accessor
 Cdr::mhp::segmented_view_iterator< BaseIter, SegTplIter, SegTplSentinel >
 Cdr::shp::views::slice_adaptor_closure
 Cdr::mhp::views::__detail::sliding_fn
 Cnostd::source_location
 Cdr::mhp::span_group< T, Memory >
 Cdr::shp::sparse_matrix< T, I >
 Cdr::mhp::views::submdspan_adapter_closure< Extents >
 Cdr::mhp::views::submdspan_fn_
 Cranges::subrange
 Cdr::mhp::subrange_iterator< DM >
 Cdr::views::transform_adapter_closure< F >
 Cdr::views::transform_fn_
 Cdr::transform_iterator< Iter, F >
 Cstd::true_type
 Ctuple_element
 Cdr::shp::__detail::tuple_or_pair< Args >
 Cdr::shp::__detail::tuple_or_pair< T, U >
 Cdr::shp::vector< T, Allocator >
 Cdr::shp::vector< T, Allocator >
 Cranges::view_interface
 Cdr::shp::zip_accessor< Iters >
 Cdr::mhp::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..9faabd1d94 --- /dev/null +++ b/doxygen/inclusive__exclusive__scan__impl_8hpp_source.html @@ -0,0 +1,278 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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::mhp::__detail {
+
14
+
15namespace detail = dr::__detail;
+
16
+
17}
+
18
+
19namespace dr::mhp::__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 init = *in_begin_direct;
+
43 in_begin_direct++;
+
44 out_begin_direct++;
+
45 }
+
46 assert(init.has_value());
+
47
+
48 std::exclusive_scan(policy, in_begin_direct, in_end_direct, out_begin_direct,
+
49 init.value(), binary_op);
+
50}
+
51
+
52template <bool is_exclusive, dr::distributed_contiguous_range R,
+
53 dr::distributed_iterator O, typename BinaryOp,
+
54 typename U = rng::range_value_t<R>>
+
55auto inclusive_exclusive_scan_impl_(R &&r, O &&d_first, BinaryOp &&binary_op,
+
56 std::optional<U> init = {}) {
+
57 using value_type = U;
+
58 assert(aligned(r, d_first));
+
59
+
60 bool use_sycl = mhp::use_sycl();
+
61 auto comm = default_comm();
+
62 auto rank = comm.rank();
+
63 auto local_segs = rng::views::zip(local_segments(r), local_segments(d_first));
+
64 auto global_segs =
+
65 rng::views::zip(dr::ranges::segments(r), dr::ranges::segments(d_first));
+
66 std::size_t num_segs = std::size_t(rng::size(dr::ranges::segments(r)));
+
67
+
68 // Pass 1 local inclusive scan
+
69 std::size_t seg_index = 0;
+
70 for (auto global_seg : global_segs) {
+
71 auto [global_in, global_out] = global_seg;
+
72
+
73 if (dr::ranges::rank(global_in) == rank) {
+
74 auto local_in = dr::ranges::__detail::local(global_in);
+
75 auto local_out = dr::ranges::__detail::local(global_out);
+
76 if (use_sycl) {
+
77#ifdef SYCL_LANGUAGE_VERSION
+
78 if constexpr (is_exclusive) {
+
79 local_exclusive_scan(dpl_policy(), local_in, local_out, binary_op,
+
80 init, seg_index);
+
81 } else {
+
82 local_inclusive_scan(dpl_policy(), local_in, local_out, binary_op,
+
83 init, seg_index);
+
84 }
+
85#else
+
86 assert(false);
+
87#endif
+
88 } else {
+
89 if constexpr (is_exclusive) {
+
90 local_exclusive_scan(std::execution::par_unseq, local_in, local_out,
+
91 binary_op, init, seg_index);
+
92 } else {
+
93 local_inclusive_scan(std::execution::par_unseq, local_in, local_out,
+
94 binary_op, init, seg_index);
+
95 }
+
96 }
+
97 }
+
98
+
99 seg_index++;
+
100 }
+
101 // Pass 2 put partial sums on root
+
102 seg_index = 0;
+
103 auto win = root_win();
+
104 for (auto global_seg : global_segs) {
+
105 // Do not need last segment
+
106 if (seg_index == num_segs - 1) {
+
107 break;
+
108 }
+
109
+
110 auto [global_in, global_out] = global_seg;
+
111 if (dr::ranges::rank(global_in) == rank) {
+
112 auto local_out = dr::ranges::__detail::local(global_out);
+
113 auto local_in = dr::ranges::__detail::local(global_in);
+
114 rng::range_value_t<R> back;
+
115 if constexpr (is_exclusive) {
+
116 // TODO: both sycl_get are executed sequetially, add method similar to
+
117 // sycl_get to read two (N) values in parallel
+
118 back = use_sycl ? binary_op(sycl_get(local_out.back()),
+
119 sycl_get(local_in.back()))
+
120 : binary_op(local_out.back(), local_in.back());
+
121 } else {
+
122 back = use_sycl ? sycl_get(local_out.back()) : local_out.back();
+
123 }
+
124
+
125 win.put(back, 0, seg_index);
+
126 }
+
127
+
128 seg_index++;
+
129 }
+
130 win.fence();
+
131
+
132 // Pass 3: scan of partial sums on root
+
133 if (rank == 0) {
+
134 value_type *partials = win.local_data<value_type>();
+
135 std::inclusive_scan(partials, partials + num_segs, partials, binary_op);
+
136 }
+
137 barrier();
+
138
+
139 // Pass 4: rebase
+
140 seg_index = 0;
+
141 for (auto global_seg : global_segs) {
+
142 if (seg_index > 0) {
+
143 auto [global_in, global_out] = global_seg;
+
144
+
145 auto offset = win.get<value_type>(0, seg_index - 1);
+
146 auto rebase = [offset, binary_op](auto &v) { v = binary_op(v, offset); };
+
147 if (dr::ranges::rank(global_in) == rank) {
+
148 auto local_in = dr::ranges::__detail::local(global_in);
+
149 auto local_out = rng::views::take(
+
150 dr::ranges::__detail::local(global_out), rng::size(local_in));
+
151 auto local_out_adj = [](auto local_out, auto offset) {
+
152 if constexpr (is_exclusive) {
+
153 // FIXME: this may probably not work with device allocator, add a
+
154 // test and check it, see:
+
155 // https://github.com/oneapi-src/distributed-ranges/issues/589
+
156 auto local_out_begin_direct =
+
157 detail::direct_iterator(local_out.begin());
+
158 *local_out_begin_direct = offset;
+
159 return local_out | rng::views::drop(1);
+
160 } else {
+
161 return local_out;
+
162 }
+
163 }(local_out, offset);
+
164 // dr::drlog.debug("rebase before: {}\n", local_out_adj);
+
165 if (use_sycl) {
+
166#ifdef SYCL_LANGUAGE_VERSION
+
167 auto wrap_rebase = [rebase, base = rng::begin(local_out_adj)](
+
168 auto idx) { rebase(base[idx]); };
+
169 detail::parallel_for(dr::mhp::sycl_queue(),
+
170 sycl::range<>(rng::distance(local_out_adj)),
+
171 wrap_rebase)
+
172 .wait();
+
173#else
+
174 assert(false);
+
175#endif
+
176 } else {
+
177 std::for_each(std::execution::par_unseq, local_out_adj.begin(),
+
178 local_out_adj.end(), rebase);
+
179 }
+
180 // dr::drlog.debug("rebase after: {}\n", local_out_adj);
+
181 }
+
182 }
+
183
+
184 seg_index++;
+
185 }
+
186
+
187 barrier();
+
188 return d_first + rng::size(r);
+
189}
+
190} // namespace dr::mhp::__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..e6e339b946 --- /dev/null +++ b/doxygen/index_8hpp_source.html @@ -0,0 +1,210 @@ + + + + + + + +Distributed Ranges: /home/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
+
76 template <std::size_t Index>
+
77 constexpr T get() const noexcept
+
78 requires(Index <= 1)
+
79 {
+
80 if constexpr (Index == 0) {
+
81 return first;
+
82 }
+
83 if constexpr (Index == 1) {
+
84 return second;
+
85 }
+
86 }
+
87
+
88 index() = default;
+
89 ~index() = default;
+
90 index(const index &) = default;
+
91 index &operator=(const index &) = default;
+
92 index(index &&) = default;
+
93 index &operator=(index &&) = default;
+
94
+
95 index_type first;
+
96 index_type second;
+
97};
+
98
+
99} // namespace dr
+
100
+
101namespace std {
+
102
+
103template <std::size_t Index, std::integral I>
+
104struct tuple_element<Index, dr::index<I>>
+
105 : tuple_element<Index, std::tuple<I, I>> {};
+
106
+
107template <std::integral I>
+
108struct tuple_size<dr::index<I>> : integral_constant<std::size_t, 2> {};
+
109
+
110template <std::size_t Index, std::integral I>
+
111inline constexpr I get(dr::index<I> index)
+
112 requires(Index <= 1)
+
113{
+
114 if constexpr (Index == 0) {
+
115 return index.first;
+
116 }
+
117 if constexpr (Index == 1) {
+
118 return index.second;
+
119 }
+
120}
+
121
+
122} // 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..81e7753efa --- /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..b7b475009d --- /dev/null +++ b/doxygen/inherit_graph_0.md5 @@ -0,0 +1 @@ +93edc5ecfaa4fce735b3f8a84a0b7636 \ 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..d85fa7e853 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..f19c2b165b 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..ff25c6d07a --- /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..74a5210c95 --- /dev/null +++ b/doxygen/inherit_graph_10.md5 @@ -0,0 +1 @@ +27559c7f6d62fbe4061030ba991c97fa \ 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..506e80a86b Binary files /dev/null and b/doxygen/inherit_graph_10.png differ diff --git a/doxygen/inherit_graph_11.map b/doxygen/inherit_graph_11.map new file mode 100644 index 0000000000..8030d7e11f --- /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..8f35efcff4 --- /dev/null +++ b/doxygen/inherit_graph_11.md5 @@ -0,0 +1 @@ +d580d680ffa76c492b545ca4c5e06323 \ 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..1788483224 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..2faefe6215 --- /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..ed2d2ee5cf --- /dev/null +++ b/doxygen/inherit_graph_12.md5 @@ -0,0 +1 @@ +a8476a03c3fbf9fb6cae7ddd3fc18c5a \ 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..d335208cae 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..ac0702e23d --- /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..4dd5fd3759 --- /dev/null +++ b/doxygen/inherit_graph_13.md5 @@ -0,0 +1 @@ +354b5e2b077b754c16ea84538025ef3f \ 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..8645aa4ec5 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..1d9791b4dc --- /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..26fc5e2d9a --- /dev/null +++ b/doxygen/inherit_graph_14.md5 @@ -0,0 +1 @@ +6e4c382bb34c6af2a01dc05a1409c323 \ 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..0d05799454 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..e42334ed48 --- /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..13f966d177 --- /dev/null +++ b/doxygen/inherit_graph_15.md5 @@ -0,0 +1 @@ +268672f92723082a4d2d711aab626b02 \ 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..2217175e13 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..beb87bd0bc --- /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..17e688459b --- /dev/null +++ b/doxygen/inherit_graph_16.md5 @@ -0,0 +1 @@ +70080e8fc9d5735dbc4be9110f39b371 \ 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..c2896a88ae 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..cf448fed0c --- /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..2527d53c76 --- /dev/null +++ b/doxygen/inherit_graph_17.md5 @@ -0,0 +1 @@ +abaed896f59408d296e4613f31c5870a \ 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..0cef7bba58 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..4526161181 --- /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..bc9f2c98e0 --- /dev/null +++ b/doxygen/inherit_graph_18.md5 @@ -0,0 +1 @@ +14c9137432a2aa336ded03c3974fd9e4 \ 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..21378d3b33 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..b2238697fc --- /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..b7de5e0d2a --- /dev/null +++ b/doxygen/inherit_graph_19.md5 @@ -0,0 +1 @@ +9f4a6bd39e8c3b5a27b56a4350d212ea \ 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..9fc8d84ce0 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..3c8e282d29 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..7f5d20793a --- /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..dd59579941 --- /dev/null +++ b/doxygen/inherit_graph_20.md5 @@ -0,0 +1 @@ +007d543bbf1649554db3c21f4f5dfe15 \ 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..7e603b7895 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..f4fa412527 --- /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..c6bd26f243 --- /dev/null +++ b/doxygen/inherit_graph_21.md5 @@ -0,0 +1 @@ +f8239ef6f007ff12f322f081c1743e9c \ 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..980a81520f 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..f1aeafeb28 --- /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..eb7dbaa044 --- /dev/null +++ b/doxygen/inherit_graph_22.md5 @@ -0,0 +1 @@ +86555569b6770bae7ab22f02859c54f3 \ 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..d20cfd30cb 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..d225fc248a --- /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..7b90396709 --- /dev/null +++ b/doxygen/inherit_graph_23.md5 @@ -0,0 +1 @@ +e4fb5064762318d230843d8b9cbf6be6 \ 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..a22a1d0124 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..002640d98f --- /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..a89b397d04 --- /dev/null +++ b/doxygen/inherit_graph_24.md5 @@ -0,0 +1 @@ +48584fa7144b3e628d3d5f892637c96c \ 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..85bc4e33a0 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..e02b999187 --- /dev/null +++ b/doxygen/inherit_graph_25.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/inherit_graph_25.md5 b/doxygen/inherit_graph_25.md5 new file mode 100644 index 0000000000..6e4f2976de --- /dev/null +++ b/doxygen/inherit_graph_25.md5 @@ -0,0 +1 @@ +6a8c8a087c7e797be86bc5d6ca4383f8 \ 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..81930a5c8a 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..e336fb20f4 --- /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..5db3f3195e --- /dev/null +++ b/doxygen/inherit_graph_26.md5 @@ -0,0 +1 @@ +08c245bcb98a74e4a02640f891bcfe40 \ 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..22f4647cb0 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..9a37be8c43 --- /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..bc2e7b5168 --- /dev/null +++ b/doxygen/inherit_graph_27.md5 @@ -0,0 +1 @@ +243760a1d48cd18d0d0005d7b61140a2 \ 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..5995598985 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..d1c1a52404 --- /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..9ab5ee01f4 --- /dev/null +++ b/doxygen/inherit_graph_28.md5 @@ -0,0 +1 @@ +239620059f617c556546f8a46c31c0f0 \ 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..ad7d603a93 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..af6467694a --- /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..7a90a31815 --- /dev/null +++ b/doxygen/inherit_graph_29.md5 @@ -0,0 +1 @@ +dc377fbabd3e4e8a95e0b187acc09528 \ 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..273c7dd317 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..ac5df40747 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..7c858cd4f3 --- /dev/null +++ b/doxygen/inherit_graph_30.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_30.md5 b/doxygen/inherit_graph_30.md5 new file mode 100644 index 0000000000..f75fb6e710 --- /dev/null +++ b/doxygen/inherit_graph_30.md5 @@ -0,0 +1 @@ +8a0581ec2287ceeb2bc81ecaa4a2de48 \ 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..85548b490b 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..4979b461b7 --- /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..1663f651c4 --- /dev/null +++ b/doxygen/inherit_graph_31.md5 @@ -0,0 +1 @@ +c41e727f68df3a088480ab21960ddf9a \ 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..8b234f5b4b 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..e438acf9f9 --- /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..f53ff7dc36 --- /dev/null +++ b/doxygen/inherit_graph_32.md5 @@ -0,0 +1 @@ +fca9eb8c1e380a2c5920a50b98f2b617 \ 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..c9608e48a2 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..83fa1cb3d0 --- /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..81ff2b98cf --- /dev/null +++ b/doxygen/inherit_graph_33.md5 @@ -0,0 +1 @@ +bc7fe7b5c4714911e504008e1371f759 \ 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..018cae67d9 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..7f370f2e02 --- /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..d9b8789310 --- /dev/null +++ b/doxygen/inherit_graph_34.md5 @@ -0,0 +1 @@ +8b9fcc6e8a643640c5a9b6d41e5736ed \ 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..a28425d0ad 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..14636d4ac2 --- /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..ea8c91befc --- /dev/null +++ b/doxygen/inherit_graph_35.md5 @@ -0,0 +1 @@ +1db6d44cfc8f2a00d676127606e9bdef \ 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..bbf54625ef 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..8e38b1f063 --- /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..d2b1d8eabd --- /dev/null +++ b/doxygen/inherit_graph_36.md5 @@ -0,0 +1 @@ +ed2b92e7a91528978785960e43c55a00 \ 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..bbf54625ef 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..4199cf2ebe --- /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..be1605721f --- /dev/null +++ b/doxygen/inherit_graph_37.md5 @@ -0,0 +1 @@ +0d8d19b27d9e91c577bd7f82772fb059 \ 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..f835c8c474 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..b99ad6d2ce --- /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..7ac5062fe4 --- /dev/null +++ b/doxygen/inherit_graph_38.md5 @@ -0,0 +1 @@ +b1d7c75440b641c1d853f21f340b64b0 \ 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..d9b45506bf 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..d0d1288c7a --- /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..482e5485a2 --- /dev/null +++ b/doxygen/inherit_graph_39.md5 @@ -0,0 +1 @@ +c76c2f9e951cfd17068629bacaee1fb8 \ 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..4530d2c4f4 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..7f68b87c5a --- /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..65a67aacd7 --- /dev/null +++ b/doxygen/inherit_graph_4.md5 @@ -0,0 +1 @@ +1fa2988ea38cc7d14cca1e2441170cf1 \ 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..0a47ae1335 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..2a42c0c0ff --- /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..b4897a7f17 --- /dev/null +++ b/doxygen/inherit_graph_40.md5 @@ -0,0 +1 @@ +345f9cce7abeac9ff5e0c88d066755fd \ 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..384072ada5 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..4739162b5f --- /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..ca9a274c9c --- /dev/null +++ b/doxygen/inherit_graph_41.md5 @@ -0,0 +1 @@ +ba2574de643bfb458e938d4246ef5f38 \ 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..040928d41b 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..2bbbc4f489 --- /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..93d2d34d65 --- /dev/null +++ b/doxygen/inherit_graph_42.md5 @@ -0,0 +1 @@ +f6ce7e438a18c0f64e4ff3bf5b3c58c1 \ 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..b9b0a7b8f1 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..1dcbe68049 --- /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..70d3f9b863 --- /dev/null +++ b/doxygen/inherit_graph_43.md5 @@ -0,0 +1 @@ +df1f6d689a6a519417402e2c06bfe630 \ 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..f17d0631b4 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..8dbde7b20d --- /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..2f8c278c5d --- /dev/null +++ b/doxygen/inherit_graph_44.md5 @@ -0,0 +1 @@ +6cd8881d3268a2ea2320ed731cd47147 \ 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..c7b4f6e114 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..344c908d90 --- /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..312658193e --- /dev/null +++ b/doxygen/inherit_graph_45.md5 @@ -0,0 +1 @@ +5f3c346a4a2c9e3595de01096b4352a9 \ 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..9f7ffd60f4 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..816a7eadbf --- /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..8059afa36f --- /dev/null +++ b/doxygen/inherit_graph_46.md5 @@ -0,0 +1 @@ +ecf7b142f3d4cd8c66eeed52aa34d31c \ 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..8191aa9c63 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..c9c5f08b59 --- /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..8803d20040 --- /dev/null +++ b/doxygen/inherit_graph_47.md5 @@ -0,0 +1 @@ +7f1da4fc5ce43fe3c4a08fc30e05abd9 \ 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..c7f72e3874 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..c4ef8d9b30 --- /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..ac57c104c1 --- /dev/null +++ b/doxygen/inherit_graph_48.md5 @@ -0,0 +1 @@ +80b4c4ff49575110405c27a85e721cf9 \ 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..8f2e878b74 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..fda75b99e1 --- /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..d8d400274b --- /dev/null +++ b/doxygen/inherit_graph_49.md5 @@ -0,0 +1 @@ +a84a19f2a690f9a90c888b0c1cde425e \ 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..fd1907076a 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..64284a4a86 --- /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..cb834cd101 --- /dev/null +++ b/doxygen/inherit_graph_5.md5 @@ -0,0 +1 @@ +2eed3c5045260177521923355bc7728e \ 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..cf313bc081 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..16e5e2db91 --- /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..e4435d8b11 --- /dev/null +++ b/doxygen/inherit_graph_50.md5 @@ -0,0 +1 @@ +464bbf2c5de1010e34c56fc047fabd5d \ 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..d84c7ade1a 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..3693f3c564 --- /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..4b3b4e64d3 --- /dev/null +++ b/doxygen/inherit_graph_51.md5 @@ -0,0 +1 @@ +a20b94e8bd7d463519503b8ca6c0f23a \ 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..604ab3fe80 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..47a44d59de --- /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..e1fa1c5a38 --- /dev/null +++ b/doxygen/inherit_graph_52.md5 @@ -0,0 +1 @@ +5b63a490de1201ba2c17314788f70601 \ 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..4e5c408906 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..474628a0d2 --- /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..44a0e51107 --- /dev/null +++ b/doxygen/inherit_graph_53.md5 @@ -0,0 +1 @@ +5e067ff9d5d643860865234d1d3d12da \ 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..f78c57d766 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..10769b548b --- /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..96e92fd895 --- /dev/null +++ b/doxygen/inherit_graph_54.md5 @@ -0,0 +1 @@ +0841a25408965ef5a3e515247a1afc73 \ 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..7cc6e3be53 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..de223ad7b9 --- /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..753508f73f --- /dev/null +++ b/doxygen/inherit_graph_55.md5 @@ -0,0 +1 @@ +4cd3e0c930d2e9f20369e1353dde421e \ 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..acb90a1a62 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..353b6015de --- /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..c1b1784d21 --- /dev/null +++ b/doxygen/inherit_graph_56.md5 @@ -0,0 +1 @@ +35133f1791f7f7788c7a4c10247858a9 \ 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..af259394e1 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..1edcd19e54 --- /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..2516928e81 --- /dev/null +++ b/doxygen/inherit_graph_57.md5 @@ -0,0 +1 @@ +9b969aeeac7fa919527627b8607143eb \ 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..b8937a16c6 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..9c84ca90a6 --- /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..72beb4917e --- /dev/null +++ b/doxygen/inherit_graph_58.md5 @@ -0,0 +1 @@ +ee02bb4ab04bafb0c260d8d30e26a29c \ 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..b61e96e626 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..8d912eb972 --- /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..31bffb619c --- /dev/null +++ b/doxygen/inherit_graph_59.md5 @@ -0,0 +1 @@ +c7f42470493cb1320f68b70373969506 \ 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..5df3c521d7 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..266f84ad22 --- /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..493a4bedbf --- /dev/null +++ b/doxygen/inherit_graph_6.md5 @@ -0,0 +1 @@ +b8b5b2fd047f3dd0af6a866e0a19c190 \ 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..958c4399b5 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..00ad05f24d --- /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..be4f047884 --- /dev/null +++ b/doxygen/inherit_graph_60.md5 @@ -0,0 +1 @@ +63d7dc238fa93e1e68e01ee344aa559a \ 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..020211a6d1 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..c3a1123b32 --- /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..2e8db83e06 --- /dev/null +++ b/doxygen/inherit_graph_61.md5 @@ -0,0 +1 @@ +67a94236cd8efe72bb2dfd40f0ffe4ac \ 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..6cb821b450 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..7273889158 --- /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..b489746b34 --- /dev/null +++ b/doxygen/inherit_graph_62.md5 @@ -0,0 +1 @@ +34dc31fcb6cec13274c4dff4605de844 \ 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..fcd298f1df 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..31578eb949 --- /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..282a5778f0 --- /dev/null +++ b/doxygen/inherit_graph_63.md5 @@ -0,0 +1 @@ +d7b6599aad2f9e4b6d4a74874cbc7e31 \ 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..19486d2fe4 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..cc13e5b8c4 --- /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..c23bdd7813 --- /dev/null +++ b/doxygen/inherit_graph_64.md5 @@ -0,0 +1 @@ +4d834830200eac7c7d3f3da2f1fe2860 \ 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..b5cb484a3f 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..11d2ae2603 --- /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..948783cf0f --- /dev/null +++ b/doxygen/inherit_graph_65.md5 @@ -0,0 +1 @@ +ae7ec7dd2e679d97287a4a494aa2a71c \ 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..dbeee1257c 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..5c245dbc02 --- /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..ab05a7cb13 --- /dev/null +++ b/doxygen/inherit_graph_66.md5 @@ -0,0 +1 @@ +c22a683d6d841dbd93accbc2b4332a29 \ 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..4a04bdc327 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..4750d3b288 --- /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..41e1a08c43 --- /dev/null +++ b/doxygen/inherit_graph_67.md5 @@ -0,0 +1 @@ +74ceff12e07d8239df75e17d386c888d \ 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..d0556213da 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..e659840ac4 --- /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..7db09d7715 --- /dev/null +++ b/doxygen/inherit_graph_68.md5 @@ -0,0 +1 @@ +aaeb8b9dbaabad0e270549c3b552ead5 \ 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..522b3c22e6 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..c9bc19153d --- /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..45ba800e06 --- /dev/null +++ b/doxygen/inherit_graph_69.md5 @@ -0,0 +1 @@ +76686831efc9a7c74376df86ae6cf282 \ 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..7433ab6b8e 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..349ca6a86c --- /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..6fe03a5c86 --- /dev/null +++ b/doxygen/inherit_graph_7.md5 @@ -0,0 +1 @@ +8918162f5a3836aa5579ebb796bdadc5 \ 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..9d8be7ea78 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..e059f8dda7 --- /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..44a45e49b5 --- /dev/null +++ b/doxygen/inherit_graph_70.md5 @@ -0,0 +1 @@ +b00448e542ea6446746b16eacdc760d7 \ 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..02ab2b21ba 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..187abc4b89 --- /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..3e0caea150 --- /dev/null +++ b/doxygen/inherit_graph_71.md5 @@ -0,0 +1 @@ +fb7f83d8ac87dd0b54dd8493136d0ed2 \ 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..bc994af9d9 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..851a971b88 --- /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..ae60de1811 --- /dev/null +++ b/doxygen/inherit_graph_72.md5 @@ -0,0 +1 @@ +ffc282db75e48b230694d31bf325bfaa \ 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..bb036c64c3 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..69ee4e4c9c --- /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..c1749251bc --- /dev/null +++ b/doxygen/inherit_graph_73.md5 @@ -0,0 +1 @@ +85fb402c567ebee222a79992ccc99052 \ 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..53075356a4 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..5c74ee9a06 --- /dev/null +++ b/doxygen/inherit_graph_74.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/inherit_graph_74.md5 b/doxygen/inherit_graph_74.md5 new file mode 100644 index 0000000000..a732c0d4ae --- /dev/null +++ b/doxygen/inherit_graph_74.md5 @@ -0,0 +1 @@ +0c67963a8f881beb9e71f865d3434c3e \ 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..a68fef140d 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..d49d736746 --- /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..27376ee330 --- /dev/null +++ b/doxygen/inherit_graph_75.md5 @@ -0,0 +1 @@ +201182335b7a209e92cd1ec5799ba107 \ 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..971d24e89a 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..9f8d6dd9a6 --- /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..f801d903dc --- /dev/null +++ b/doxygen/inherit_graph_76.md5 @@ -0,0 +1 @@ +0fa6d5d19da3cb8d8530c42c2eb4d11b \ 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..47c85c6daa 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..e1589fcbfd --- /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..8b5446f23c --- /dev/null +++ b/doxygen/inherit_graph_77.md5 @@ -0,0 +1 @@ +cb3bd2b41081c92540354e12507acd6e \ 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..dc503640b8 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..860cfb4736 --- /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..ef5fd1a6a8 --- /dev/null +++ b/doxygen/inherit_graph_78.md5 @@ -0,0 +1 @@ +9284b26c9223bda4899e86acf28b37ef \ 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..49cfec2f4a 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..508e7260f0 --- /dev/null +++ b/doxygen/inherit_graph_79.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/inherit_graph_79.md5 b/doxygen/inherit_graph_79.md5 new file mode 100644 index 0000000000..c8960fa6b9 --- /dev/null +++ b/doxygen/inherit_graph_79.md5 @@ -0,0 +1 @@ +e98d7fb182d1fc2f5fd33fd189323476 \ 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..f28032cf71 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..a3966637dd --- /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..c4c505abe4 --- /dev/null +++ b/doxygen/inherit_graph_8.md5 @@ -0,0 +1 @@ +91a2aaa6c2bfa410ce6e09fcc2c3b288 \ 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..07c0f094f6 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..30ce67d788 --- /dev/null +++ b/doxygen/inherit_graph_80.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_80.md5 b/doxygen/inherit_graph_80.md5 new file mode 100644 index 0000000000..51e5470038 --- /dev/null +++ b/doxygen/inherit_graph_80.md5 @@ -0,0 +1 @@ +9da27aacb4e3110f80ee4cd34f36c345 \ 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..8235f861d4 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..9d43883e88 --- /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..866bc8eb73 --- /dev/null +++ b/doxygen/inherit_graph_81.md5 @@ -0,0 +1 @@ +d5b7b0b26dbd1e9ea23de3e13140b9f9 \ 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..e48fee12f4 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..0685f9685b --- /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..fcc2cb3dc0 --- /dev/null +++ b/doxygen/inherit_graph_82.md5 @@ -0,0 +1 @@ +ee5d4a9988a49e7fed8c11748a53620d \ 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..598b75d093 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..4d61ab9fa8 --- /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..c13cddbb97 --- /dev/null +++ b/doxygen/inherit_graph_83.md5 @@ -0,0 +1 @@ +48c4b9a6711cf76b8a43e8191b03fbcd \ 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..b79c17748e 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..78a725882f --- /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..86b43d21b4 --- /dev/null +++ b/doxygen/inherit_graph_84.md5 @@ -0,0 +1 @@ +de580f231e032b93fb1d8ede890eb20e \ 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..206096175b 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..6f06c37521 --- /dev/null +++ b/doxygen/inherit_graph_85.map @@ -0,0 +1,3 @@ + + + diff --git a/doxygen/inherit_graph_85.md5 b/doxygen/inherit_graph_85.md5 new file mode 100644 index 0000000000..1bb3343620 --- /dev/null +++ b/doxygen/inherit_graph_85.md5 @@ -0,0 +1 @@ +d88756fb47c7942bd4b7868f0e11dfe2 \ 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..bd111fa3ab 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..9bfc751359 --- /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..6bb8a63976 --- /dev/null +++ b/doxygen/inherit_graph_86.md5 @@ -0,0 +1 @@ +68470a99abca6eb73bc6ca9cc811f059 \ 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..aad27b6ac4 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..5a48316005 --- /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..4e77cf4b89 --- /dev/null +++ b/doxygen/inherit_graph_87.md5 @@ -0,0 +1 @@ +8e48c99624f8c61964b5065e1bdefda9 \ 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..fd85679d8b 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..81042861b1 --- /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..5d6b62e3f2 --- /dev/null +++ b/doxygen/inherit_graph_88.md5 @@ -0,0 +1 @@ +46571129c8bd16efbaaee6e76ef08409 \ 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..eda96def5a 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..714b6fee82 --- /dev/null +++ b/doxygen/inherit_graph_89.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/inherit_graph_89.md5 b/doxygen/inherit_graph_89.md5 new file mode 100644 index 0000000000..89517066fb --- /dev/null +++ b/doxygen/inherit_graph_89.md5 @@ -0,0 +1 @@ +c99d8d73ff5766bfadd19cf5d600988d \ 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..0599e644fa 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..bda4e0642f --- /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..49fa64ec4c --- /dev/null +++ b/doxygen/inherit_graph_9.md5 @@ -0,0 +1 @@ +0a66abc111349754d2a41894abfbd82f \ 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..ef2e83dbfb 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..925518513f --- /dev/null +++ b/doxygen/inherit_graph_90.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/doxygen/inherit_graph_90.md5 b/doxygen/inherit_graph_90.md5 new file mode 100644 index 0000000000..3434024030 --- /dev/null +++ b/doxygen/inherit_graph_90.md5 @@ -0,0 +1 @@ +863d871486465d814a9cb036cb5cbbc4 \ 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..77018c909e 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..39e19ca85b --- /dev/null +++ b/doxygen/inherit_graph_91.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/inherit_graph_91.md5 b/doxygen/inherit_graph_91.md5 new file mode 100644 index 0000000000..18a7f373ef --- /dev/null +++ b/doxygen/inherit_graph_91.md5 @@ -0,0 +1 @@ +8567a8a338256a3707a79e7509b1b758 \ 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..4fc6d32b6c 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..a6d23d307d --- /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..6a47cd1242 --- /dev/null +++ b/doxygen/inherit_graph_92.md5 @@ -0,0 +1 @@ +eee26040db0a164c303812a7fe4730a0 \ 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..6f44ffc39c 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..1f19bf00ce --- /dev/null +++ b/doxygen/inherit_graph_93.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/inherit_graph_93.md5 b/doxygen/inherit_graph_93.md5 new file mode 100644 index 0000000000..409e4966fd --- /dev/null +++ b/doxygen/inherit_graph_93.md5 @@ -0,0 +1 @@ +956d176d21d07f335e35030bbc90364f \ 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..1d3e270f13 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..698a8d14b7 --- /dev/null +++ b/doxygen/inherit_graph_94.map @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/doxygen/inherit_graph_94.md5 b/doxygen/inherit_graph_94.md5 new file mode 100644 index 0000000000..2c42d8db3b --- /dev/null +++ b/doxygen/inherit_graph_94.md5 @@ -0,0 +1 @@ +a962486d23a9a7ae4e05698b91db978a \ 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..0e23f1eed8 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..58725177b1 --- /dev/null +++ b/doxygen/inherit_graph_95.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/doxygen/inherit_graph_95.md5 b/doxygen/inherit_graph_95.md5 new file mode 100644 index 0000000000..5821a86cf6 --- /dev/null +++ b/doxygen/inherit_graph_95.md5 @@ -0,0 +1 @@ +fbd92c813463d156b599b4d3b90c94d1 \ 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..a303c4fa62 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..155289a779 --- /dev/null +++ b/doxygen/inherit_graph_96.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/doxygen/inherit_graph_96.md5 b/doxygen/inherit_graph_96.md5 new file mode 100644 index 0000000000..c98c444558 --- /dev/null +++ b/doxygen/inherit_graph_96.md5 @@ -0,0 +1 @@ +570484ee268fed1ef427dab3ae9ceed5 \ 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..00def2be55 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..2c140a6b42 --- /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..9d449a639c --- /dev/null +++ b/doxygen/inherit_graph_97.md5 @@ -0,0 +1 @@ +06220aadb136d1fa7400f5ced28ae8c3 \ 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..d7fff01a54 Binary files /dev/null and b/doxygen/inherit_graph_97.png differ diff --git a/doxygen/inherits.html b/doxygen/inherits.html new file mode 100644 index 0000000000..fc483797ea --- /dev/null +++ b/doxygen/inherits.html @@ -0,0 +1,619 @@ + + + + + + + +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..7c1199c346 --- /dev/null +++ b/doxygen/init_8hpp_source.html @@ -0,0 +1,191 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/algorithms/execution_policy.hpp>
+
15#include <dr/shp/util.hpp>
+
16#include <oneapi/dpl/execution>
+
17
+
18namespace dr::shp {
+
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 < shp::nprocs(); rank++) {
+
89 if (shp::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::shp
+
+ + + + diff --git a/doxygen/iterator__adaptor_8hpp_source.html b/doxygen/iterator__adaptor_8hpp_source.html new file mode 100644 index 0000000000..986de5b308 --- /dev/null +++ b/doxygen/iterator__adaptor_8hpp_source.html @@ -0,0 +1,287 @@ + + + + + + + +Distributed Ranges: /home/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..ded821b40f --- /dev/null +++ b/doxygen/local__gemm_8hpp_source.html @@ -0,0 +1,169 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/views/dense_matrix_view.hpp>
+
8
+
9#ifdef USE_MKL
+
10#include <oneapi/mkl.hpp>
+
11#endif
+
12
+
13namespace dr::shp {
+
14
+
15namespace __detail {
+
16
+
17template <typename T>
+
18auto custom_gemm(sycl::queue &q, shp::dense_matrix_view<T> a,
+
19 shp::dense_matrix_view<T> b, shp::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, shp::dense_matrix_view<T> a,
+
50 shp::dense_matrix_view<T> b, shp::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, shp::dense_matrix_view<T> a,
+
66 shp::dense_matrix_view<T> b, shp::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, shp::dense_matrix_view<T> a,
+
75 shp::dense_matrix_view<T> b, shp::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::shp
+
+ + + + diff --git a/doxygen/local__gemv_8hpp_source.html b/doxygen/local__gemv_8hpp_source.html new file mode 100644 index 0000000000..a4d3eb999d --- /dev/null +++ b/doxygen/local__gemv_8hpp_source.html @@ -0,0 +1,185 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/containers/sparse_matrix.hpp>
+
9#include <dr/shp/util.hpp>
+
10
+
11#ifdef USE_MKL
+
12#include <oneapi/mkl.hpp>
+
13#endif
+
14
+
15namespace dr::shp {
+
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::shp::__detail::local(a.rowptr_data());
+
65 auto colind = dr::shp::__detail::local(a.colind_data());
+
66 auto values = dr::shp::__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::shp
+
+ + + + diff --git a/doxygen/logger_8hpp_source.html b/doxygen/logger_8hpp_source.html new file mode 100644 index 0000000000..e4c727abd1 --- /dev/null +++ b/doxygen/logger_8hpp_source.html @@ -0,0 +1,148 @@ + + + + + + + +Distributed Ranges: /home/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 <fstream>
+
8
+
9#include <vendor/source_location/source_location.hpp>
+
10
+
11#include <dr/detail/format_shim.hpp>
+
12
+
13namespace dr {
+
14
+
15#if DR_FORMAT
+
16
+
17class logger {
+
18public:
+
19 void set_file(std::ofstream &fout) { fout_ = &fout; }
+
20
+
21 template <typename... Args>
+
22 void debug(const nostd::source_location &location,
+
23 fmt::format_string<Args...> format, Args &&...args) {
+
24 if (fout_) {
+
25 *fout_ << location.file_name() << ":" << location.line() << ": "
+
26 << fmt::format(format, std::forward<Args>(args)...);
+
27 fout_->flush();
+
28 }
+
29 }
+
30 template <typename... Args>
+
31 void debug(fmt::format_string<Args...> format, Args &&...args) {
+
32 if (fout_) {
+
33 *fout_ << fmt::format(format, std::forward<Args>(args)...);
+
34 fout_->flush();
+
35 }
+
36 }
+
37
+
38private:
+
39 std::ofstream *fout_ = nullptr;
+
40};
+
41
+
42#else
+
43
+
44class logger {
+
45public:
+
46 void set_file(std::ofstream &fout) { fout_ = &fout; }
+
47
+
48 template <typename... Args>
+
49 void debug(const nostd::source_location &location, std::string format,
+
50 Args &&...args) {}
+
51 template <typename... Args> void debug(std::string format, Args &&...args) {}
+
52
+
53private:
+
54 std::ofstream *fout_ = nullptr;
+
55};
+
56
+
57#endif
+
58
+
59inline logger drlog;
+
60
+
61} // namespace dr
+
Definition: logger.hpp:44
+
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..5a3ba73763 --- /dev/null +++ b/doxygen/matrix__algorithms_8hpp_source.html @@ -0,0 +1,93 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/algorithms/matrix/gemm.hpp>
+
8#include <dr/shp/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..242e18fd49 --- /dev/null +++ b/doxygen/matrix__entry_8hpp_source.html @@ -0,0 +1,320 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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::shp {
+
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::shp
+
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::shp::matrix_entry<T, I>>
+
102 : tuple_element<Index, std::tuple<dr::index<I>, T>> {};
+
103
+
104template <typename T, typename I>
+
105struct tuple_size<dr::shp::matrix_entry<T, I>> : integral_constant<size_t, 2> {
+
106};
+
107
+
108} // namespace std
+
109
+
110namespace dr::shp {
+
111
+
112template <typename T, typename I = std::size_t, typename TRef = T &>
+ +
114public:
+
115 using scalar_type = T;
+
116 using index_type = I;
+
117
+
118 using key_type = dr::index<I>;
+
119 using map_type = T;
+
120
+
121 using scalar_reference = TRef;
+
122
+ +
124
+
125 matrix_ref(dr::index<I> index, scalar_reference value)
+
126 : index_(index), value_(value) {}
+
127
+
128 operator value_type() const noexcept { return value_type(index_, value_); }
+
129
+
130 operator std::pair<std::pair<I, I>, T>() const noexcept {
+
131 return {{index_[0], index_[1]}, value_};
+
132 }
+
133
+
134 template <std::size_t Index>
+
135 decltype(auto) get() const noexcept
+
136 requires(Index <= 1)
+
137 {
+
138 if constexpr (Index == 0) {
+
139 return index();
+
140 }
+
141 if constexpr (Index == 1) {
+
142 return value();
+
143 }
+
144 }
+
145
+
146 dr::index<I> index() const noexcept { return index_; }
+
147
+
148 scalar_reference value() const noexcept { return value_; }
+
149
+
150 template <std::integral U>
+
151 requires(!std::is_same_v<I, U> &&
+
152 std::numeric_limits<U>::max() >= std::numeric_limits<I>::max())
+
153 operator matrix_ref<T, U, TRef>() const noexcept {
+
154 return matrix_ref<T, U, TRef>(index_, value_);
+
155 }
+
156
+
157 template <std::integral U>
+
158 requires(!std::is_const_v<T> && !std::is_same_v<I, U> &&
+
159 std::numeric_limits<U>::max() >= std::numeric_limits<I>::max())
+
160 operator matrix_ref<std::add_const_t<T>, U, TRef>() const noexcept {
+
161 return matrix_ref<std::add_const_t<T>, U, TRef>(index_, value_);
+
162 }
+
163
+
164 bool operator<(matrix_entry<T, I> other) const noexcept {
+
165 if (index()[0] < other.index()[0]) {
+
166 return true;
+
167 } else if (index()[0] == other.index()[0] &&
+
168 index()[1] < other.index()[1]) {
+
169 return true;
+
170 }
+
171 return false;
+
172 }
+
173
+
174 matrix_ref() = delete;
+
175 ~matrix_ref() = default;
+
176
+
177 matrix_ref(const matrix_ref &) = default;
+
178 matrix_ref &operator=(const matrix_ref &) = delete;
+
179 matrix_ref(matrix_ref &&) = default;
+
180 matrix_ref &operator=(matrix_ref &&) = default;
+
181
+
182private:
+
183 dr::index<I> index_;
+
184 scalar_reference value_;
+
185};
+
186
+
187} // namespace dr::shp
+
188
+
189namespace std {
+
190
+
191template <typename T, typename I, typename TRef>
+
192 requires(!std::is_const_v<T>)
+ + + +
196 a = b;
+
197 b = other;
+
198}
+
199
+
200template <std::size_t Index, typename T, typename I, typename TRef>
+
201struct tuple_element<Index, dr::shp::matrix_ref<T, I, TRef>>
+
202 : tuple_element<Index, std::tuple<dr::index<I>, TRef>> {};
+
203
+
204template <typename T, typename I, typename TRef>
+
205struct tuple_size<dr::shp::matrix_ref<T, I, TRef>>
+
206 : integral_constant<std::size_t, 2> {};
+
207
+
208template <std::size_t Index, typename T, typename I, typename TRef>
+
209inline decltype(auto) get(dr::shp::matrix_ref<T, I, TRef> ref)
+
210 requires(Index <= 1)
+
211{
+
212 if constexpr (Index == 0) {
+
213 return ref.index();
+
214 }
+
215 if constexpr (Index == 1) {
+
216 return ref.value();
+
217 }
+
218}
+
219
+
220template <std::size_t Index, typename T, typename I, typename TRef>
+
221inline decltype(auto) get(dr::shp::matrix_entry<T, I> entry)
+
222 requires(Index <= 1)
+
223{
+
224 if constexpr (Index == 0) {
+
225 return entry.index();
+
226 }
+
227 if constexpr (Index == 1) {
+
228 return entry.value();
+
229 }
+
230}
+
231
+
232} // namespace std
+
Definition: index.hpp:34
+
Definition: matrix_entry.hpp:15
+
Definition: matrix_entry.hpp:113
+
+ + + + diff --git a/doxygen/matrix__io_8hpp_source.html b/doxygen/matrix__io_8hpp_source.html new file mode 100644 index 0000000000..39e8cf41cf --- /dev/null +++ b/doxygen/matrix__io_8hpp_source.html @@ -0,0 +1,376 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/util/coo_matrix.hpp>
+
16#include <dr/shp/views/csr_matrix_view.hpp>
+
17
+
18namespace dr::shp {
+
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::shp::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::shp::csr_matrix_view<T, I> local_mat,
+
225 const matrix_partition &partition) {
+
226 dr::shp::sparse_matrix<T, I> a(local_mat.shape(), partition);
+
227
+
228 std::vector<dr::shp::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>(
+
283 file_path,
+
284 dr::shp::block_cyclic({dr::shp::tile::div, dr::shp::tile::div},
+
285 {dr::shp::nprocs(), 1}),
+
286 one_indexed);
+
287}
+
288
+
289} // namespace dr::shp
+
Definition: index.hpp:34
+
Definition: matrix_partition.hpp:34
+
Definition: csr_matrix_view.hpp:126
+
Definition: sparse_matrix.hpp:126
+
+ + + + diff --git a/doxygen/matrix__partition_8hpp_source.html b/doxygen/matrix__partition_8hpp_source.html new file mode 100644 index 0000000000..667a220ba0 --- /dev/null +++ b/doxygen/matrix__partition_8hpp_source.html @@ -0,0 +1,203 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/containers/detail.hpp>
+
9#include <dr/shp/init.hpp>
+
10
+
11namespace dr::shp {
+
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::shp::tile::div,
+
37 dr::shp::tile::div},
+
38 dr::index<> grid_shape = detail::factor(dr::shp::nprocs()))
+
39 : tile_shape_(tile_shape), grid_shape_(grid_shape) {}
+
40
+
41 block_cyclic(const block_cyclic &) noexcept = default;
+
42
+
43 dr::index<> tile_shape() const { return tile_shape_; }
+
44
+
45 std::size_t tile_rank(dr::index<> matrix_shape, dr::index<> tile_id) const {
+
46 dr::index<> pgrid_idx = {tile_id[0] % grid_shape_[0],
+
47 tile_id[1] % grid_shape_[1]};
+
48
+
49 auto pgrid = processor_grid_();
+
50
+
51 return pgrid[pgrid_idx[0] * grid_shape_[1] + pgrid_idx[1]];
+
52 }
+
53
+
54 dr::index<> grid_shape(dr::index<> matrix_shape) const {
+
55 auto ts = this->tile_shape(matrix_shape);
+
56
+
57 return dr::index<>((matrix_shape[0] + ts[0] - 1) / ts[0],
+
58 (matrix_shape[1] + ts[1] - 1) / ts[1]);
+
59 }
+
60
+
61 dr::index<> tile_shape(dr::index<> matrix_shape) const {
+
62 std::array<std::size_t, 2> tshape = {tile_shape_[0], tile_shape_[1]};
+
63
+
64 constexpr std::size_t ndims = 2;
+
65 for (std::size_t i = 0; i < ndims; i++) {
+
66 if (tshape[i] == dr::shp::tile::div) {
+
67 tshape[i] = (matrix_shape[i] + grid_shape_[i] - 1) / grid_shape_[i];
+
68 }
+
69 }
+
70
+
71 return tshape;
+
72 }
+
73
+
74 std::unique_ptr<matrix_partition> clone() const noexcept {
+
75 return std::unique_ptr<matrix_partition>(new block_cyclic(*this));
+
76 }
+
77
+
78private:
+
79 std::vector<std::size_t> processor_grid_() const {
+
80 std::vector<std::size_t> grid(grid_shape_[0] * grid_shape_[1]);
+
81
+
82 for (std::size_t i = 0; i < grid.size(); i++) {
+
83 grid[i] = i;
+
84 }
+
85 return grid;
+
86 }
+
87
+
88 dr::index<> tile_shape_;
+
89 dr::index<> grid_shape_;
+
90}; // namespace dr::shp
+
91
+
92inline std::vector<block_cyclic> partition_matmul(std::size_t m, std::size_t n,
+
93 std::size_t k) {
+
94 dr::index<> c_pgrid = detail::factor(shp::nprocs());
+
95
+
96 block_cyclic c_block({dr::shp::tile::div, dr::shp::tile::div},
+
97 {c_pgrid[0], c_pgrid[1]});
+
98
+
99 std::size_t k_block;
+
100
+
101 if (m * k >= k * n) {
+
102 k_block = (shp::nprocs() + c_pgrid[0] - 1) / c_pgrid[0];
+
103 } else {
+
104 k_block = (shp::nprocs() + c_pgrid[1] - 1) / c_pgrid[1];
+
105 }
+
106
+
107 block_cyclic a_block({dr::shp::tile::div, dr::shp::tile::div},
+
108 {c_pgrid[0], k_block});
+
109 block_cyclic b_block({dr::shp::tile::div, dr::shp::tile::div},
+
110 {k_block, c_pgrid[1]});
+
111
+
112 return {a_block, b_block, c_block};
+
113}
+
114
+
115} // namespace dr::shp
+
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..4a35804edc --- /dev/null +++ b/doxygen/md__for__each_8hpp_source.html @@ -0,0 +1,294 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/global.hpp>
+
18
+
19namespace dr::mhp::__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::mhp::__detail
+
38
+
39namespace dr::mhp {
+
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 (mhp::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 mhp::sycl_queue(),
+
83 sycl::range(mdspan0.extent(0), mdspan0.extent(1)), 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 (mhp::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, [index](auto mdspan) -> decltype(auto) {
+
146 return mdspan(index[0], index[1]);
+
147 });
+
148 static_assert(
+
149 std::invocable<F, decltype(references)> ||
+
150 std::invocable<F, decltype(index), decltype(references)>);
+
151 if constexpr (std::invocable<F, decltype(references)>) {
+
152 op(references);
+
153 } else {
+
154 auto global_index = index;
+
155 for (std::size_t i = 0; i < rng::size(global_index); i++) {
+
156 global_index[i] += origin[i];
+
157 }
+
158
+
159 op(global_index, references);
+
160 }
+
161 };
+
162
+
163 // TODO: Extend sycl_utils.hpp to handle ranges > 1D. It uses
+
164 // ndrange and handles > 32 bits.
+
165
+
166 dr::__detail::parallel_for(
+
167 mhp::sycl_queue(),
+
168 sycl::range(mdspan0.extent(0), mdspan0.extent(1)), invoke_index)
+
169 .wait();
+
170#else
+
171 assert(false);
+
172#endif
+
173 } else {
+
174 // invoke op on a tuple of references created by using the mdspan's and
+
175 // index
+
176 auto invoke_index = [=](auto index) {
+
177 // Transform operand_infos into references
+
178 auto references = detail::tie_transform(
+
179 operand_mdspans,
+
180 [index](auto mdspan) -> decltype(auto) { return mdspan(index); });
+
181 static_assert(
+
182 std::invocable<F, decltype(references)> ||
+
183 std::invocable<F, decltype(index), decltype(references)>);
+
184 if constexpr (std::invocable<F, decltype(references)>) {
+
185 op(references);
+
186 } else if constexpr (std::invocable<F, decltype(index),
+
187 decltype(references)>) {
+
188 auto global_index = index;
+
189 for (std::size_t i = 0; i < rng::size(global_index); i++) {
+
190 global_index[i] += origin[i];
+
191 }
+
192
+
193 op(global_index, references);
+
194 } else {
+
195 assert(false);
+
196 }
+
197 };
+
198 detail::mdspan_foreach<mdspan0.rank(), decltype(invoke_index)>(
+
199 mdspan0.extents(), invoke_index);
+
200 }
+
201 }
+
202 }
+
203
+
204 barrier();
+
205}
+
206
+
207} // namespace dr::mhp
+
Definition: md_for_each.hpp:28
+
Definition: md_for_each.hpp:33
+
Definition: mdspan_view.hpp:197
+
Definition: md_for_each.hpp:21
+
+ + + + diff --git a/doxygen/mdspan__shim_8hpp_source.html b/doxygen/mdspan__shim_8hpp_source.html new file mode 100644 index 0000000000..106f292f73 --- /dev/null +++ b/doxygen/mdspan__shim_8hpp_source.html @@ -0,0 +1,93 @@ + + + + + + + +Distributed Ranges: /home/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>
+
8namespace md = std::experimental;
+
+ + + + diff --git a/doxygen/mdspan__utils_8hpp_source.html b/doxygen/mdspan__utils_8hpp_source.html new file mode 100644 index 0000000000..468640a1de --- /dev/null +++ b/doxygen/mdspan__utils_8hpp_source.html @@ -0,0 +1,254 @@ + + + + + + + +Distributed Ranges: /home/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 <typename Index> auto shape_to_strides(const Index &shape) {
+
12 const std::size_t rank = rng::size(shape);
+
13 Index strides;
+
14 strides[rank - 1] = 1;
+
15 for (std::size_t i = 1; i < rank; i++) {
+
16 strides[rank - i - 1] = strides[rank - i] * shape[rank - i];
+
17 }
+
18 return strides;
+
19}
+
20
+
21template <typename Index>
+
22auto linear_to_index(std::size_t linear, const Index &shape) {
+
23 Index index, strides(shape_to_strides(shape));
+
24
+
25 for (std::size_t i = 0; i < rng::size(shape); i++) {
+
26 index[i] = linear / strides[i];
+
27 linear = linear % strides[i];
+
28 }
+
29
+
30 return index;
+
31}
+
32
+
33template <typename Mdspan>
+
34concept mdspan_like = requires(Mdspan &mdspan) {
+
35 mdspan.rank();
+
36 mdspan.extents();
+
37};
+
38
+
39template <std::size_t Rank> using dr_extents = std::array<std::size_t, Rank>;
+
40template <std::size_t Rank> using md_extents = md::dextents<std::size_t, Rank>;
+
41
+
42//
+
43// Mdspan accessor using an iterator
+
44//
+
45template <std::random_access_iterator Iter> class mdspan_iter_accessor {
+
46public:
+
47 using data_handle_type = Iter;
+
48 using reference = std::iter_reference_t<Iter>;
+ +
50
+
51 constexpr mdspan_iter_accessor() noexcept = default;
+
52 constexpr auto access(Iter iter, std::size_t index) const {
+
53 return iter[index];
+
54 }
+
55
+
56 constexpr auto offset(Iter iter, std::size_t index) const noexcept {
+
57 return iter + index;
+
58 }
+
59};
+
60
+
61template <typename M, std::size_t Rank, std::size_t... indexes>
+
62auto make_submdspan_impl(M mdspan, const dr_extents<Rank> &starts,
+
63 const dr_extents<Rank> &ends,
+
64 std::index_sequence<indexes...>) {
+
65 return md::submdspan(mdspan, std::tuple(starts[indexes], ends[indexes])...);
+
66}
+
67
+
68// Mdspan accepts slices, but that is hard to work with because it
+
69// requires parameter packs. Work with starts/size vectors internally
+
70// and use slices at the interface
+
71template <std::size_t Rank>
+
72auto make_submdspan(auto mdspan, const std::array<std::size_t, Rank> &starts,
+
73 const std::array<std::size_t, Rank> &ends) {
+
74 return make_submdspan_impl(mdspan, starts, ends,
+
75 std::make_index_sequence<Rank>{});
+
76}
+
77
+
78template <std::size_t Rank, typename Op>
+
79void mdspan_foreach(md_extents<Rank> extents, Op op,
+
80 dr_extents<Rank> index = dr_extents<Rank>(),
+
81 std::size_t rank = 0) {
+
82 for (index[rank] = 0; index[rank] < extents.extent(rank); index[rank]++) {
+
83 if (rank == Rank - 1) {
+
84 op(index);
+
85 } else {
+
86 mdspan_foreach(extents, op, index, rank + 1);
+
87 }
+
88 }
+
89}
+
90
+
91// Pack mdspan into contiguous container
+
92void mdspan_copy(mdspan_like auto src, std::forward_iterator auto dst) {
+
93 auto pack = [src, &dst](auto index) { *dst++ = src(index); };
+
94 mdspan_foreach<src.rank(), decltype(pack)>(src.extents(), pack);
+
95}
+
96
+
97// unpack contiguous container into mdspan
+
98void mdspan_copy(std::forward_iterator auto src, mdspan_like auto dst) {
+
99 auto unpack = [&src, dst](auto index) { dst(index) = *src++; };
+
100 mdspan_foreach<dst.rank(), decltype(unpack)>(dst.extents(), unpack);
+
101}
+
102
+
103// copy mdspan to mdspan
+
104void mdspan_copy(mdspan_like auto src, mdspan_like auto dst) {
+
105 assert(src.extents() == dst.extents());
+
106 auto copy = [src, dst](auto index) { dst(index) = src(index); };
+
107 mdspan_foreach<src.rank(), decltype(copy)>(src.extents(), copy);
+
108}
+
109
+
110// For operator(), rearrange indices according to template arguments.
+
111//
+
112// For mdtranspose<mdspan2d, 1, 0> a(b);
+
113//
+
114// a(3, 4) will do b(4, 3)
+
115//
+
116template <typename Mdspan, std::size_t... Is>
+
117class mdtranspose : public Mdspan {
+
118public:
+
119 // Inherit constructors from base class
+
120 mdtranspose(Mdspan &mdspan) : Mdspan(mdspan) {}
+
121
+
122 // rearrange indices according to template arguments
+
123 template <std::integral... Indexes>
+
124 auto &operator()(Indexes... indexes) const {
+
125 std::tuple index(indexes...);
+
126 return Mdspan::operator()(std::get<Is>(index)...);
+
127 }
+
128 auto &operator()(std::array<std::size_t, Mdspan::rank()> index) const {
+
129 return Mdspan::operator()(index[Is]...);
+
130 }
+
131
+
132 auto extents() const {
+
133 return md_extents<Mdspan::rank()>(Mdspan::extent(Is)...);
+
134 }
+
135 auto extent(std::size_t d) const { return extents().extent(d); }
+
136};
+
137
+
138} // namespace dr::__detail
+
139
+
140template <dr::__detail::mdspan_like Mdspan>
+
141struct fmt::formatter<Mdspan, char> : public formatter<string_view> {
+
142 template <typename FmtContext>
+
143 auto format(Mdspan mdspan, FmtContext &ctx) const {
+
144 std::array<std::size_t, mdspan.rank()> index;
+
145 rng::fill(index, 0);
+
146 format_mdspan(ctx, mdspan, index, 0);
+
147 return ctx.out();
+
148 }
+
149
+
150 void format_mdspan(auto &ctx, auto mdspan, auto &index,
+
151 std::size_t dim) const {
+
152 for (std::size_t i = 0; i < mdspan.extent(dim); i++) {
+
153 index[dim] = i;
+
154 if (dim == mdspan.rank() - 1) {
+
155 if (i == 0) {
+
156 format_to(ctx.out(), "{}: ", index);
+
157 }
+
158 format_to(ctx.out(), "{:4} ", mdspan(index));
+
159 } else {
+
160 format_mdspan(ctx, mdspan, index, dim + 1);
+
161 }
+
162 }
+
163 format_to(ctx.out(), "\n");
+
164 }
+
165};
+
Definition: mdspan_utils.hpp:45
+
Definition: mdspan_utils.hpp:117
+
Definition: index.hpp:34
+
Definition: mdspan_utils.hpp:34
+
+ + + + diff --git a/doxygen/mdspan__view_8hpp_source.html b/doxygen/mdspan__view_8hpp_source.html new file mode 100644 index 0000000000..c2571c263c --- /dev/null +++ b/doxygen/mdspan__view_8hpp_source.html @@ -0,0 +1,353 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/containers/distributed_vector.hpp>
+
12
+
13namespace dr::mhp::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::mhp::decomp
+
19
+
20namespace dr::mhp::__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
+
36 // view_interface uses below to define everything else
+
37 auto begin() const { return base_.begin(); }
+
38 auto end() const { return base_.end(); }
+
39
+
40 auto halo() const { return dr::mhp::halo(base_); }
+
41
+
42 // mdspan-specific methods
+
43 auto mdspan() const { return mdspan_; }
+
44 auto origin() const { return origin_; }
+
45 // for slices, this would be the underlying mdspan
+
46 auto root_mdspan() const { return mdspan(); }
+
47
+
48private:
+
49 using T = rng::range_value_t<BaseSegment>;
+
50
+
51 static auto local_tile(BaseSegment segment, const index_type &tile_shape) {
+
52 // Undefined behavior if the segments is not local
+
53 T *ptr = dr::ranges::rank(segment) == default_comm().rank()
+
54 ? std::to_address(dr::ranges::local(rng::begin(segment)))
+
55 : nullptr;
+
56 return md::mdspan(ptr, tile_shape);
+
57 }
+
58
+
59 BaseSegment base_;
+
60 index_type origin_;
+
61 md::mdspan<T, dr::__detail::md_extents<Rank>, md::layout_stride> mdspan_;
+
62};
+
63
+
64} // namespace dr::mhp::__detail
+
65
+
66namespace dr::mhp {
+
67
+
68//
+
69// Wrap a distributed range, adding an mdspan and adapting the
+
70// segments to also be mdspans for local access
+
71//
+
72template <distributed_contiguous_range R, std::size_t Rank,
+
73 typename Layout = md::layout_right>
+
74struct mdspan_view : public rng::view_interface<mdspan_view<R, Rank>> {
+
75private:
+
76 using base_type = rng::views::all_t<R>;
+
77 using iterator_type = rng::iterator_t<base_type>;
+
78 using extents_type = md::dextents<std::size_t, Rank>;
+
79 using mdspan_type =
+
80 md::mdspan<iterator_type, extents_type, Layout,
+ +
82 using difference_type = rng::iter_difference_t<iterator_type>;
+
83 using index_type = dr::__detail::dr_extents<Rank>;
+
84
+
85 base_type base_;
+
86 index_type full_shape_;
+
87 index_type tile_shape_;
+
88
+
89 static auto segment_index_to_global_origin(std::size_t linear,
+
90 index_type full_shape,
+
91 index_type tile_shape) {
+
92 index_type grid_shape;
+
93 for (std::size_t i = 0; i < Rank; i++) {
+
94 grid_shape[i] = dr::__detail::partition_up(full_shape[i], tile_shape[i]);
+
95 }
+
96 auto origin = dr::__detail::linear_to_index(linear, grid_shape);
+
97 for (std::size_t i = 0; i < Rank; i++) {
+
98 origin[i] *= tile_shape[i];
+
99 }
+
100
+
101 return origin;
+
102 }
+
103
+
104 static auto make_segments(auto base, auto full_shape, auto tile_shape) {
+
105 auto make_md = [=](auto v) {
+
106 auto clipped = tile_shape;
+
107 std::size_t segment_index = std::get<0>(v);
+
108 std::size_t end = (segment_index + 1) * tile_shape[0];
+
109 if (end > full_shape[0]) {
+
110 clipped[0] -= end - full_shape[0];
+
111 }
+ +
113 segment_index_to_global_origin(segment_index, full_shape, tile_shape),
+
114 std::get<1>(v), clipped);
+
115 };
+
116
+
117 // use bounded_enumerate so we get a std::ranges::common_range
+
118 return dr::__detail::bounded_enumerate(dr::ranges::segments(base)) |
+
119 rng::views::transform(make_md);
+
120 }
+
121 using segments_type = decltype(make_segments(std::declval<base_type>(),
+
122 full_shape_, tile_shape_));
+
123
+
124public:
+
125 mdspan_view(R r, dr::__detail::dr_extents<Rank> full_shape)
+
126 : base_(rng::views::all(std::forward<R>(r))) {
+
127 full_shape_ = full_shape;
+
128
+
129 // Default tile shape splits on leading dimension
+
130 tile_shape_ = full_shape;
+
131 tile_shape_[0] = decomp::div;
+
132
+
133 replace_decomp();
+
134 segments_ = make_segments(base_, full_shape_, tile_shape_);
+
135 }
+
136
+
137 mdspan_view(R r, dr::__detail::dr_extents<Rank> full_shape,
+
138 dr::__detail::dr_extents<Rank> tile_shape)
+
139 : base_(rng::views::all(std::forward<R>(r))), full_shape_(full_shape),
+
140 tile_shape_(tile_shape) {
+
141 replace_decomp();
+
142 segments_ = make_segments(base_, full_shape_, tile_shape_);
+
143 }
+
144
+
145 // Base implements random access range
+
146 auto begin() const { return base_.begin(); }
+
147 auto end() const { return base_.end(); }
+
148 auto operator[](difference_type n) { return base_[n]; }
+
149
+
150 // Add a local mdspan to the base segment
+
151 // Mdspan access to base
+
152 auto mdspan() const { return mdspan_type(rng::begin(base_), full_shape_); }
+
153 static constexpr auto rank() { return Rank; }
+
154
+
155 auto segments() const { return segments_; }
+
156
+
157 // Mdspan access to grid
+
158 auto grid() {
+
159 dr::__detail::dr_extents<Rank> grid_shape;
+
160 for (std::size_t i : rng::views::iota(0u, Rank)) {
+
161 grid_shape[i] =
+
162 dr::__detail::partition_up(full_shape_[i], tile_shape_[i]);
+
163 }
+
164 using grid_iterator_type = rng::iterator_t<segments_type>;
+
165 using grid_type =
+
166 md::mdspan<grid_iterator_type, extents_type, Layout,
+ +
168 return grid_type(rng::begin(segments_), grid_shape);
+
169 }
+
170
+
171private:
+
172 // Replace div with actual value
+
173 void replace_decomp() {
+
174 auto n = std::size_t(rng::size(dr::ranges::segments(base_)));
+
175 for (std::size_t i = 0; i < Rank; i++) {
+
176 if (tile_shape_[i] == decomp::div) {
+
177 tile_shape_[i] = dr::__detail::partition_up(full_shape_[i], n);
+
178 } else if (tile_shape_[i] == decomp::all) {
+
179 tile_shape_[i] = full_shape_[i];
+
180 }
+
181 }
+
182 }
+
183
+
184 segments_type segments_;
+
185};
+
186
+
187template <typename R, std::size_t Rank>
+
188mdspan_view(R &&r, dr::__detail::dr_extents<Rank> extents)
+ +
190
+
191template <typename R, std::size_t Rank>
+
192mdspan_view(R &&r, dr::__detail::dr_extents<Rank> full_shape,
+
193 dr::__detail::dr_extents<Rank> tile_shape)
+ +
195
+
196template <typename R>
+ +
198 dr::distributed_range<R> && requires(R &r) { r.mdspan(); };
+
199
+
200} // namespace dr::mhp
+
201
+
202namespace dr::mhp::views {
+
203
+
204template <std::size_t Rank> class mdspan_adapter_closure {
+
205public:
+
206 mdspan_adapter_closure(dr::__detail::dr_extents<Rank> full_shape,
+
207 dr::__detail::dr_extents<Rank> tile_shape)
+
208 : full_shape_(full_shape), tile_shape_(tile_shape), tile_valid_(true) {}
+
209
+
210 mdspan_adapter_closure(dr::__detail::dr_extents<Rank> full_shape)
+
211 : full_shape_(full_shape) {}
+
212
+
213 template <rng::viewable_range R> auto operator()(R &&r) const {
+
214 if (tile_valid_) {
+
215 return mdspan_view(std::forward<R>(r), full_shape_, tile_shape_);
+
216 } else {
+
217 return mdspan_view(std::forward<R>(r), full_shape_);
+
218 }
+
219 }
+
220
+
221 template <rng::viewable_range R>
+
222 friend auto operator|(R &&r, const mdspan_adapter_closure &closure) {
+
223 return closure(std::forward<R>(r));
+
224 }
+
225
+
226private:
+
227 dr::__detail::dr_extents<Rank> full_shape_;
+
228 dr::__detail::dr_extents<Rank> tile_shape_;
+
229 bool tile_valid_ = false;
+
230};
+
231
+ +
233public:
+
234 template <rng::viewable_range R, typename Shape>
+
235 auto operator()(R &&r, Shape &&full_shape, Shape &&tile_shape) const {
+
236 return mdspan_adapter_closure(std::forward<Shape>(full_shape),
+
237 std::forward<Shape>(tile_shape))(
+
238 std::forward<R>(r));
+
239 }
+
240
+
241 template <rng::viewable_range R, typename Shape>
+
242 auto operator()(R &&r, Shape &&full_shape) const {
+
243 return mdspan_adapter_closure(std::forward<Shape>(full_shape))(
+
244 std::forward<R>(r));
+
245 }
+
246
+
247 template <typename Shape>
+
248 auto operator()(Shape &&full_shape, Shape &&tile_shape) const {
+
249 return mdspan_adapter_closure(std::forward<Shape>(full_shape),
+
250 std::forward<Shape>(tile_shape));
+
251 }
+
252
+
253 template <typename Shape> auto operator()(Shape &&full_shape) const {
+
254 return mdspan_adapter_closure(std::forward<Shape>(full_shape));
+
255 }
+
256};
+
257
+
258inline constexpr auto mdspan = mdspan_fn_{};
+
259
+
260} // namespace dr::mhp::views
+
Definition: mdspan_utils.hpp:45
+
Definition: mdspan_view.hpp:26
+
Definition: mdspan_view.hpp:204
+
Definition: mdspan_view.hpp:232
+
Definition: concepts.hpp:42
+
Definition: concepts.hpp:20
+
Definition: mdspan_view.hpp:197
+
Definition: mdspan_view.hpp:74
+
+ + + + diff --git a/doxygen/memory_8hpp_source.html b/doxygen/memory_8hpp_source.html new file mode 100644 index 0000000000..e817b4da52 --- /dev/null +++ b/doxygen/memory_8hpp_source.html @@ -0,0 +1,190 @@ + + + + + + + +Distributed Ranges: /home/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/mhp_2algorithms_2copy_8hpp_source.html b/doxygen/mhp_2algorithms_2copy_8hpp_source.html new file mode 100644 index 0000000000..a1ed82f5d5 --- /dev/null +++ b/doxygen/mhp_2algorithms_2copy_8hpp_source.html @@ -0,0 +1,143 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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::mhp {
    +
    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
    +
    29void copy(std::size_t root, dr::distributed_contiguous_range auto &&in,
    +
    30 std::contiguous_iterator auto out) {
    +
    31 if (default_comm().rank() == root) {
    +
    32 for (const auto &segment : dr::ranges::segments(in)) {
    +
    33 auto sz = rng::size(segment);
    +
    34 rng::begin(segment).get(std::to_address(out), sz);
    +
    35 out += sz;
    +
    36 }
    +
    37 }
    +
    38 barrier();
    +
    39}
    +
    40
    +
    42void copy(std::size_t root, rng::contiguous_range auto &&in,
    + +
    44 if (default_comm().rank() == root) {
    +
    45 auto in_ptr = std::to_address(in.begin());
    +
    46 for (auto remainder = rng::size(in); remainder > 0;) {
    +
    47 auto segment = *(dr::ranges::segments(out).begin());
    +
    48 auto sz = std::min(rng::size(segment), remainder);
    +
    49 assert(sz > 0);
    +
    50 rng::begin(segment).put(in_ptr, sz);
    +
    51 in_ptr += sz;
    +
    52 out += sz;
    +
    53 remainder -= sz;
    +
    54 }
    +
    55 }
    +
    56 barrier();
    +
    57}
    +
    58
    +
    59} // namespace dr::mhp
    +
    Definition: concepts.hpp:51
    +
    Definition: concepts.hpp:42
    +
    Definition: concepts.hpp:31
    +
    + + + + diff --git a/doxygen/mhp_2algorithms_2exclusive__scan_8hpp_source.html b/doxygen/mhp_2algorithms_2exclusive__scan_8hpp_source.html new file mode 100644 index 0000000000..513095c163 --- /dev/null +++ b/doxygen/mhp_2algorithms_2exclusive__scan_8hpp_source.html @@ -0,0 +1,136 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/algorithms/inclusive_exclusive_scan_impl.hpp>
    +
    8
    +
    9namespace dr::mhp {
    +
    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), std::optional(init));
    +
    17}
    +
    18
    + + +
    21auto exclusive_scan(R &&r, O &&o, T init) {
    +
    22 return dr::mhp::exclusive_scan(std::forward<R>(r), std::forward<O>(o), init,
    +
    23 std::plus<rng::range_value_t<R>>());
    +
    24}
    +
    25
    +
    26// Distributed iterator versions
    +
    27
    +
    28template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter,
    +
    29 typename T, typename BinaryOp>
    +
    30OutputIter exclusive_scan(Iter first, Iter last, OutputIter d_first, T init,
    +
    31 BinaryOp &&binary_op) {
    +
    32
    +
    33 return dr::mhp::exclusive_scan(rng::subrange(first, last), d_first,
    +
    34 std::forward<BinaryOp>(binary_op), init);
    +
    35}
    +
    36
    +
    37template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter,
    +
    38 typename T>
    +
    39OutputIter exclusive_scan(Iter first, Iter last, OutputIter d_first, T init) {
    +
    40 auto dist = rng::distance(first, last);
    +
    41 auto d_last = d_first;
    +
    42 rng::advance(d_last, dist);
    +
    43 dr::mhp::exclusive_scan(rng::subrange(first, last),
    +
    44 rng::subrange(d_first, d_last), init);
    +
    45
    +
    46 return d_last;
    +
    47}
    +
    48
    +
    49} // namespace dr::mhp
    +
    Definition: concepts.hpp:42
    +
    Definition: concepts.hpp:31
    +
    + + + + diff --git a/doxygen/mhp_2algorithms_2fill_8hpp_source.html b/doxygen/mhp_2algorithms_2fill_8hpp_source.html new file mode 100644 index 0000000000..591903a28c --- /dev/null +++ b/doxygen/mhp_2algorithms_2fill_8hpp_source.html @@ -0,0 +1,117 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/global.hpp>
    +
    17
    +
    18namespace dr::mhp {
    +
    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 mhp::fill(rng::subrange(first, last), value);
    +
    30 return last;
    +
    31}
    +
    32
    +
    33} // namespace dr::mhp
    +
    Definition: concepts.hpp:42
    +
    + + + + diff --git a/doxygen/mhp_2algorithms_2for__each_8hpp_source.html b/doxygen/mhp_2algorithms_2for__each_8hpp_source.html new file mode 100644 index 0000000000..2708a5e9f4 --- /dev/null +++ b/doxygen/mhp_2algorithms_2for__each_8hpp_source.html @@ -0,0 +1,140 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/global.hpp>
    +
    18
    +
    19namespace dr::mhp {
    +
    20
    +
    22void for_each(dr::distributed_range auto &&dr, auto op) {
    +
    23 dr::drlog.debug("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 (mhp::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::mhp::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 mhp::for_each(rng::subrange(first, last), op);
    +
    54}
    +
    55
    +
    56} // namespace dr::mhp
    +
    Definition: concepts.hpp:20
    +
    + + + + diff --git a/doxygen/mhp_2algorithms_2inclusive__scan_8hpp_source.html b/doxygen/mhp_2algorithms_2inclusive__scan_8hpp_source.html new file mode 100644 index 0000000000..617bba9ba9 --- /dev/null +++ b/doxygen/mhp_2algorithms_2inclusive__scan_8hpp_source.html @@ -0,0 +1,158 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/algorithms/inclusive_exclusive_scan_impl.hpp>
    +
    8
    +
    9namespace dr::mhp {
    +
    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::mhp::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::mhp::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::mhp::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::mhp::inclusive_scan(rng::subrange(first, last),
    +
    66 rng::subrange(d_first, d_last));
    +
    67
    +
    68 return d_last;
    +
    69}
    +
    70
    +
    71} // namespace dr::mhp
    +
    Definition: concepts.hpp:42
    +
    Definition: concepts.hpp:31
    +
    + + + + diff --git a/doxygen/mhp_2algorithms_2iota_8hpp_source.html b/doxygen/mhp_2algorithms_2iota_8hpp_source.html new file mode 100644 index 0000000000..3ebca1bc5c --- /dev/null +++ b/doxygen/mhp_2algorithms_2iota_8hpp_source.html @@ -0,0 +1,120 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/global.hpp>
    +
    17
    +
    18namespace dr::mhp {
    +
    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::mhp
    +
    + + + + diff --git a/doxygen/mhp_2algorithms_2reduce_8hpp_source.html b/doxygen/mhp_2algorithms_2reduce_8hpp_source.html new file mode 100644 index 0000000000..7848503ac2 --- /dev/null +++ b/doxygen/mhp_2algorithms_2reduce_8hpp_source.html @@ -0,0 +1,292 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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::mhp::__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 (mhp::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 return binary_op(init, reduce(root, root_provided, dr, binary_op));
    +
    107}
    +
    108
    +
    109inline void
    +
    110#if defined(__GNUC__) && !defined(__clang__)
    +
    111 __attribute__((optimize(0)))
    +
    112#endif
    +
    113 no_optimize(auto x) {
    +
    114}
    +
    115
    +
    116}; // namespace dr::mhp::__detail
    +
    117
    +
    118namespace dr::mhp {
    +
    119
    +
    120//
    +
    121// Ranges
    +
    122//
    +
    123
    +
    124// range, init, and binary op, w/wo root
    +
    125
    +
    127template <typename T, dr::distributed_range DR>
    +
    128auto reduce(std::size_t root, DR &&dr, T init, auto &&binary_op) {
    +
    129 return __detail::reduce(root, true, std::forward<DR>(dr), init, binary_op);
    +
    130}
    +
    132template <typename T, dr::distributed_range DR>
    +
    133auto reduce(DR &&dr, T init, auto &&binary_op) {
    +
    134 return __detail::reduce(0, false, std::forward<DR>(dr), init, binary_op);
    +
    135}
    +
    136
    +
    137// range, init, w/wo root
    +
    138
    +
    140template <typename T, dr::distributed_range DR>
    +
    141auto reduce(std::size_t root, DR &&dr, T init) {
    +
    142 return __detail::reduce(root, true, std::forward<DR>(dr), init,
    +
    143 std::plus<>{});
    +
    144}
    +
    146template <typename T, dr::distributed_range DR> auto reduce(DR &&dr, T init) {
    +
    147 return __detail::reduce(0, false, std::forward<DR>(dr), init, std::plus<>{});
    +
    148}
    +
    149
    +
    150// range, w/wo root
    +
    151
    +
    153template <dr::distributed_range DR> auto reduce(std::size_t root, DR &&dr) {
    +
    154 return __detail::reduce(root, true, std::forward<DR>(dr), std::plus<>{});
    +
    155}
    +
    156
    +
    158template <dr::distributed_range DR> auto reduce(DR &&dr) {
    +
    159 auto x = __detail::reduce(0, false, std::forward<DR>(dr), std::plus<>{});
    +
    160
    +
    161 // The code below avoids an issue where DotProduct_ZipReduce_DR
    +
    162 // fails with gcc11. From debugging, I can see that the call to
    +
    163 // __detail::reduce above computes the correct value, but this
    +
    164 // function returns a bad value. My theory is that the problem is
    +
    165 // related to tail call optimization and the function below disables
    +
    166 // the optimization.
    +
    167 __detail::no_optimize(x);
    +
    168
    +
    169 return x;
    +
    170}
    +
    171
    +
    172//
    +
    173// Iterators
    +
    174//
    +
    175
    +
    176// range, init, and binary op, w/wo root
    +
    177
    +
    179template <typename T, dr::distributed_iterator DI>
    +
    180auto reduce(std::size_t root, DI first, DI last, T init, auto &&binary_op) {
    +
    181 return __detail::reduce(root, true, rng::subrange(first, last), init,
    +
    182 binary_op);
    +
    183}
    +
    185template <typename T, dr::distributed_iterator DI>
    +
    186auto reduce(DI first, DI last, T init, auto &&binary_op) {
    +
    187 return __detail::reduce(0, false, rng::subrange(first, last), init,
    +
    188 binary_op);
    +
    189}
    +
    190
    +
    191// range, init, w/wo root
    +
    192
    +
    194template <typename T, dr::distributed_iterator DI>
    +
    195auto reduce(std::size_t root, DI first, DI last, T init) {
    +
    196 return __detail::reduce(root, true, rng::subrange(first, last), init,
    +
    197 std::plus<>{});
    +
    198}
    +
    200template <typename T, dr::distributed_iterator DI>
    +
    201auto reduce(DI first, DI last, T init) {
    +
    202 return __detail::reduce(0, false, rng::subrange(first, last), init,
    +
    203 std::plus<>{});
    +
    204}
    +
    205
    +
    206// range, w/wo root
    +
    207
    +
    209template <dr::distributed_iterator DI>
    +
    210auto reduce(std::size_t root, DI first, DI last) {
    +
    211 return __detail::reduce(root, true, rng::subrange(first, last),
    +
    212 std::plus<>{});
    +
    213}
    +
    215template <dr::distributed_iterator DI> auto reduce(DI first, DI last) {
    +
    216 return __detail::reduce(0, false, rng::subrange(first, last), std::plus<>{});
    +
    217}
    +
    218
    +
    219} // namespace dr::mhp
    +
    Definition: onedpl_direct_iterator.hpp:15
    +
    + + + + diff --git a/doxygen/mhp_2algorithms_2sort_8hpp_source.html b/doxygen/mhp_2algorithms_2sort_8hpp_source.html new file mode 100644 index 0000000000..5478e4c302 --- /dev/null +++ b/doxygen/mhp_2algorithms_2sort_8hpp_source.html @@ -0,0 +1,396 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/shp/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/mhp/global.hpp>
    +
    24
    +
    25namespace dr::mhp {
    +
    26
    +
    27namespace __detail {
    +
    28
    +
    29template <rng::forward_range R, typename Compare>
    +
    30void local_sort(R &r, Compare &&comp) {
    +
    31 if (rng::size(r) >= 2) {
    +
    32 if (mhp::use_sycl()) {
    +
    33#ifdef SYCL_LANGUAGE_VERSION
    +
    34 auto policy = dpl_policy();
    +
    35 auto &&local_segment = dr::ranges::__detail::local(r);
    +
    36 drlog.debug("GPU dpl::sort(), size {}\n", rng::size(r));
    +
    37 oneapi::dpl::sort(
    +
    38 policy, dr::__detail::direct_iterator(rng::begin(local_segment)),
    +
    39 dr::__detail::direct_iterator(rng::end(local_segment)), comp);
    +
    40#else
    +
    41 assert(false);
    +
    42#endif
    +
    43 } else {
    +
    44 drlog.debug("cpu rng::sort, size {}\n", rng::size(r));
    +
    45 rng::sort(rng::begin(r), rng::end(r), comp);
    +
    46 }
    +
    47 }
    +
    48}
    +
    49
    +
    50// TODO: quite a long function, refactor to make the code more clear
    +
    51template <dr::distributed_range R, typename Compare>
    +
    52void dist_sort(R &r, Compare &&comp) {
    +
    53 using valT = typename R::value_type;
    +
    54
    +
    55 const std::size_t _comm_rank = default_comm().rank();
    +
    56 const std::size_t _comm_size = default_comm().size(); // dr-style ignore
    +
    57
    +
    58 auto &&lsegment = local_segment(r);
    +
    59 /* sort local segment */
    +
    60
    +
    61 __detail::local_sort(lsegment, comp);
    +
    62
    +
    63 std::vector<valT> vec_lmedians(_comm_size + 1);
    +
    64 std::vector<valT> vec_gmedians((_comm_size + 1) * _comm_size);
    +
    65
    +
    66 const double _step_m = static_cast<double>(rng::size(lsegment)) /
    +
    67 static_cast<double>(_comm_size);
    +
    68
    +
    69 /* calculate splitting values and indices - find n-1 dividers splitting each
    +
    70 * segment into equal parts */
    +
    71
    +
    72 for (std::size_t _i = 0; _i < rng::size(vec_lmedians); _i++) {
    +
    73 // vec_lmedians[_i] = lsegment[(_i + 1) * _step_m];
    +
    74 vec_lmedians[_i] = lsegment[_i * _step_m];
    +
    75 }
    +
    76 vec_lmedians.back() = lsegment.back();
    +
    77
    +
    78 default_comm().all_gather(vec_lmedians, vec_gmedians);
    +
    79
    +
    80 rng::sort(rng::begin(vec_gmedians), rng::end(vec_gmedians), comp);
    +
    81
    +
    82 /* find splitting values - medians of dividers */
    +
    83
    +
    84 std::vector<valT> vec_split_v(_comm_size - 1);
    +
    85
    +
    86 for (std::size_t _i = 0; _i < _comm_size - 1; _i++) {
    +
    87 vec_split_v[_i] = vec_gmedians[(_i + 1) * (_comm_size + 1) - 1];
    +
    88 }
    +
    89
    +
    90 /* calculate splitting indices (start of buffers) and sizes of buffers to send
    +
    91 */
    +
    92
    +
    93 std::vector<std::size_t> vec_split_i(_comm_size, 0);
    +
    94 std::vector<std::size_t> vec_split_s(_comm_size, 0);
    +
    95
    +
    96 std::size_t segidx = 0, vidx = 1;
    +
    97
    +
    98 while (vidx < _comm_size && segidx < rng::size(lsegment)) {
    +
    99 assert(segidx < rng::size(lsegment));
    +
    100 if (comp(vec_split_v[vidx - 1], *(lsegment.begin() + segidx))) {
    +
    101 vec_split_i[vidx] = segidx;
    +
    102 vec_split_s[vidx - 1] = vec_split_i[vidx] - vec_split_i[vidx - 1];
    +
    103 vidx++;
    +
    104 } else {
    +
    105 segidx++;
    +
    106 }
    +
    107 }
    +
    108 assert(rng::size(lsegment) > vec_split_i[vidx - 1]);
    +
    109 vec_split_s[vidx - 1] = rng::size(lsegment) - vec_split_i[vidx - 1];
    +
    110
    +
    111 /* send data size to each node */
    +
    112 std::vector<std::size_t> vec_rsizes(_comm_size, 0);
    +
    113 std::vector<std::size_t> vec_rindices(_comm_size, 0); // recv buffers
    +
    114
    +
    115 default_comm().alltoall(vec_split_s, vec_rsizes, 1);
    +
    116
    +
    117 std::exclusive_scan(vec_rsizes.begin(), vec_rsizes.end(),
    +
    118 vec_rindices.begin(), 0);
    +
    119
    +
    120 // const std::size_t _recv_elems =
    +
    121 // std::reduce(vec_rsizes.begin(), vec_rsizes.end());
    +
    122
    +
    123 const std::size_t _recv_elems = vec_rindices.back() + vec_rsizes.back();
    +
    124
    +
    125 /* send and receive data belonging to each node, then redistribute
    +
    126 * data to achieve size of data equal to size of local segment */
    +
    127
    +
    128 std::vector<std::size_t> vec_recv_elems(_comm_size);
    +
    129 MPI_Request req_recvelems;
    +
    130 MPI_Status stat_recvelemes;
    +
    131
    +
    132 default_comm().i_all_gather(_recv_elems, vec_recv_elems, &req_recvelems);
    +
    133
    +
    134#ifdef SYCL_LANGUAGE_VERSION
    +
    135 auto policy = dpl_policy();
    +
    136 sycl::usm_allocator<valT, sycl::usm::alloc::host> alloc(policy.queue());
    +
    137 std::vector<valT, decltype(alloc)> vec_recvdata(_recv_elems, alloc);
    +
    138#else
    +
    139 std::vector<valT> vec_recvdata(_recv_elems);
    +
    140#endif
    +
    141
    +
    142 default_comm().alltoallv(lsegment, vec_split_s, vec_split_i, vec_recvdata,
    +
    143 vec_rsizes, vec_rindices);
    +
    144
    +
    145 /* vec recvdata is partially sorted, implementation of merge on GPU is
    +
    146 * desirable */
    +
    147 __detail::local_sort(vec_recvdata, comp);
    +
    148
    +
    149 MPI_Wait(&req_recvelems, &stat_recvelemes);
    +
    150
    +
    151 const std::size_t _total_elems =
    +
    152 std::reduce(vec_recv_elems.begin(), vec_recv_elems.end());
    +
    153
    +
    154 assert(_total_elems == rng::size(r));
    +
    155
    +
    156 std::vector<int> vec_shift(_comm_size - 1);
    +
    157
    +
    158 const auto desired_elems_num = (_total_elems + _comm_size - 1) / _comm_size;
    +
    159
    +
    160 vec_shift[0] = desired_elems_num - vec_recv_elems[0];
    +
    161 for (std::size_t _i = 1; _i < _comm_size - 1; _i++) {
    +
    162 vec_shift[_i] = vec_shift[_i - 1] + desired_elems_num - vec_recv_elems[_i];
    +
    163 }
    +
    164
    +
    165 const int shift_left = _comm_rank == 0 ? 0 : -vec_shift[_comm_rank - 1];
    +
    166 const int shift_right =
    +
    167 _comm_rank == _comm_size - 1 ? 0 : vec_shift[_comm_rank];
    +
    168
    +
    169 MPI_Request req_l, req_r;
    +
    170 MPI_Status stat_l, stat_r;
    +
    171 const communicator::tag t = communicator::tag::halo_index;
    +
    172
    +
    173#ifdef SYCL_LANGUAGE_VERSION
    +
    174 std::vector<valT, decltype(alloc)> vec_left(std::max(shift_left, 0), alloc);
    +
    175 std::vector<valT, decltype(alloc)> vec_right(std::max(shift_right, 0), alloc);
    +
    176#else
    +
    177 std::vector<valT> vec_left(std::max(shift_left, 0));
    +
    178 std::vector<valT> vec_right(std::max(shift_right, 0));
    +
    179#endif
    +
    180
    +
    181 if (static_cast<int>(rng::size(vec_recvdata)) < -shift_left) {
    +
    182 // Too little data in recv buffer to shift left - first get from right, then
    +
    183 // send left
    +
    184 drlog.debug("Get from right first, recvdata size {} shl {}\n",
    +
    185 rng::size(vec_recvdata), -shift_left);
    +
    186 // ** This will never happen, because values eq to split go left **
    +
    187 assert(false);
    +
    188 } else if (static_cast<int>(rng::size(vec_recvdata)) < -shift_right) {
    +
    189 // Too little data in buffer to shift right - first get from left, then send
    +
    190 // right
    +
    191 assert(shift_left > 0);
    +
    192 default_comm().irecv(vec_left, _comm_rank - 1, t, &req_l);
    +
    193 MPI_Wait(&req_l, &stat_l);
    +
    194
    +
    195 vec_left.insert(vec_left.end(), vec_recvdata.begin(), vec_recvdata.end());
    +
    196 std::swap(vec_left, vec_recvdata);
    +
    197 vec_left.clear();
    +
    198
    +
    199 default_comm().isend((valT *)(vec_recvdata.data()) +
    +
    200 rng::size(vec_recvdata) + shift_right,
    +
    201 -shift_right, _comm_rank + 1, t, &req_r);
    +
    202 MPI_Wait(&req_r, &stat_r);
    +
    203 } else {
    +
    204 // enough data in recv buffer
    +
    205
    +
    206 if (shift_left < 0) {
    +
    207 default_comm().isend(vec_recvdata.data(), -shift_left, _comm_rank - 1, t,
    +
    208 &req_l);
    +
    209 } else if (shift_left > 0) {
    +
    210 default_comm().irecv(vec_left, _comm_rank - 1, t, &req_l);
    +
    211 }
    +
    212
    +
    213 if (shift_right > 0) {
    +
    214 default_comm().irecv(vec_right, _comm_rank + 1, t, &req_r);
    +
    215 } else if (shift_right < 0) {
    +
    216 default_comm().isend((valT *)(vec_recvdata.data()) +
    +
    217 rng::size(vec_recvdata) + shift_right,
    +
    218 -shift_right, _comm_rank + 1, t, &req_r);
    +
    219 }
    +
    220
    +
    221 if (shift_left != 0)
    +
    222 MPI_Wait(&req_l, &stat_l);
    +
    223 if (shift_right != 0)
    +
    224 MPI_Wait(&req_r, &stat_r);
    +
    225 }
    +
    226
    +
    227 const std::size_t invalidate_left = std::max(-shift_left, 0);
    +
    228 const std::size_t invalidate_right = std::max(-shift_right, 0);
    +
    229
    +
    230 const std::size_t size_l = rng::size(vec_left);
    +
    231 const std::size_t size_r = rng::size(vec_right);
    +
    232 const std::size_t size_d =
    +
    233 rng::size(vec_recvdata) - (invalidate_left + invalidate_right);
    +
    234
    +
    235 if (mhp::use_sycl()) {
    +
    236#ifdef SYCL_LANGUAGE_VERSION
    +
    237 sycl::event e_l, e_d, e_r;
    +
    238
    +
    239 if (size_l > 0)
    +
    240 e_l = sycl_queue().copy(vec_left.data(), lsegment.data(), size_l);
    +
    241 if (size_r > 0)
    +
    242 e_r = sycl_queue().copy(vec_right.data(),
    +
    243 lsegment.data() + size_l + size_d, size_r);
    +
    244 e_d = sycl_queue().copy(vec_recvdata.data() + invalidate_left,
    +
    245 lsegment.data() + size_l, size_d);
    +
    246
    +
    247 if (size_l > 0)
    +
    248 e_l.wait();
    +
    249 if (size_r > 0)
    +
    250 e_r.wait();
    +
    251 e_d.wait();
    +
    252
    +
    253#else
    +
    254 assert(false);
    +
    255#endif
    +
    256 } else {
    +
    257 if (size_l > 0)
    +
    258 std::memcpy(lsegment.data(), vec_left.data(), size_l * sizeof(valT));
    +
    259 if (size_r > 0)
    +
    260 std::memcpy(lsegment.data() + size_l + size_d, vec_right.data(),
    +
    261 size_r * sizeof(valT));
    +
    262
    +
    263 std::memcpy(lsegment.data() + size_l, vec_recvdata.data() + invalidate_left,
    +
    264 size_d * sizeof(valT));
    +
    265 }
    +
    266
    +
    267} // __detail::dist_sort
    +
    268
    +
    269} // namespace __detail
    +
    270
    +
    271template <dr::distributed_range R, typename Compare = std::less<>>
    +
    272void sort(R &r, Compare &&comp = Compare()) {
    +
    273
    +
    274 using valT = typename R::value_type;
    +
    275
    +
    276 std::size_t _comm_rank = default_comm().rank();
    +
    277 std::size_t _comm_size = default_comm().size(); // dr-style ignore
    +
    278
    +
    279 if (_comm_size == 1) {
    +
    280 drlog.debug("mhp::sort() - single node\n");
    +
    281 auto &&lsegment = local_segment(r);
    +
    282 __detail::local_sort(lsegment, comp);
    +
    283
    +
    284 } else if (rng::size(r) <= (_comm_size - 1) * (_comm_size - 1)) {
    +
    285 /* Distributed vector of size <= (comm_size-1) * (comm_size-1) may have
    +
    286 * 0-size local segments. It is also small enough to prefer sequential sort
    +
    287 */
    +
    288 drlog.debug("mhp::sort() - local sort\n");
    +
    289 std::vector<valT> vec_recvdata(rng::size(r));
    +
    290 dr::mhp::copy(0, r, rng::begin(vec_recvdata));
    +
    291
    +
    292 if (_comm_rank == 0) {
    +
    293 rng::sort(vec_recvdata, comp);
    +
    294 }
    +
    295 dr::mhp::barrier();
    +
    296 dr::mhp::copy(0, vec_recvdata, rng::begin(r));
    +
    297
    +
    298 } else {
    +
    299 drlog.debug("mhp::sort() - dist sort\n");
    +
    300 __detail::dist_sort(r, comp);
    +
    301 dr::mhp::barrier();
    +
    302 }
    +
    303}
    +
    304
    +
    305template <dr::distributed_iterator RandomIt, typename Compare = std::less<>>
    +
    306void sort(RandomIt first, RandomIt last, Compare comp = Compare()) {
    +
    307 sort(rng::subrange(first, last), comp);
    +
    308}
    +
    309
    +
    310} // namespace dr::mhp
    +
    Definition: onedpl_direct_iterator.hpp:15
    +
    + + + + diff --git a/doxygen/mhp_2algorithms_2transform_8hpp_source.html b/doxygen/mhp_2algorithms_2transform_8hpp_source.html new file mode 100644 index 0000000000..ab84b0bd13 --- /dev/null +++ b/doxygen/mhp_2algorithms_2transform_8hpp_source.html @@ -0,0 +1,127 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/global.hpp>
    +
    17
    +
    18namespace dr::mhp {
    +
    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 = mhp::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 mhp::transform(rng::subrange(first, last), out, op);
    +
    39}
    +
    40
    +
    41} // namespace dr::mhp
    +
    Definition: concepts.hpp:31
    +
    + + + + diff --git a/doxygen/mhp_2containers_2distributed__vector_8hpp_source.html b/doxygen/mhp_2containers_2distributed__vector_8hpp_source.html new file mode 100644 index 0000000000..76171cb068 --- /dev/null +++ b/doxygen/mhp_2containers_2distributed__vector_8hpp_source.html @@ -0,0 +1,292 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/algorithms/fill.hpp>
    +
    8#include <dr/mhp/containers/distribution.hpp>
    +
    9#include <dr/mhp/containers/segment.hpp>
    +
    10
    +
    11namespace dr::mhp {
    +
    12
    +
    14template <typename T> class distributed_vector {
    +
    15
    +
    16public:
    +
    17 using value_type = T;
    +
    18 using size_type = std::size_t;
    +
    19 using difference_type = std::ptrdiff_t;
    +
    20
    +
    21 class iterator {
    +
    22 public:
    +
    23 using iterator_category = std::random_access_iterator_tag;
    +
    24 using value_type = typename distributed_vector::value_type;
    +
    25 using difference_type = typename distributed_vector::difference_type;
    +
    26
    +
    27 iterator() {}
    +
    28 iterator(const distributed_vector *parent, difference_type offset)
    +
    29 : parent_(parent), offset_(offset) {}
    +
    30
    +
    31 auto operator+(difference_type n) const {
    +
    32 return iterator(parent_, offset_ + n);
    +
    33 }
    +
    34 friend auto operator+(difference_type n, const iterator &other) {
    +
    35 return other + n;
    +
    36 }
    +
    37 auto operator-(difference_type n) const {
    +
    38 return iterator(parent_, offset_ - n);
    +
    39 }
    +
    40 auto operator-(iterator other) const { return offset_ - other.offset_; }
    +
    41
    +
    42 auto &operator+=(difference_type n) {
    +
    43 offset_ += n;
    +
    44 return *this;
    +
    45 }
    +
    46 auto &operator-=(difference_type n) {
    +
    47 offset_ -= n;
    +
    48 return *this;
    +
    49 }
    +
    50 auto &operator++() {
    +
    51 offset_++;
    +
    52 return *this;
    +
    53 }
    +
    54 auto operator++(int) {
    +
    55 auto old = *this;
    +
    56 offset_++;
    +
    57 return old;
    +
    58 }
    +
    59 auto &operator--() {
    +
    60 offset_--;
    +
    61 return *this;
    +
    62 }
    +
    63 auto operator--(int) {
    +
    64 auto old = *this;
    +
    65 offset_--;
    +
    66 return old;
    +
    67 }
    +
    68
    +
    69 bool operator==(iterator other) const {
    +
    70 if (parent_ == nullptr || other.parent_ == nullptr) {
    +
    71 return false;
    +
    72 } else {
    +
    73 return offset_ == other.offset_;
    +
    74 }
    +
    75 }
    +
    76 auto operator<=>(iterator other) const {
    +
    77 assert(parent_ == other.parent_);
    +
    78 return offset_ <=> other.offset_;
    +
    79 }
    +
    80
    +
    81 auto operator*() const {
    +
    82 auto segment_size = parent_->segment_size_;
    +
    83 return parent_
    +
    84 ->segments()[offset_ / segment_size][offset_ % segment_size];
    +
    85 }
    +
    86 auto operator[](difference_type n) const { return *(*this + n); }
    +
    87
    +
    88 auto local() {
    +
    89 auto segment_size = parent_->segment_size_;
    +
    90 return (parent_->segments()[offset_ / segment_size].begin() +
    +
    91 offset_ % segment_size)
    +
    92 .local();
    +
    93 }
    +
    94
    +
    95 //
    +
    96 // Support for distributed ranges
    +
    97 //
    +
    98 // distributed iterator provides segments
    +
    99 // remote iterator provides local
    +
    100 //
    +
    101 auto segments() {
    +
    102 return dr::__detail::drop_segments(parent_->segments(), offset_);
    +
    103 }
    +
    104
    +
    105 private:
    +
    106 const distributed_vector *parent_ = nullptr;
    +
    107 difference_type offset_;
    +
    108 };
    +
    109
    +
    110 // Do not copy
    +
    111 // We need a move constructor for the implementation of reduce algorithm
    +
    112 distributed_vector(const distributed_vector &) = delete;
    +
    113 distributed_vector &operator=(const distributed_vector &) = delete;
    +
    114 distributed_vector(distributed_vector &&) { assert(false); }
    +
    115
    + +
    118 init(size, dist);
    +
    119 }
    +
    120
    +
    122 distributed_vector(std::size_t size, value_type fill_value,
    +
    123 distribution dist = distribution()) {
    +
    124 init(size, dist);
    +
    125 mhp::fill(*this, fill_value);
    +
    126 }
    +
    127
    + +
    129 if (!finalized()) {
    +
    130 fence();
    +
    131 active_wins().erase(win_.mpi_win());
    +
    132 win_.free();
    +
    133 __detail::allocator<T>().deallocate(data_, data_size_);
    +
    134 data_ = nullptr;
    +
    135 delete halo_;
    +
    136 }
    +
    137 }
    +
    138
    +
    140 auto begin() const { return iterator(this, 0); }
    +
    142 auto end() const { return begin() + size_; }
    +
    143
    +
    145 auto size() const { return size_; }
    +
    147 auto operator[](difference_type n) const { return *(begin() + n); }
    +
    148 auto &halo() const { return *halo_; }
    +
    149
    +
    150 auto segments() const { return rng::views::all(segments_); }
    +
    151
    +
    152private:
    +
    153 void init(auto size, auto dist) {
    +
    154 size_ = size;
    +
    155 distribution_ = dist;
    +
    156
    +
    157 // determine the distribution of data
    +
    158 auto comm_size = default_comm().size(); // dr-style ignore
    +
    159 auto hb = dist.halo();
    +
    160 std::size_t gran = dist.granularity();
    +
    161 // TODO: make this an error that is reported back to user
    +
    162 assert(size % gran == 0 && "size must be a multiple of the granularity");
    +
    163 assert(hb.prev % gran == 0 && "size must be a multiple of the granularity");
    +
    164 assert(hb.next % gran == 0 && "size must be a multiple of the granularity");
    +
    165 segment_size_ = gran * std::max({(size / gran + comm_size - 1) / comm_size,
    +
    166 hb.prev / gran, hb.next / gran});
    +
    167
    +
    168 data_size_ = segment_size_ + hb.prev + hb.next;
    +
    169 if (size_ > 0) {
    +
    170 data_ = __detail::allocator<T>().allocate(data_size_);
    +
    171 }
    +
    172
    +
    173 halo_ = new span_halo<T>(default_comm(), data_, data_size_, hb);
    +
    174
    +
    175 std::size_t segment_index = 0;
    +
    176 for (std::size_t i = 0; i < size; i += segment_size_) {
    +
    177 segments_.emplace_back(this, segment_index++,
    +
    178 std::min(segment_size_, size - i));
    +
    179 }
    +
    180
    +
    181 win_.create(default_comm(), data_, data_size_ * sizeof(T));
    +
    182 active_wins().insert(win_.mpi_win());
    +
    183 fence();
    +
    184 }
    +
    185
    +
    186 friend dv_segment_iterator<distributed_vector>;
    +
    187
    +
    188 std::size_t segment_size_ = 0;
    +
    189 std::size_t data_size_ = 0;
    +
    190 T *data_ = nullptr;
    +
    191 span_halo<T> *halo_;
    +
    192
    +
    193 distribution distribution_;
    +
    194 std::size_t size_;
    +
    195 std::vector<dv_segment<distributed_vector>> segments_;
    +
    196 dr::rma_window win_;
    +
    197};
    +
    198
    +
    199template <typename T> auto &halo(const distributed_vector<T> &dv) {
    +
    200 return dv.halo();
    +
    201}
    +
    202
    +
    203} // namespace dr::mhp
    +
    Definition: global.hpp:209
    +
    Definition: distributed_vector.hpp:21
    +
    distributed vector
    Definition: distributed_vector.hpp:14
    +
    distributed_vector(std::size_t size, value_type fill_value, distribution dist=distribution())
    Constructor.
    Definition: distributed_vector.hpp:122
    +
    distributed_vector(std::size_t size=0, distribution dist=distribution())
    Constructor.
    Definition: distributed_vector.hpp:117
    +
    auto end() const
    Returns iterator to end.
    Definition: distributed_vector.hpp:142
    +
    auto operator[](difference_type n) const
    Returns reference using index.
    Definition: distributed_vector.hpp:147
    +
    auto begin() const
    Returns iterator to beginning.
    Definition: distributed_vector.hpp:140
    +
    auto size() const
    Returns size.
    Definition: distributed_vector.hpp:145
    +
    Definition: communicator.hpp:185
    +
    Definition: distribution.hpp:11
    +
    + + + + diff --git a/doxygen/mhp_2views_2enumerate_8hpp_source.html b/doxygen/mhp_2views_2enumerate_8hpp_source.html new file mode 100644 index 0000000000..fef6e0b18d --- /dev/null +++ b/doxygen/mhp_2views_2enumerate_8hpp_source.html @@ -0,0 +1,144 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/views/zip.hpp>
    +
    8
    +
    9namespace dr::mhp {
    +
    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 mhp::views::zip(mhp::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::mhp
    +
    Definition: enumerate.hpp:27
    +
    Definition: enumerate.hpp:43
    +
    Definition: enumerate.hpp:15
    +
    + + + + diff --git a/doxygen/mhp_2views_2views_8hpp_source.html b/doxygen/mhp_2views_2views_8hpp_source.html new file mode 100644 index 0000000000..2f47aa26da --- /dev/null +++ b/doxygen/mhp_2views_2views_8hpp_source.html @@ -0,0 +1,173 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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::mhp {
    +
    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::mhp::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::mhp::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::mhp
    +
    78
    +
    79namespace dr::mhp::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::mhp::views
    +
    + + + + diff --git a/doxygen/mhp_8hpp_source.html b/doxygen/mhp_8hpp_source.html new file mode 100644 index 0000000000..2eb085a22f --- /dev/null +++ b/doxygen/mhp_8hpp_source.html @@ -0,0 +1,157 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    mhp.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#include <cassert>
    +
    14#include <concepts>
    +
    15#include <execution>
    +
    16#include <fstream>
    +
    17#include <iostream>
    +
    18#include <iterator>
    +
    19#include <memory>
    +
    20#include <optional>
    +
    21#include <set>
    +
    22#include <span>
    +
    23#include <string>
    +
    24#include <utility>
    +
    25#include <vector>
    +
    26
    +
    27#include <vendor/source_location/source_location.hpp>
    +
    28
    +
    29// MPI should be optional
    +
    30#include <mkl.h>
    +
    31#include <mpi.h>
    +
    32
    +
    33#include <dr/detail/format_shim.hpp>
    +
    34#include <dr/detail/ranges_shim.hpp>
    +
    35
    +
    36// clang-format off
    +
    37#include <dr/concepts/concepts.hpp>
    +
    38
    +
    39#include <dr/detail/logger.hpp>
    +
    40#include <dr/detail/view_detectors.hpp>
    +
    41#include <dr/detail/segments_tools.hpp>
    +
    42#include <dr/detail/iterator_adaptor.hpp>
    +
    43#include <dr/detail/normal_distributed_iterator.hpp>
    +
    44#include <dr/detail/memory.hpp>
    +
    45#include <dr/detail/communicator.hpp>
    +
    46#include <dr/detail/index.hpp>
    +
    47
    +
    48#include <dr/views/views.hpp>
    +
    49#include <dr/views/transform.hpp>
    +
    50
    +
    51#include <dr/mhp/halo.hpp>
    +
    52#include <dr/mhp/global.hpp>
    +
    53#include <dr/mhp/sycl_support.hpp>
    +
    54#include <dr/mhp/alignment.hpp>
    +
    55#include <dr/mhp/views/views.hpp>
    +
    56#include <dr/mhp/views/zip.hpp>
    +
    57#include <dr/mhp/views/enumerate.hpp>
    +
    58#include <dr/mhp/views/sliding.hpp>
    +
    59#include <dr/mhp/views/mdspan_view.hpp>
    +
    60#include <dr/mhp/views/submdspan_view.hpp>
    +
    61#include <dr/mhp/algorithms/copy.hpp>
    +
    62#include <dr/mhp/algorithms/fill.hpp>
    +
    63#include <dr/mhp/algorithms/for_each.hpp>
    +
    64#include <dr/mhp/algorithms/exclusive_scan.hpp>
    +
    65#include <dr/mhp/algorithms/inclusive_scan.hpp>
    +
    66#include <dr/mhp/algorithms/iota.hpp>
    +
    67#include <dr/mhp/algorithms/reduce.hpp>
    +
    68#include <dr/mhp/algorithms/sort.hpp>
    +
    69#include <dr/mhp/algorithms/md_for_each.hpp>
    +
    70#include <dr/mhp/algorithms/transform.hpp>
    +
    71#include <dr/mhp/containers/distributed_vector.hpp>
    +
    72#include <dr/mhp/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..b34836eb09 --- /dev/null +++ b/doxygen/normal__distributed__iterator_8hpp_source.html @@ -0,0 +1,210 @@ + + + + + + + +Distributed Ranges: /home/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..518c279f6a --- /dev/null +++ b/doxygen/onedpl__direct__iterator_8hpp_source.html @@ -0,0 +1,197 @@ + + + + + + + +Distributed Ranges: /home/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..b716e1bbd0 --- /dev/null +++ b/doxygen/owning__view_8hpp_source.html @@ -0,0 +1,155 @@ + + + + + + + +Distributed Ranges: /home/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..531c1cf8b8 --- /dev/null +++ b/doxygen/range_8hpp_source.html @@ -0,0 +1,241 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/distributed_span.hpp>
    +
    9
    +
    10namespace dr::shp {
    +
    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::shp::distributed_span(iota_segments);
    +
    146 } else {
    +
    147 return segment_range(0, rng::size(r), 0);
    +
    148 }
    +
    149}
    +
    150*/
    +
    151
    +
    152} // namespace dr::shp
    +
    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..dd516d54a6 --- /dev/null +++ b/doxygen/range__adaptors_8hpp_source.html @@ -0,0 +1,103 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/views/standard_views.hpp>
    +
    8#include <dr/shp/zip_view.hpp>
    +
    9
    +
    10namespace dr::shp {
    +
    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::shp::zip_view(i, r);
    +
    15}
    +
    16
    +
    17} // namespace dr::shp
    +
    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..6cea2793db --- /dev/null +++ b/doxygen/ranges_8hpp_source.html @@ -0,0 +1,360 @@ + + + + + + + +Distributed Ranges: /home/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..1d0cda1656 --- /dev/null +++ b/doxygen/ranges__shim_8hpp_source.html @@ -0,0 +1,112 @@ + + + + + + + +Distributed Ranges: /home/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..0e4449063b --- /dev/null +++ b/doxygen/ranges__utils_8hpp_source.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: /home/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..15da685237 --- /dev/null +++ b/doxygen/remote__subrange_8hpp_source.html @@ -0,0 +1,140 @@ + + + + + + + +Distributed Ranges: /home/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..61e4dfc0a1 --- /dev/null +++ b/doxygen/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['allocator_0',['allocator',['../classdr_1_1mhp_1_1____detail_1_1allocator.html',1,'dr::mhp::__detail']]], + ['any_1',['any',['../structdr_1_1mhp_1_1____detail_1_1any.html',1,'dr::mhp::__detail']]] +]; diff --git a/doxygen/search/all_1.js b/doxygen/search/all_1.js new file mode 100644 index 0000000000..40e97f37bc --- /dev/null +++ b/doxygen/search/all_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['begin_0',['begin',['../classdr_1_1mhp_1_1distributed__vector.html#ae4c0c9494f2c9ca131a565b648487acd',1,'dr::mhp::distributed_vector']]], + ['block_5fcyclic_1',['block_cyclic',['../classdr_1_1shp_1_1block__cyclic.html',1,'dr::shp']]], + ['buffered_5fallocator_2',['buffered_allocator',['../classdr_1_1shp_1_1buffered__allocator.html',1,'dr::shp']]] +]; diff --git a/doxygen/search/all_10.js b/doxygen/search/all_10.js new file mode 100644 index 0000000000..ae9aa4b147 --- /dev/null +++ b/doxygen/search/all_10.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['transform_5fadapter_5fclosure_0',['transform_adapter_closure',['../classdr_1_1views_1_1transform__adapter__closure.html',1,'dr::views']]], + ['transform_5ffn_5f_1',['transform_fn_',['../classdr_1_1views_1_1transform__fn__.html',1,'dr::views']]], + ['transform_5fiterator_2',['transform_iterator',['../classdr_1_1transform__iterator.html',1,'dr']]], + ['transform_5fview_3',['transform_view',['../classdr_1_1transform__view.html',1,'dr']]], + ['tuple_5felement_3c_20index_2c_20dr_3a_3aindex_3c_20i_20_3e_20_3e_4',['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_3ashp_3a_3amatrix_5fentry_3c_20t_2c_20i_20_3e_20_3e_5',['tuple_element< Index, dr::shp::matrix_entry< T, I > >',['../structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html',1,'std']]], + ['tuple_5felement_3c_20index_2c_20dr_3a_3ashp_3a_3amatrix_5fref_3c_20t_2c_20i_2c_20tref_20_3e_20_3e_6',['tuple_element< Index, dr::shp::matrix_ref< T, I, TRef > >',['../structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html',1,'std']]], + ['tuple_5for_5fpair_7',['tuple_or_pair',['../structdr_1_1shp_1_1____detail_1_1tuple__or__pair.html',1,'dr::shp::__detail']]], + ['tuple_5for_5fpair_3c_20t_2c_20u_20_3e_8',['tuple_or_pair< T, U >',['../structdr_1_1shp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4.html',1,'dr::shp::__detail']]], + ['tuple_5fsize_3c_20dr_3a_3aindex_3c_20i_20_3e_20_3e_9',['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_3ashp_3a_3amatrix_5fentry_3c_20t_2c_20i_20_3e_20_3e_10',['tuple_size< dr::shp::matrix_entry< T, I > >',['../structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html',1,'std']]], + ['tuple_5fsize_3c_20dr_3a_3ashp_3a_3amatrix_5fref_3c_20t_2c_20i_2c_20tref_20_3e_20_3e_11',['tuple_size< dr::shp::matrix_ref< T, I, TRef > >',['../structstd_1_1tuple__size_3_01dr_1_1shp_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..9551074350 --- /dev/null +++ b/doxygen/search/all_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['unstructured_5fhalo_0',['unstructured_halo',['../classdr_1_1mhp_1_1unstructured__halo.html',1,'dr::mhp::unstructured_halo< T, Memory >'],['../classdr_1_1mhp_1_1unstructured__halo.html#adb0adc8fd9c1756560507fa412728afb',1,'dr::mhp::unstructured_halo::unstructured_halo()']]] +]; diff --git a/doxygen/search/all_12.js b/doxygen/search/all_12.js new file mode 100644 index 0000000000..fbc152963c --- /dev/null +++ b/doxygen/search/all_12.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['vector_0',['vector',['../classdr_1_1shp_1_1vector.html',1,'dr::shp']]], + ['vector_3c_20t_2c_20allocator_20_3e_1',['vector< T, Allocator >',['../classdr_1_1shp_1_1vector.html',1,'dr::shp']]] +]; diff --git a/doxygen/search/all_13.js b/doxygen/search/all_13.js new file mode 100644 index 0000000000..e7a0a2c706 --- /dev/null +++ b/doxygen/search/all_13.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['zip_5faccessor_0',['zip_accessor',['../classdr_1_1shp_1_1zip__accessor.html',1,'dr::shp']]], + ['zip_5fiterator_1',['zip_iterator',['../classdr_1_1mhp_1_1zip__iterator.html',1,'dr::mhp']]], + ['zip_5fview_2',['zip_view',['../classdr_1_1mhp_1_1zip__view.html',1,'dr::mhp::zip_view< Rs >'],['../classdr_1_1shp_1_1zip__view.html',1,'dr::shp::zip_view< Rs >']]] +]; diff --git a/doxygen/search/all_2.js b/doxygen/search/all_2.js new file mode 100644 index 0000000000..f827747306 --- /dev/null +++ b/doxygen/search/all_2.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['communicator_0',['communicator',['../classdr_1_1communicator.html',1,'dr']]], + ['coo_5fmatrix_1',['coo_matrix',['../classdr_1_1shp_1_1____detail_1_1coo__matrix.html',1,'dr::shp::__detail']]], + ['csr_5fmatrix_5fview_2',['csr_matrix_view',['../classdr_1_1shp_1_1csr__matrix__view.html',1,'dr::shp']]], + ['csr_5fmatrix_5fview_5faccessor_3',['csr_matrix_view_accessor',['../classdr_1_1shp_1_1csr__matrix__view__accessor.html',1,'dr::shp']]] +]; diff --git a/doxygen/search/all_3.js b/doxygen/search/all_3.js new file mode 100644 index 0000000000..e5137bb6b6 --- /dev/null +++ b/doxygen/search/all_3.js @@ -0,0 +1,64 @@ +var searchData= +[ + ['default_5fmemory_0',['default_memory',['../structdr_1_1default__memory.html',1,'dr']]], + ['dense_5fmatrix_1',['dense_matrix',['../classdr_1_1shp_1_1dense__matrix.html',1,'dr::shp']]], + ['dense_5fmatrix_5faccessor_2',['dense_matrix_accessor',['../classdr_1_1shp_1_1dense__matrix__accessor.html',1,'dr::shp']]], + ['dense_5fmatrix_5fcolumn_5faccessor_3',['dense_matrix_column_accessor',['../classdr_1_1shp_1_1dense__matrix__column__accessor.html',1,'dr::shp']]], + ['dense_5fmatrix_5fcolumn_5fview_4',['dense_matrix_column_view',['../classdr_1_1shp_1_1dense__matrix__column__view.html',1,'dr::shp']]], + ['dense_5fmatrix_5frow_5faccessor_5',['dense_matrix_row_accessor',['../classdr_1_1shp_1_1dense__matrix__row__accessor.html',1,'dr::shp']]], + ['dense_5fmatrix_5frow_5fview_6',['dense_matrix_row_view',['../classdr_1_1shp_1_1dense__matrix__row__view.html',1,'dr::shp']]], + ['dense_5fmatrix_5fview_7',['dense_matrix_view',['../classdr_1_1shp_1_1dense__matrix__view.html',1,'dr::shp']]], + ['device_5fallocator_8',['device_allocator',['../classdr_1_1shp_1_1device__allocator.html',1,'dr::shp']]], + ['device_5fpolicy_9',['device_policy',['../structdr_1_1mhp_1_1device__policy.html',1,'dr::mhp::device_policy'],['../structdr_1_1shp_1_1device__policy.html',1,'dr::shp::device_policy']]], + ['device_5fptr_10',['device_ptr',['../classdr_1_1shp_1_1device__ptr.html',1,'dr::shp']]], + ['device_5fref_11',['device_ref',['../classdr_1_1shp_1_1device__ref.html',1,'dr::shp']]], + ['device_5fspan_12',['device_span',['../classdr_1_1shp_1_1device__span.html',1,'dr::shp']]], + ['device_5fvector_13',['device_vector',['../classdr_1_1shp_1_1device__vector.html',1,'dr::shp']]], + ['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_1shp_1_1distributed__dense__matrix.html',1,'dr::shp']]], + ['distributed_5fdense_5fmatrix_5faccessor_18',['distributed_dense_matrix_accessor',['../classdr_1_1shp_1_1distributed__dense__matrix__accessor.html',1,'dr::shp']]], + ['distributed_5fiterator_19',['distributed_iterator',['../conceptdr_1_1distributed__iterator.html',1,'dr']]], + ['distributed_5fmdarray_20',['distributed_mdarray',['../classdr_1_1mhp_1_1distributed__mdarray.html',1,'dr::mhp']]], + ['distributed_5frange_21',['distributed_range',['../conceptdr_1_1distributed__range.html',1,'dr']]], + ['distributed_5frange_5faccessor_22',['distributed_range_accessor',['../classdr_1_1shp_1_1distributed__range__accessor.html',1,'dr::shp']]], + ['distributed_5fspan_23',['distributed_span',['../classdr_1_1shp_1_1distributed__span.html',1,'dr::shp']]], + ['distributed_5fspan_5faccessor_24',['distributed_span_accessor',['../classdr_1_1shp_1_1distributed__span__accessor.html',1,'dr::shp']]], + ['distributed_5fvector_25',['distributed_vector',['../classdr_1_1mhp_1_1distributed__vector.html#a0448f3a05db40993aad220bcf927f8fd',1,'dr::mhp::distributed_vector::distributed_vector(std::size_t size, value_type fill_value, distribution dist=distribution())'],['../classdr_1_1mhp_1_1distributed__vector.html#a1e6c268244a4a124aa6cf3ef802d133d',1,'dr::mhp::distributed_vector::distributed_vector(std::size_t size=0, distribution dist=distribution())'],['../classdr_1_1mhp_1_1distributed__vector.html',1,'dr::mhp::distributed_vector< T >'],['../structdr_1_1shp_1_1distributed__vector.html',1,'dr::shp::distributed_vector< T, Allocator >']]], + ['distributed_5fvector_5faccessor_26',['distributed_vector_accessor',['../classdr_1_1shp_1_1distributed__vector__accessor.html',1,'dr::shp']]], + ['distribution_27',['distribution',['../structdr_1_1mhp_1_1distribution.html',1,'dr::mhp']]], + ['duplicated_5fvector_28',['duplicated_vector',['../classdr_1_1shp_1_1duplicated__vector.html',1,'dr::shp']]], + ['dv_5fsegment_29',['dv_segment',['../classdr_1_1mhp_1_1dv__segment.html',1,'dr::mhp']]], + ['dv_5fsegment_5fiterator_30',['dv_segment_iterator',['../classdr_1_1mhp_1_1dv__segment__iterator.html',1,'dr::mhp']]], + ['dv_5fsegment_5freference_31',['dv_segment_reference',['../classdr_1_1mhp_1_1dv__segment__reference.html',1,'dr::mhp']]], + ['has_5fhalo_5fmethod_32',['has_halo_method',['../conceptdr_1_1mhp_1_1has__halo__method.html',1,'dr::mhp']]], + ['has_5flocal_33',['has_local',['../conceptdr_1_1ranges_1_1____detail_1_1has__local.html',1,'dr::ranges::__detail']]], + ['has_5flocal_5fadl_34',['has_local_adl',['../conceptdr_1_1ranges_1_1_0d13_1_1has__local__adl.html',1,'dr::ranges::@13']]], + ['has_5frank_5fadl_35',['has_rank_adl',['../conceptdr_1_1ranges_1_1_0d13_1_1has__rank__adl.html',1,'dr::ranges::@13']]], + ['has_5frank_5fmethod_36',['has_rank_method',['../conceptdr_1_1ranges_1_1_0d13_1_1has__rank__method.html',1,'dr::ranges::@13']]], + ['has_5fsegments_37',['has_segments',['../conceptdr_1_1mhp_1_1has__segments.html',1,'dr::mhp']]], + ['has_5fsegments_5fadl_38',['has_segments_adl',['../conceptdr_1_1ranges_1_1_0d13_1_1has__segments__adl.html',1,'dr::ranges::@13']]], + ['has_5fsegments_5fmethod_39',['has_segments_method',['../conceptdr_1_1_0d5_1_1has__segments__method.html',1,'dr::@5'],['../conceptdr_1_1ranges_1_1_0d13_1_1has__segments__method.html',1,'dr::ranges::@13']]], + ['is_5fdistributed_40',['is_distributed',['../conceptdr_1_1mhp_1_1____detail_1_1is__distributed.html',1,'dr::mhp::__detail']]], + ['is_5flocalizable_41',['is_localizable',['../conceptdr_1_1ranges_1_1_0d13_1_1is__localizable.html',1,'dr::ranges::@13']]], + ['is_5fmdspan_5fview_42',['is_mdspan_view',['../conceptdr_1_1mhp_1_1is__mdspan__view.html',1,'dr::mhp']]], + ['is_5fremote_5fiterator_5fshadow_5fimpl_5f_43',['is_remote_iterator_shadow_impl_',['../conceptdr_1_1ranges_1_1_0d13_1_1is__remote__iterator__shadow__impl__.html',1,'dr::ranges::@13']]], + ['is_5fsyclmemcopyable_44',['is_syclmemcopyable',['../conceptdr_1_1shp_1_1____detail_1_1is__syclmemcopyable.html',1,'dr::shp::__detail']]], + ['iter_5fhas_5flocal_5fmethod_45',['iter_has_local_method',['../conceptdr_1_1ranges_1_1_0d13_1_1iter__has__local__method.html',1,'dr::ranges::@13']]], + ['mdspan_5flike_46',['mdspan_like',['../conceptdr_1_1____detail_1_1mdspan__like.html',1,'dr::__detail']]], + ['no_5fsegments_47',['no_segments',['../conceptdr_1_1mhp_1_1no__segments.html',1,'dr::mhp']]], + ['one_5fargument_48',['one_argument',['../conceptdr_1_1mhp_1_1____detail_1_1one__argument.html',1,'dr::mhp::__detail']]], + ['remote_5fcontiguous_5fiterator_49',['remote_contiguous_iterator',['../conceptdr_1_1remote__contiguous__iterator.html',1,'dr']]], + ['remote_5fcontiguous_5frange_50',['remote_contiguous_range',['../conceptdr_1_1remote__contiguous__range.html',1,'dr']]], + ['remote_5fiterator_51',['remote_iterator',['../conceptdr_1_1remote__iterator.html',1,'dr']]], + ['remote_5frange_52',['remote_range',['../conceptdr_1_1remote__range.html',1,'dr']]], + ['remote_5frange_5fshadow_5fimpl_5f_53',['remote_range_shadow_impl_',['../conceptdr_1_1ranges_1_1_0d13_1_1remote__range__shadow__impl__.html',1,'dr::ranges::@13']]], + ['segment_5fhas_5flocal_5fmethod_54',['segment_has_local_method',['../conceptdr_1_1ranges_1_1_0d13_1_1segment__has__local__method.html',1,'dr::ranges::@13']]], + ['segments_5frange_55',['segments_range',['../conceptdr_1_1ranges_1_1_0d13_1_1segments__range.html',1,'dr::ranges::@13']]], + ['sycl_5fdevice_5fselector_56',['sycl_device_selector',['../conceptdr_1_1shp_1_1____detail_1_1sycl__device__selector.html',1,'dr::shp::__detail']]], + ['tupleelementgettable_57',['TupleElementGettable',['../conceptdr_1_1_0d4_1_1TupleElementGettable.html',1,'dr::@4']]], + ['tuplelike_58',['TupleLike',['../conceptdr_1_1TupleLike.html',1,'dr']]], + ['two_5farguments_59',['two_arguments',['../conceptdr_1_1mhp_1_1____detail_1_1two__arguments.html',1,'dr::mhp::__detail']]], + ['zipable_60',['zipable',['../conceptdr_1_1mhp_1_1____detail_1_1zipable.html',1,'dr::mhp::__detail']]] +]; diff --git a/doxygen/search/all_4.js b/doxygen/search/all_4.js new file mode 100644 index 0000000000..56bfd2aa5e --- /dev/null +++ b/doxygen/search/all_4.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['end_0',['end',['../classdr_1_1mhp_1_1distributed__vector.html#a7e2d8f42e59d01e1d6aaf2eadab9a0d7',1,'dr::mhp::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_1mhp_1_1views_1_1enumerate__adapter__closure.html',1,'dr::mhp::views::enumerate_adapter_closure'],['../classdr_1_1shp_1_1views_1_1enumerate__adapter__closure.html',1,'dr::shp::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_1mhp_1_1views_1_1enumerate__fn__.html',1,'dr::mhp::views::enumerate_fn_'],['../classdr_1_1shp_1_1views_1_1enumerate__fn__.html',1,'dr::shp::views::enumerate_fn_']]], + ['exchange_5fbegin_3',['exchange_begin',['../classdr_1_1mhp_1_1halo__impl.html#ab73e60acdad319f144e563483124fc6a',1,'dr::mhp::halo_impl']]], + ['exchange_5ffinalize_4',['exchange_finalize',['../classdr_1_1mhp_1_1halo__impl.html#aa0d81cc8ddbc683c8e340e917109b377',1,'dr::mhp::halo_impl']]] +]; diff --git a/doxygen/search/all_5.js b/doxygen/search/all_5.js new file mode 100644 index 0000000000..1e2126f038 --- /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_1shp_1_1future.html',1,'dr::shp']]] +]; diff --git a/doxygen/search/all_6.js b/doxygen/search/all_6.js new file mode 100644 index 0000000000..39094ac572 --- /dev/null +++ b/doxygen/search/all_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['global_5fcontext_0',['global_context',['../structdr_1_1mhp_1_1____detail_1_1global__context.html',1,'dr::mhp::__detail']]] +]; diff --git a/doxygen/search/all_7.js b/doxygen/search/all_7.js new file mode 100644 index 0000000000..a3e09f3201 --- /dev/null +++ b/doxygen/search/all_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['halo_5fbounds_0',['halo_bounds',['../structdr_1_1mhp_1_1halo__bounds.html',1,'dr::mhp']]], + ['halo_5fimpl_1',['halo_impl',['../classdr_1_1mhp_1_1halo__impl.html',1,'dr::mhp::halo_impl< Group >'],['../classdr_1_1mhp_1_1halo__impl.html#a45130d039c491be7692515acc3bde318',1,'dr::mhp::halo_impl::halo_impl()']]] +]; diff --git a/doxygen/search/all_8.js b/doxygen/search/all_8.js new file mode 100644 index 0000000000..7fea36e12d --- /dev/null +++ b/doxygen/search/all_8.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['id_0',['id',['../classdr_1_1shp_1_1id.html',1,'dr::shp']]], + ['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_1mhp_1_1index__group.html',1,'dr::mhp::index_group< T, Memory >'],['../classdr_1_1mhp_1_1index__group.html#a14d654b8226699b589b82cca7e2f9649',1,'dr::mhp::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_1mhp_1_1distributed__vector_1_1iterator.html',1,'dr::mhp::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..745d780a5e --- /dev/null +++ b/doxygen/search/all_a.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['matrix_5fentry_0',['matrix_entry',['../classdr_1_1shp_1_1matrix__entry.html',1,'dr::shp']]], + ['matrix_5fpartition_1',['matrix_partition',['../classdr_1_1shp_1_1matrix__partition.html',1,'dr::shp']]], + ['matrix_5fref_2',['matrix_ref',['../classdr_1_1shp_1_1matrix__ref.html',1,'dr::shp']]], + ['max_5fop_3',['max_op',['../structdr_1_1mhp_1_1halo__impl_1_1max__op.html',1,'dr::mhp::halo_impl']]], + ['md_5fsegment_4',['md_segment',['../classdr_1_1mhp_1_1____detail_1_1md__segment.html',1,'dr::mhp::__detail']]], + ['mdspan_5fadapter_5fclosure_5',['mdspan_adapter_closure',['../classdr_1_1mhp_1_1views_1_1mdspan__adapter__closure.html',1,'dr::mhp::views']]], + ['mdspan_5ffn_5f_6',['mdspan_fn_',['../classdr_1_1mhp_1_1views_1_1mdspan__fn__.html',1,'dr::mhp::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_1mhp_1_1mdspan__view.html',1,'dr::mhp']]], + ['mdsub_5fsegment_9',['mdsub_segment',['../classdr_1_1mhp_1_1____detail_1_1mdsub__segment.html',1,'dr::mhp::__detail']]], + ['mdtranspose_10',['mdtranspose',['../classdr_1_1____detail_1_1mdtranspose.html',1,'dr::__detail']]], + ['min_5fop_11',['min_op',['../structdr_1_1mhp_1_1halo__impl_1_1min__op.html',1,'dr::mhp::halo_impl']]], + ['multiplies_5fop_12',['multiplies_op',['../structdr_1_1mhp_1_1halo__impl_1_1multiplies__op.html',1,'dr::mhp::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..0c36f9fa8d --- /dev/null +++ b/doxygen/search/all_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['operator_5b_5d_0',['operator[]',['../classdr_1_1mhp_1_1distributed__vector.html#ac5dd02baad90df8fe28391952e799da5',1,'dr::mhp::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..5677cae064 --- /dev/null +++ b/doxygen/search/all_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['plus_5fop_0',['plus_op',['../structdr_1_1mhp_1_1halo__impl_1_1plus__op.html',1,'dr::mhp::halo_impl']]] +]; diff --git a/doxygen/search/all_e.js b/doxygen/search/all_e.js new file mode 100644 index 0000000000..bb58d5df51 --- /dev/null +++ b/doxygen/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['range_5fsize_0',['range_size',['../structdr_1_1mhp_1_1views_1_1____detail_1_1range__size.html',1,'dr::mhp::views::__detail']]], + ['range_5fsize_3c_20r_20_3e_1',['range_size< R >',['../structdr_1_1mhp_1_1views_1_1____detail_1_1range__size_3_01R_01_4.html',1,'dr::mhp::views::__detail']]], + ['rebind_2',['rebind',['../structdr_1_1shp_1_1device__allocator_1_1rebind.html',1,'dr::shp::device_allocator']]], + ['reduce_5fbegin_3',['reduce_begin',['../classdr_1_1mhp_1_1halo__impl.html#a78da1fc3ca0448705ea7690e6c0e8ecf',1,'dr::mhp::halo_impl']]], + ['reduce_5ffinalize_4',['reduce_finalize',['../classdr_1_1mhp_1_1halo__impl.html#abcf6841717acb246fcea716eb1af02b0',1,'dr::mhp::halo_impl::reduce_finalize(const auto &op)'],['../classdr_1_1mhp_1_1halo__impl.html#af756ff4409842704121c9d81ec1a9974',1,'dr::mhp::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..deae4beec3 --- /dev/null +++ b/doxygen/search/all_f.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['second_5fop_0',['second_op',['../structdr_1_1mhp_1_1halo__impl_1_1second__op.html',1,'dr::mhp::halo_impl']]], + ['segment_5frange_1',['segment_range',['../classdr_1_1shp_1_1segment__range.html',1,'dr::shp']]], + ['segment_5frange_5faccessor_2',['segment_range_accessor',['../classdr_1_1shp_1_1segment__range__accessor.html',1,'dr::shp']]], + ['segmented_5fview_3',['segmented_view',['../classdr_1_1mhp_1_1segmented__view.html',1,'dr::mhp']]], + ['segmented_5fview_5fiterator_4',['segmented_view_iterator',['../classdr_1_1mhp_1_1segmented__view__iterator.html',1,'dr::mhp']]], + ['size_5',['size',['../classdr_1_1mhp_1_1distributed__vector.html#aeaee61dead6a4e70f7eb2543ce3e8b15',1,'dr::mhp::distributed_vector']]], + ['slice_5fadaptor_5fclosure_6',['slice_adaptor_closure',['../classdr_1_1shp_1_1views_1_1slice__adaptor__closure.html',1,'dr::shp::views']]], + ['sliding_5ffn_7',['sliding_fn',['../structdr_1_1mhp_1_1views_1_1____detail_1_1sliding__fn.html',1,'dr::mhp::views::__detail']]], + ['source_5flocation_8',['source_location',['../structnostd_1_1source__location.html',1,'nostd']]], + ['span_9',['span',['../classdr_1_1shp_1_1span.html',1,'dr::shp']]], + ['span_3c_20t_2c_20t_20_2a_20_3e_10',['span< T, T * >',['../classdr_1_1shp_1_1span.html',1,'dr::shp']]], + ['span_5fgroup_11',['span_group',['../classdr_1_1mhp_1_1span__group.html',1,'dr::mhp']]], + ['span_5fhalo_12',['span_halo',['../classdr_1_1mhp_1_1span__halo.html',1,'dr::mhp']]], + ['sparse_5fmatrix_13',['sparse_matrix',['../classdr_1_1shp_1_1sparse__matrix.html',1,'dr::shp']]], + ['submdspan_5fadapter_5fclosure_14',['submdspan_adapter_closure',['../classdr_1_1mhp_1_1views_1_1submdspan__adapter__closure.html',1,'dr::mhp::views']]], + ['submdspan_5ffn_5f_15',['submdspan_fn_',['../classdr_1_1mhp_1_1views_1_1submdspan__fn__.html',1,'dr::mhp::views']]], + ['submdspan_5fview_16',['submdspan_view',['../structdr_1_1mhp_1_1submdspan__view.html',1,'dr::mhp']]], + ['subrange_17',['subrange',['../classdr_1_1mhp_1_1subrange.html',1,'dr::mhp']]], + ['subrange_5fiterator_18',['subrange_iterator',['../classdr_1_1mhp_1_1subrange__iterator.html',1,'dr::mhp']]] +]; diff --git a/doxygen/search/classes_0.js b/doxygen/search/classes_0.js new file mode 100644 index 0000000000..61e4dfc0a1 --- /dev/null +++ b/doxygen/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['allocator_0',['allocator',['../classdr_1_1mhp_1_1____detail_1_1allocator.html',1,'dr::mhp::__detail']]], + ['any_1',['any',['../structdr_1_1mhp_1_1____detail_1_1any.html',1,'dr::mhp::__detail']]] +]; diff --git a/doxygen/search/classes_1.js b/doxygen/search/classes_1.js new file mode 100644 index 0000000000..142a1fc680 --- /dev/null +++ b/doxygen/search/classes_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['block_5fcyclic_0',['block_cyclic',['../classdr_1_1shp_1_1block__cyclic.html',1,'dr::shp']]], + ['buffered_5fallocator_1',['buffered_allocator',['../classdr_1_1shp_1_1buffered__allocator.html',1,'dr::shp']]] +]; diff --git a/doxygen/search/classes_10.js b/doxygen/search/classes_10.js new file mode 100644 index 0000000000..ae9aa4b147 --- /dev/null +++ b/doxygen/search/classes_10.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['transform_5fadapter_5fclosure_0',['transform_adapter_closure',['../classdr_1_1views_1_1transform__adapter__closure.html',1,'dr::views']]], + ['transform_5ffn_5f_1',['transform_fn_',['../classdr_1_1views_1_1transform__fn__.html',1,'dr::views']]], + ['transform_5fiterator_2',['transform_iterator',['../classdr_1_1transform__iterator.html',1,'dr']]], + ['transform_5fview_3',['transform_view',['../classdr_1_1transform__view.html',1,'dr']]], + ['tuple_5felement_3c_20index_2c_20dr_3a_3aindex_3c_20i_20_3e_20_3e_4',['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_3ashp_3a_3amatrix_5fentry_3c_20t_2c_20i_20_3e_20_3e_5',['tuple_element< Index, dr::shp::matrix_entry< T, I > >',['../structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html',1,'std']]], + ['tuple_5felement_3c_20index_2c_20dr_3a_3ashp_3a_3amatrix_5fref_3c_20t_2c_20i_2c_20tref_20_3e_20_3e_6',['tuple_element< Index, dr::shp::matrix_ref< T, I, TRef > >',['../structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html',1,'std']]], + ['tuple_5for_5fpair_7',['tuple_or_pair',['../structdr_1_1shp_1_1____detail_1_1tuple__or__pair.html',1,'dr::shp::__detail']]], + ['tuple_5for_5fpair_3c_20t_2c_20u_20_3e_8',['tuple_or_pair< T, U >',['../structdr_1_1shp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4.html',1,'dr::shp::__detail']]], + ['tuple_5fsize_3c_20dr_3a_3aindex_3c_20i_20_3e_20_3e_9',['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_3ashp_3a_3amatrix_5fentry_3c_20t_2c_20i_20_3e_20_3e_10',['tuple_size< dr::shp::matrix_entry< T, I > >',['../structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html',1,'std']]], + ['tuple_5fsize_3c_20dr_3a_3ashp_3a_3amatrix_5fref_3c_20t_2c_20i_2c_20tref_20_3e_20_3e_11',['tuple_size< dr::shp::matrix_ref< T, I, TRef > >',['../structstd_1_1tuple__size_3_01dr_1_1shp_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..10e9007061 --- /dev/null +++ b/doxygen/search/classes_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['unstructured_5fhalo_0',['unstructured_halo',['../classdr_1_1mhp_1_1unstructured__halo.html',1,'dr::mhp']]] +]; diff --git a/doxygen/search/classes_12.js b/doxygen/search/classes_12.js new file mode 100644 index 0000000000..fbc152963c --- /dev/null +++ b/doxygen/search/classes_12.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['vector_0',['vector',['../classdr_1_1shp_1_1vector.html',1,'dr::shp']]], + ['vector_3c_20t_2c_20allocator_20_3e_1',['vector< T, Allocator >',['../classdr_1_1shp_1_1vector.html',1,'dr::shp']]] +]; diff --git a/doxygen/search/classes_13.js b/doxygen/search/classes_13.js new file mode 100644 index 0000000000..e7a0a2c706 --- /dev/null +++ b/doxygen/search/classes_13.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['zip_5faccessor_0',['zip_accessor',['../classdr_1_1shp_1_1zip__accessor.html',1,'dr::shp']]], + ['zip_5fiterator_1',['zip_iterator',['../classdr_1_1mhp_1_1zip__iterator.html',1,'dr::mhp']]], + ['zip_5fview_2',['zip_view',['../classdr_1_1mhp_1_1zip__view.html',1,'dr::mhp::zip_view< Rs >'],['../classdr_1_1shp_1_1zip__view.html',1,'dr::shp::zip_view< Rs >']]] +]; diff --git a/doxygen/search/classes_2.js b/doxygen/search/classes_2.js new file mode 100644 index 0000000000..f827747306 --- /dev/null +++ b/doxygen/search/classes_2.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['communicator_0',['communicator',['../classdr_1_1communicator.html',1,'dr']]], + ['coo_5fmatrix_1',['coo_matrix',['../classdr_1_1shp_1_1____detail_1_1coo__matrix.html',1,'dr::shp::__detail']]], + ['csr_5fmatrix_5fview_2',['csr_matrix_view',['../classdr_1_1shp_1_1csr__matrix__view.html',1,'dr::shp']]], + ['csr_5fmatrix_5fview_5faccessor_3',['csr_matrix_view_accessor',['../classdr_1_1shp_1_1csr__matrix__view__accessor.html',1,'dr::shp']]] +]; diff --git a/doxygen/search/classes_3.js b/doxygen/search/classes_3.js new file mode 100644 index 0000000000..bcf9826438 --- /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_1shp_1_1dense__matrix.html',1,'dr::shp']]], + ['dense_5fmatrix_5faccessor_2',['dense_matrix_accessor',['../classdr_1_1shp_1_1dense__matrix__accessor.html',1,'dr::shp']]], + ['dense_5fmatrix_5fcolumn_5faccessor_3',['dense_matrix_column_accessor',['../classdr_1_1shp_1_1dense__matrix__column__accessor.html',1,'dr::shp']]], + ['dense_5fmatrix_5fcolumn_5fview_4',['dense_matrix_column_view',['../classdr_1_1shp_1_1dense__matrix__column__view.html',1,'dr::shp']]], + ['dense_5fmatrix_5frow_5faccessor_5',['dense_matrix_row_accessor',['../classdr_1_1shp_1_1dense__matrix__row__accessor.html',1,'dr::shp']]], + ['dense_5fmatrix_5frow_5fview_6',['dense_matrix_row_view',['../classdr_1_1shp_1_1dense__matrix__row__view.html',1,'dr::shp']]], + ['dense_5fmatrix_5fview_7',['dense_matrix_view',['../classdr_1_1shp_1_1dense__matrix__view.html',1,'dr::shp']]], + ['device_5fallocator_8',['device_allocator',['../classdr_1_1shp_1_1device__allocator.html',1,'dr::shp']]], + ['device_5fpolicy_9',['device_policy',['../structdr_1_1mhp_1_1device__policy.html',1,'dr::mhp::device_policy'],['../structdr_1_1shp_1_1device__policy.html',1,'dr::shp::device_policy']]], + ['device_5fptr_10',['device_ptr',['../classdr_1_1shp_1_1device__ptr.html',1,'dr::shp']]], + ['device_5fref_11',['device_ref',['../classdr_1_1shp_1_1device__ref.html',1,'dr::shp']]], + ['device_5fspan_12',['device_span',['../classdr_1_1shp_1_1device__span.html',1,'dr::shp']]], + ['device_5fvector_13',['device_vector',['../classdr_1_1shp_1_1device__vector.html',1,'dr::shp']]], + ['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_1shp_1_1distributed__dense__matrix.html',1,'dr::shp']]], + ['distributed_5fdense_5fmatrix_5faccessor_16',['distributed_dense_matrix_accessor',['../classdr_1_1shp_1_1distributed__dense__matrix__accessor.html',1,'dr::shp']]], + ['distributed_5fmdarray_17',['distributed_mdarray',['../classdr_1_1mhp_1_1distributed__mdarray.html',1,'dr::mhp']]], + ['distributed_5frange_5faccessor_18',['distributed_range_accessor',['../classdr_1_1shp_1_1distributed__range__accessor.html',1,'dr::shp']]], + ['distributed_5fspan_19',['distributed_span',['../classdr_1_1shp_1_1distributed__span.html',1,'dr::shp']]], + ['distributed_5fspan_5faccessor_20',['distributed_span_accessor',['../classdr_1_1shp_1_1distributed__span__accessor.html',1,'dr::shp']]], + ['distributed_5fvector_21',['distributed_vector',['../classdr_1_1mhp_1_1distributed__vector.html',1,'dr::mhp::distributed_vector< T >'],['../structdr_1_1shp_1_1distributed__vector.html',1,'dr::shp::distributed_vector< T, Allocator >']]], + ['distributed_5fvector_5faccessor_22',['distributed_vector_accessor',['../classdr_1_1shp_1_1distributed__vector__accessor.html',1,'dr::shp']]], + ['distribution_23',['distribution',['../structdr_1_1mhp_1_1distribution.html',1,'dr::mhp']]], + ['duplicated_5fvector_24',['duplicated_vector',['../classdr_1_1shp_1_1duplicated__vector.html',1,'dr::shp']]], + ['dv_5fsegment_25',['dv_segment',['../classdr_1_1mhp_1_1dv__segment.html',1,'dr::mhp']]], + ['dv_5fsegment_5fiterator_26',['dv_segment_iterator',['../classdr_1_1mhp_1_1dv__segment__iterator.html',1,'dr::mhp']]], + ['dv_5fsegment_5freference_27',['dv_segment_reference',['../classdr_1_1mhp_1_1dv__segment__reference.html',1,'dr::mhp']]] +]; diff --git a/doxygen/search/classes_4.js b/doxygen/search/classes_4.js new file mode 100644 index 0000000000..64186f5977 --- /dev/null +++ b/doxygen/search/classes_4.js @@ -0,0 +1,5 @@ +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_1mhp_1_1views_1_1enumerate__adapter__closure.html',1,'dr::mhp::views::enumerate_adapter_closure'],['../classdr_1_1shp_1_1views_1_1enumerate__adapter__closure.html',1,'dr::shp::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_1mhp_1_1views_1_1enumerate__fn__.html',1,'dr::mhp::views::enumerate_fn_'],['../classdr_1_1shp_1_1views_1_1enumerate__fn__.html',1,'dr::shp::views::enumerate_fn_']]] +]; diff --git a/doxygen/search/classes_5.js b/doxygen/search/classes_5.js new file mode 100644 index 0000000000..1e2126f038 --- /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_1shp_1_1future.html',1,'dr::shp']]] +]; diff --git a/doxygen/search/classes_6.js b/doxygen/search/classes_6.js new file mode 100644 index 0000000000..39094ac572 --- /dev/null +++ b/doxygen/search/classes_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['global_5fcontext_0',['global_context',['../structdr_1_1mhp_1_1____detail_1_1global__context.html',1,'dr::mhp::__detail']]] +]; diff --git a/doxygen/search/classes_7.js b/doxygen/search/classes_7.js new file mode 100644 index 0000000000..bfde681720 --- /dev/null +++ b/doxygen/search/classes_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['halo_5fbounds_0',['halo_bounds',['../structdr_1_1mhp_1_1halo__bounds.html',1,'dr::mhp']]], + ['halo_5fimpl_1',['halo_impl',['../classdr_1_1mhp_1_1halo__impl.html',1,'dr::mhp']]] +]; diff --git a/doxygen/search/classes_8.js b/doxygen/search/classes_8.js new file mode 100644 index 0000000000..a1acb38eb8 --- /dev/null +++ b/doxygen/search/classes_8.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['id_0',['id',['../classdr_1_1shp_1_1id.html',1,'dr::shp']]], + ['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_1mhp_1_1index__group.html',1,'dr::mhp']]], + ['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_1mhp_1_1distributed__vector_1_1iterator.html',1,'dr::mhp::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..745d780a5e --- /dev/null +++ b/doxygen/search/classes_a.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['matrix_5fentry_0',['matrix_entry',['../classdr_1_1shp_1_1matrix__entry.html',1,'dr::shp']]], + ['matrix_5fpartition_1',['matrix_partition',['../classdr_1_1shp_1_1matrix__partition.html',1,'dr::shp']]], + ['matrix_5fref_2',['matrix_ref',['../classdr_1_1shp_1_1matrix__ref.html',1,'dr::shp']]], + ['max_5fop_3',['max_op',['../structdr_1_1mhp_1_1halo__impl_1_1max__op.html',1,'dr::mhp::halo_impl']]], + ['md_5fsegment_4',['md_segment',['../classdr_1_1mhp_1_1____detail_1_1md__segment.html',1,'dr::mhp::__detail']]], + ['mdspan_5fadapter_5fclosure_5',['mdspan_adapter_closure',['../classdr_1_1mhp_1_1views_1_1mdspan__adapter__closure.html',1,'dr::mhp::views']]], + ['mdspan_5ffn_5f_6',['mdspan_fn_',['../classdr_1_1mhp_1_1views_1_1mdspan__fn__.html',1,'dr::mhp::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_1mhp_1_1mdspan__view.html',1,'dr::mhp']]], + ['mdsub_5fsegment_9',['mdsub_segment',['../classdr_1_1mhp_1_1____detail_1_1mdsub__segment.html',1,'dr::mhp::__detail']]], + ['mdtranspose_10',['mdtranspose',['../classdr_1_1____detail_1_1mdtranspose.html',1,'dr::__detail']]], + ['min_5fop_11',['min_op',['../structdr_1_1mhp_1_1halo__impl_1_1min__op.html',1,'dr::mhp::halo_impl']]], + ['multiplies_5fop_12',['multiplies_op',['../structdr_1_1mhp_1_1halo__impl_1_1multiplies__op.html',1,'dr::mhp::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..5677cae064 --- /dev/null +++ b/doxygen/search/classes_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['plus_5fop_0',['plus_op',['../structdr_1_1mhp_1_1halo__impl_1_1plus__op.html',1,'dr::mhp::halo_impl']]] +]; diff --git a/doxygen/search/classes_e.js b/doxygen/search/classes_e.js new file mode 100644 index 0000000000..e7bf191b71 --- /dev/null +++ b/doxygen/search/classes_e.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['range_5fsize_0',['range_size',['../structdr_1_1mhp_1_1views_1_1____detail_1_1range__size.html',1,'dr::mhp::views::__detail']]], + ['range_5fsize_3c_20r_20_3e_1',['range_size< R >',['../structdr_1_1mhp_1_1views_1_1____detail_1_1range__size_3_01R_01_4.html',1,'dr::mhp::views::__detail']]], + ['rebind_2',['rebind',['../structdr_1_1shp_1_1device__allocator_1_1rebind.html',1,'dr::shp::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..06575f12dc --- /dev/null +++ b/doxygen/search/classes_f.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['second_5fop_0',['second_op',['../structdr_1_1mhp_1_1halo__impl_1_1second__op.html',1,'dr::mhp::halo_impl']]], + ['segment_5frange_1',['segment_range',['../classdr_1_1shp_1_1segment__range.html',1,'dr::shp']]], + ['segment_5frange_5faccessor_2',['segment_range_accessor',['../classdr_1_1shp_1_1segment__range__accessor.html',1,'dr::shp']]], + ['segmented_5fview_3',['segmented_view',['../classdr_1_1mhp_1_1segmented__view.html',1,'dr::mhp']]], + ['segmented_5fview_5fiterator_4',['segmented_view_iterator',['../classdr_1_1mhp_1_1segmented__view__iterator.html',1,'dr::mhp']]], + ['slice_5fadaptor_5fclosure_5',['slice_adaptor_closure',['../classdr_1_1shp_1_1views_1_1slice__adaptor__closure.html',1,'dr::shp::views']]], + ['sliding_5ffn_6',['sliding_fn',['../structdr_1_1mhp_1_1views_1_1____detail_1_1sliding__fn.html',1,'dr::mhp::views::__detail']]], + ['source_5flocation_7',['source_location',['../structnostd_1_1source__location.html',1,'nostd']]], + ['span_8',['span',['../classdr_1_1shp_1_1span.html',1,'dr::shp']]], + ['span_3c_20t_2c_20t_20_2a_20_3e_9',['span< T, T * >',['../classdr_1_1shp_1_1span.html',1,'dr::shp']]], + ['span_5fgroup_10',['span_group',['../classdr_1_1mhp_1_1span__group.html',1,'dr::mhp']]], + ['span_5fhalo_11',['span_halo',['../classdr_1_1mhp_1_1span__halo.html',1,'dr::mhp']]], + ['sparse_5fmatrix_12',['sparse_matrix',['../classdr_1_1shp_1_1sparse__matrix.html',1,'dr::shp']]], + ['submdspan_5fadapter_5fclosure_13',['submdspan_adapter_closure',['../classdr_1_1mhp_1_1views_1_1submdspan__adapter__closure.html',1,'dr::mhp::views']]], + ['submdspan_5ffn_5f_14',['submdspan_fn_',['../classdr_1_1mhp_1_1views_1_1submdspan__fn__.html',1,'dr::mhp::views']]], + ['submdspan_5fview_15',['submdspan_view',['../structdr_1_1mhp_1_1submdspan__view.html',1,'dr::mhp']]], + ['subrange_16',['subrange',['../classdr_1_1mhp_1_1subrange.html',1,'dr::mhp']]], + ['subrange_5fiterator_17',['subrange_iterator',['../classdr_1_1mhp_1_1subrange__iterator.html',1,'dr::mhp']]] +]; 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..346842d304 --- /dev/null +++ b/doxygen/search/concepts_0.js @@ -0,0 +1,36 @@ +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_5frange_3',['distributed_range',['../conceptdr_1_1distributed__range.html',1,'dr']]], + ['has_5fhalo_5fmethod_4',['has_halo_method',['../conceptdr_1_1mhp_1_1has__halo__method.html',1,'dr::mhp']]], + ['has_5flocal_5',['has_local',['../conceptdr_1_1ranges_1_1____detail_1_1has__local.html',1,'dr::ranges::__detail']]], + ['has_5flocal_5fadl_6',['has_local_adl',['../conceptdr_1_1ranges_1_1_0d13_1_1has__local__adl.html',1,'dr::ranges::@13']]], + ['has_5frank_5fadl_7',['has_rank_adl',['../conceptdr_1_1ranges_1_1_0d13_1_1has__rank__adl.html',1,'dr::ranges::@13']]], + ['has_5frank_5fmethod_8',['has_rank_method',['../conceptdr_1_1ranges_1_1_0d13_1_1has__rank__method.html',1,'dr::ranges::@13']]], + ['has_5fsegments_9',['has_segments',['../conceptdr_1_1mhp_1_1has__segments.html',1,'dr::mhp']]], + ['has_5fsegments_5fadl_10',['has_segments_adl',['../conceptdr_1_1ranges_1_1_0d13_1_1has__segments__adl.html',1,'dr::ranges::@13']]], + ['has_5fsegments_5fmethod_11',['has_segments_method',['../conceptdr_1_1_0d5_1_1has__segments__method.html',1,'dr::@5'],['../conceptdr_1_1ranges_1_1_0d13_1_1has__segments__method.html',1,'dr::ranges::@13']]], + ['is_5fdistributed_12',['is_distributed',['../conceptdr_1_1mhp_1_1____detail_1_1is__distributed.html',1,'dr::mhp::__detail']]], + ['is_5flocalizable_13',['is_localizable',['../conceptdr_1_1ranges_1_1_0d13_1_1is__localizable.html',1,'dr::ranges::@13']]], + ['is_5fmdspan_5fview_14',['is_mdspan_view',['../conceptdr_1_1mhp_1_1is__mdspan__view.html',1,'dr::mhp']]], + ['is_5fremote_5fiterator_5fshadow_5fimpl_5f_15',['is_remote_iterator_shadow_impl_',['../conceptdr_1_1ranges_1_1_0d13_1_1is__remote__iterator__shadow__impl__.html',1,'dr::ranges::@13']]], + ['is_5fsyclmemcopyable_16',['is_syclmemcopyable',['../conceptdr_1_1shp_1_1____detail_1_1is__syclmemcopyable.html',1,'dr::shp::__detail']]], + ['iter_5fhas_5flocal_5fmethod_17',['iter_has_local_method',['../conceptdr_1_1ranges_1_1_0d13_1_1iter__has__local__method.html',1,'dr::ranges::@13']]], + ['mdspan_5flike_18',['mdspan_like',['../conceptdr_1_1____detail_1_1mdspan__like.html',1,'dr::__detail']]], + ['no_5fsegments_19',['no_segments',['../conceptdr_1_1mhp_1_1no__segments.html',1,'dr::mhp']]], + ['one_5fargument_20',['one_argument',['../conceptdr_1_1mhp_1_1____detail_1_1one__argument.html',1,'dr::mhp::__detail']]], + ['remote_5fcontiguous_5fiterator_21',['remote_contiguous_iterator',['../conceptdr_1_1remote__contiguous__iterator.html',1,'dr']]], + ['remote_5fcontiguous_5frange_22',['remote_contiguous_range',['../conceptdr_1_1remote__contiguous__range.html',1,'dr']]], + ['remote_5fiterator_23',['remote_iterator',['../conceptdr_1_1remote__iterator.html',1,'dr']]], + ['remote_5frange_24',['remote_range',['../conceptdr_1_1remote__range.html',1,'dr']]], + ['remote_5frange_5fshadow_5fimpl_5f_25',['remote_range_shadow_impl_',['../conceptdr_1_1ranges_1_1_0d13_1_1remote__range__shadow__impl__.html',1,'dr::ranges::@13']]], + ['segment_5fhas_5flocal_5fmethod_26',['segment_has_local_method',['../conceptdr_1_1ranges_1_1_0d13_1_1segment__has__local__method.html',1,'dr::ranges::@13']]], + ['segments_5frange_27',['segments_range',['../conceptdr_1_1ranges_1_1_0d13_1_1segments__range.html',1,'dr::ranges::@13']]], + ['sycl_5fdevice_5fselector_28',['sycl_device_selector',['../conceptdr_1_1shp_1_1____detail_1_1sycl__device__selector.html',1,'dr::shp::__detail']]], + ['tupleelementgettable_29',['TupleElementGettable',['../conceptdr_1_1_0d4_1_1TupleElementGettable.html',1,'dr::@4']]], + ['tuplelike_30',['TupleLike',['../conceptdr_1_1TupleLike.html',1,'dr']]], + ['two_5farguments_31',['two_arguments',['../conceptdr_1_1mhp_1_1____detail_1_1two__arguments.html',1,'dr::mhp::__detail']]], + ['zipable_32',['zipable',['../conceptdr_1_1mhp_1_1____detail_1_1zipable.html',1,'dr::mhp::__detail']]] +]; diff --git a/doxygen/search/functions_0.js b/doxygen/search/functions_0.js new file mode 100644 index 0000000000..eeb5c732e3 --- /dev/null +++ b/doxygen/search/functions_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['begin_0',['begin',['../classdr_1_1mhp_1_1distributed__vector.html#ae4c0c9494f2c9ca131a565b648487acd',1,'dr::mhp::distributed_vector']]] +]; diff --git a/doxygen/search/functions_1.js b/doxygen/search/functions_1.js new file mode 100644 index 0000000000..699a85649d --- /dev/null +++ b/doxygen/search/functions_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['distributed_5fvector_0',['distributed_vector',['../classdr_1_1mhp_1_1distributed__vector.html#a1e6c268244a4a124aa6cf3ef802d133d',1,'dr::mhp::distributed_vector::distributed_vector(std::size_t size=0, distribution dist=distribution())'],['../classdr_1_1mhp_1_1distributed__vector.html#a0448f3a05db40993aad220bcf927f8fd',1,'dr::mhp::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..c515bc186a --- /dev/null +++ b/doxygen/search/functions_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['end_0',['end',['../classdr_1_1mhp_1_1distributed__vector.html#a7e2d8f42e59d01e1d6aaf2eadab9a0d7',1,'dr::mhp::distributed_vector']]], + ['exchange_5fbegin_1',['exchange_begin',['../classdr_1_1mhp_1_1halo__impl.html#ab73e60acdad319f144e563483124fc6a',1,'dr::mhp::halo_impl']]], + ['exchange_5ffinalize_2',['exchange_finalize',['../classdr_1_1mhp_1_1halo__impl.html#aa0d81cc8ddbc683c8e340e917109b377',1,'dr::mhp::halo_impl']]] +]; diff --git a/doxygen/search/functions_3.js b/doxygen/search/functions_3.js new file mode 100644 index 0000000000..2aa3e7b70f --- /dev/null +++ b/doxygen/search/functions_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['halo_5fimpl_0',['halo_impl',['../classdr_1_1mhp_1_1halo__impl.html#a45130d039c491be7692515acc3bde318',1,'dr::mhp::halo_impl']]] +]; diff --git a/doxygen/search/functions_4.js b/doxygen/search/functions_4.js new file mode 100644 index 0000000000..6d226d6c97 --- /dev/null +++ b/doxygen/search/functions_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['index_5fgroup_0',['index_group',['../classdr_1_1mhp_1_1index__group.html#a14d654b8226699b589b82cca7e2f9649',1,'dr::mhp::index_group']]] +]; diff --git a/doxygen/search/functions_5.js b/doxygen/search/functions_5.js new file mode 100644 index 0000000000..a54a5ac821 --- /dev/null +++ b/doxygen/search/functions_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['operator_5b_5d_0',['operator[]',['../classdr_1_1mhp_1_1distributed__vector.html#ac5dd02baad90df8fe28391952e799da5',1,'dr::mhp::distributed_vector']]] +]; diff --git a/doxygen/search/functions_6.js b/doxygen/search/functions_6.js new file mode 100644 index 0000000000..939e8278a3 --- /dev/null +++ b/doxygen/search/functions_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['reduce_5fbegin_0',['reduce_begin',['../classdr_1_1mhp_1_1halo__impl.html#a78da1fc3ca0448705ea7690e6c0e8ecf',1,'dr::mhp::halo_impl']]], + ['reduce_5ffinalize_1',['reduce_finalize',['../classdr_1_1mhp_1_1halo__impl.html#abcf6841717acb246fcea716eb1af02b0',1,'dr::mhp::halo_impl::reduce_finalize(const auto &op)'],['../classdr_1_1mhp_1_1halo__impl.html#af756ff4409842704121c9d81ec1a9974',1,'dr::mhp::halo_impl::reduce_finalize()']]] +]; diff --git a/doxygen/search/functions_7.js b/doxygen/search/functions_7.js new file mode 100644 index 0000000000..86a64c7691 --- /dev/null +++ b/doxygen/search/functions_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['size_0',['size',['../classdr_1_1mhp_1_1distributed__vector.html#aeaee61dead6a4e70f7eb2543ce3e8b15',1,'dr::mhp::distributed_vector']]] +]; diff --git a/doxygen/search/functions_8.js b/doxygen/search/functions_8.js new file mode 100644 index 0000000000..3126f339c3 --- /dev/null +++ b/doxygen/search/functions_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['unstructured_5fhalo_0',['unstructured_halo',['../classdr_1_1mhp_1_1unstructured__halo.html#adb0adc8fd9c1756560507fa412728afb',1,'dr::mhp::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: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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::mhp {
    +
    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_->win_.get(dst, size * sizeof(*dst), segment_index_,
    +
    131 segment_offset * sizeof(*dst));
    +
    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_->win_.put(dst, size * sizeof(*dst), segment_index_,
    +
    147 segment_offset * sizeof(*dst));
    +
    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_->win_.communicator().rank();
    +
    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 dv_ = dv;
    +
    223 segment_index_ = segment_index;
    +
    224 size_ = size;
    +
    225 assert(dv_ != nullptr);
    +
    226 }
    +
    227
    +
    228 auto size() const {
    +
    229 assert(dv_ != nullptr);
    +
    230 return size_;
    +
    231 }
    +
    232
    +
    233 auto begin() const { return iterator(dv_, segment_index_, 0); }
    +
    234 auto end() const { return begin() + size(); }
    +
    235
    +
    236 auto operator[](difference_type n) const { return *(begin() + n); }
    +
    237
    +
    238 bool is_local() const { return segment_index_ == default_comm().rank(); }
    +
    239
    +
    240private:
    +
    241 DV *dv_ = nullptr;
    +
    242 std::size_t segment_index_;
    +
    243 std::size_t size_;
    +
    244}; // dv_segment
    +
    245
    +
    246//
    +
    247// Many views preserve the distributed_vector segments iterator, which
    +
    248// can supply halo
    +
    249//
    +
    250template <typename DR>
    +
    251concept has_halo_method = dr::distributed_range<DR> && requires(DR &&dr) {
    +
    252 { rng::begin(dr::ranges::segments(dr)[0]).halo() };
    +
    253};
    +
    254
    +
    255auto &halo(has_halo_method auto &&dr) {
    +
    256 return rng::begin(dr::ranges::segments(dr)[0]).halo();
    +
    257}
    +
    258
    +
    259} // namespace dr::mhp
    +
    Definition: index.hpp:34
    +
    Definition: segment.hpp:34
    +
    Definition: segment.hpp:11
    +
    Definition: segment.hpp:214
    +
    Definition: concepts.hpp:20
    +
    Definition: segment.hpp:251
    +
    Definition: halo.hpp:354
    +
    + + + + diff --git a/doxygen/segmented_8hpp_source.html b/doxygen/segmented_8hpp_source.html new file mode 100644 index 0000000000..b3fd7b3b63 --- /dev/null +++ b/doxygen/segmented_8hpp_source.html @@ -0,0 +1,182 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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::mhp {
    +
    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::mhp
    +
    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..d4ea8a754c --- /dev/null +++ b/doxygen/segments__tools_8hpp_source.html @@ -0,0 +1,228 @@ + + + + + + + +Distributed Ranges: /home/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/shp_2algorithms_2copy_8hpp_source.html b/doxygen/shp_2algorithms_2copy_8hpp_source.html new file mode 100644 index 0000000000..f344021827 --- /dev/null +++ b/doxygen/shp_2algorithms_2copy_8hpp_source.html @@ -0,0 +1,304 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/detail.hpp>
    +
    15#include <dr/shp/device_ptr.hpp>
    +
    16#include <dr/shp/util.hpp>
    +
    17
    +
    18namespace dr::shp {
    +
    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::shp::__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::shp::__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::shp::__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::shp::__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::shp::copy_async(first, local_last, rng::begin(segment)));
    +
    125
    +
    126 ++segment_iter;
    +
    127 rng::advance(first, n_to_copy);
    +
    128 }
    +
    129
    +
    130 return dr::shp::__detail::combine_events(events);
    +
    131}
    +
    132
    +
    133template <std::forward_iterator InputIt, dr::distributed_iterator OutputIt>
    +
    134 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    135 std::iter_value_t<OutputIt>>
    +
    136OutputIt copy(InputIt first, InputIt last, OutputIt d_first) {
    +
    137 copy_async(first, last, d_first).wait();
    +
    138 return d_first + (last - first);
    +
    139}
    +
    140
    +
    141// Copy from distributed range to local range
    +
    142template <dr::distributed_iterator InputIt, std::forward_iterator OutputIt>
    +
    143 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    144 std::iter_value_t<OutputIt>>
    +
    145sycl::event copy_async(InputIt first, InputIt last, OutputIt d_first) {
    +
    146 auto dist = rng::distance(first, last);
    +
    147 auto segments =
    +
    148 dr::__detail::take_segments(dr::ranges::segments(first), dist);
    +
    149
    +
    150 std::vector<sycl::event> events;
    +
    151
    +
    152 for (auto &&segment : segments) {
    +
    153 auto size = rng::distance(segment);
    +
    154
    +
    155 events.emplace_back(
    +
    156 dr::shp::copy_async(rng::begin(segment), rng::end(segment), d_first));
    +
    157
    +
    158 rng::advance(d_first, size);
    +
    159 }
    +
    160
    +
    161 return dr::shp::__detail::combine_events(events);
    +
    162}
    +
    163
    +
    164template <dr::distributed_iterator InputIt, std::forward_iterator OutputIt>
    +
    165 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    166 std::iter_value_t<OutputIt>>
    +
    167OutputIt copy(InputIt first, InputIt last, OutputIt d_first) {
    +
    168 copy_async(first, last, d_first).wait();
    +
    169 return d_first + (last - first);
    +
    170}
    +
    171
    +
    172// Copy from distributed range to distributed range
    +
    173template <dr::distributed_iterator InputIt, dr::distributed_iterator OutputIt>
    +
    174 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    175 std::iter_value_t<OutputIt>>
    +
    176sycl::event copy_async(InputIt first, InputIt last, OutputIt d_first) {
    +
    177 auto dist = rng::distance(first, last);
    +
    178 auto segments =
    +
    179 dr::__detail::take_segments(dr::ranges::segments(first), dist);
    +
    180
    +
    181 std::vector<sycl::event> events;
    +
    182
    +
    183 for (auto &&segment : segments) {
    +
    184 auto size = rng::distance(segment);
    +
    185
    +
    186 events.emplace_back(
    +
    187 dr::shp::copy_async(rng::begin(segment), rng::end(segment), d_first));
    +
    188
    +
    189 rng::advance(d_first, size);
    +
    190 }
    +
    191
    +
    192 return dr::shp::__detail::combine_events(events);
    +
    193}
    +
    194
    +
    195template <dr::distributed_iterator InputIt, dr::distributed_iterator OutputIt>
    +
    196 requires __detail::is_syclmemcopyable<std::iter_value_t<InputIt>,
    +
    197 std::iter_value_t<OutputIt>>
    +
    198OutputIt copy(InputIt first, InputIt last, OutputIt d_first) {
    +
    199 copy_async(first, last, d_first).wait();
    +
    200 return d_first + (last - first);
    +
    201}
    +
    202
    +
    203// Ranges versions
    +
    204
    +
    205// Distributed to distributed
    +
    206template <dr::distributed_range R, dr::distributed_iterator O>
    +
    207 requires __detail::is_syclmemcopyable<rng::range_value_t<R>,
    +
    208 std::iter_value_t<O>>
    +
    209sycl::event copy_async(R &&r, O result) {
    +
    210 return copy_async(rng::begin(r), rng::end(r), result);
    +
    211}
    +
    212
    +
    213template <dr::distributed_range R, dr::distributed_iterator O>
    +
    214 requires __detail::is_syclmemcopyable<rng::range_value_t<R>,
    +
    215 std::iter_value_t<O>>
    +
    216O copy(R &&r, O result) {
    +
    217 return copy(rng::begin(r), rng::end(r), result);
    +
    218}
    +
    219
    +
    220} // namespace dr::shp
    +
    + + + + diff --git a/doxygen/shp_2algorithms_2exclusive__scan_8hpp_source.html b/doxygen/shp_2algorithms_2exclusive__scan_8hpp_source.html new file mode 100644 index 0000000000..77277c5d1d --- /dev/null +++ b/doxygen/shp_2algorithms_2exclusive__scan_8hpp_source.html @@ -0,0 +1,315 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/algorithms/execution_policy.hpp>
    +
    17#include <dr/shp/allocators.hpp>
    +
    18#include <dr/shp/detail.hpp>
    +
    19#include <dr/shp/init.hpp>
    +
    20#include <dr/shp/vector.hpp>
    +
    21#include <dr/shp/views/views.hpp>
    +
    22
    +
    23namespace dr::shp {
    +
    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::shp::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 shp::devices()[0], shp::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 shp::copy(d_inits, d_inits + inits.size(), inits.data() + 1);
    +
    65
    +
    66 sycl::free(d_inits, shp::context());
    +
    67
    +
    68 inits[0] = init;
    +
    69
    +
    70 auto root = dr::shp::devices()[0];
    +
    71 dr::shp::device_allocator<T> allocator(dr::shp::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::shp::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::shp::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::shp::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::shp::par_unseq, first, last, d_first, init);
    +
    223}
    +
    224
    +
    225} // namespace dr::shp
    +
    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/shp_2algorithms_2fill_8hpp_source.html b/doxygen/shp_2algorithms_2fill_8hpp_source.html new file mode 100644 index 0000000000..1556237021 --- /dev/null +++ b/doxygen/shp_2algorithms_2fill_8hpp_source.html @@ -0,0 +1,179 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/detail.hpp>
    +
    15#include <dr/shp/device_ptr.hpp>
    +
    16#include <dr/shp/util.hpp>
    +
    17
    +
    18namespace dr::shp {
    +
    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::shp::fill_async(segment, value);
    +
    76 events.push_back(e);
    +
    77 }
    +
    78
    +
    79 return dr::shp::__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::shp
    +
    + + + + diff --git a/doxygen/shp_2algorithms_2for__each_8hpp_source.html b/doxygen/shp_2algorithms_2for__each_8hpp_source.html new file mode 100644 index 0000000000..d3931e80b6 --- /dev/null +++ b/doxygen/shp_2algorithms_2for__each_8hpp_source.html @@ -0,0 +1,142 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/algorithms/execution_policy.hpp>
    +
    11#include <dr/shp/detail.hpp>
    +
    12#include <dr/shp/init.hpp>
    +
    13#include <dr/shp/util.hpp>
    +
    14#include <dr/shp/zip_view.hpp>
    +
    15
    +
    16namespace dr::shp {
    +
    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::shp::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::shp::par_unseq, begin, end, std::forward<Fn>(fn));
    +
    55}
    +
    56
    +
    57} // namespace dr::shp
    +
    + + + + diff --git a/doxygen/shp_2algorithms_2inclusive__scan_8hpp_source.html b/doxygen/shp_2algorithms_2inclusive__scan_8hpp_source.html new file mode 100644 index 0000000000..61609f7923 --- /dev/null +++ b/doxygen/shp_2algorithms_2inclusive__scan_8hpp_source.html @@ -0,0 +1,342 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/algorithms/execution_policy.hpp>
    +
    19#include <dr/shp/allocators.hpp>
    +
    20#include <dr/shp/detail.hpp>
    +
    21#include <dr/shp/init.hpp>
    +
    22#include <dr/shp/vector.hpp>
    +
    23#include <dr/shp/views/views.hpp>
    +
    24
    +
    25namespace dr::shp {
    +
    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::shp::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::shp::devices()[0];
    +
    46 dr::shp::device_allocator<T> allocator(dr::shp::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::shp::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::shp::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::shp::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::shp::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::shp::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::shp::par_unseq, first, last, d_first,
    +
    249 std::forward<BinaryOp>(binary_op), init);
    +
    250}
    +
    251
    +
    252} // namespace dr::shp
    +
    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/shp_2algorithms_2iota_8hpp_source.html b/doxygen/shp_2algorithms_2iota_8hpp_source.html new file mode 100644 index 0000000000..8b5a911014 --- /dev/null +++ b/doxygen/shp_2algorithms_2iota_8hpp_source.html @@ -0,0 +1,116 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/algorithms/for_each.hpp>
    +
    12#include <dr/views/iota.hpp>
    +
    13
    +
    14namespace dr::shp {
    +
    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::shp
    +
    + + + + diff --git a/doxygen/shp_2algorithms_2reduce_8hpp_source.html b/doxygen/shp_2algorithms_2reduce_8hpp_source.html new file mode 100644 index 0000000000..8a7304c9d1 --- /dev/null +++ b/doxygen/shp_2algorithms_2reduce_8hpp_source.html @@ -0,0 +1,256 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/algorithms/execution_policy.hpp>
    +
    15#include <dr/shp/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::shp {
    +
    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 oneapi::dpl::execution::device_policy(policy.get_devices()[0]),
    +
    67 dr::ranges::segments(r)[0].begin(), dr::ranges::segments(r)[0].end(),
    +
    68 init, std::forward<BinaryOp>(binary_op)));
    +
    69
    +
    70 std::vector<future_t> futures;
    +
    71
    +
    72 for (auto &&segment : dr::ranges::segments(r)) {
    +
    73 auto &&local_policy = __detail::dpl_policy(dr::ranges::rank(segment));
    +
    74
    +
    75 auto dist = rng::distance(segment);
    +
    76 if (dist <= 0) {
    +
    77 continue;
    +
    78 } else if (dist == 1) {
    +
    79 init = std::forward<BinaryOp>(binary_op)(init, *rng::begin(segment));
    +
    80 continue;
    +
    81 }
    +
    82
    +
    83 auto future = reduce_no_init_async<T>(local_policy, rng::begin(segment),
    +
    84 rng::end(segment),
    +
    85 std::forward<BinaryOp>(binary_op));
    +
    86
    +
    87 futures.push_back(std::move(future));
    +
    88 }
    +
    89
    +
    90 for (auto &&future : futures) {
    +
    91 init = std::forward<BinaryOp>(binary_op)(init, future.get());
    +
    92 }
    +
    93 return init;
    +
    94 } else {
    +
    95 assert(false);
    +
    96 }
    +
    97}
    +
    98
    +
    99template <typename ExecutionPolicy, dr::distributed_range R, typename T>
    +
    100T reduce(ExecutionPolicy &&policy, R &&r, T init) {
    +
    101 return reduce(std::forward<ExecutionPolicy>(policy), std::forward<R>(r), init,
    +
    102 std::plus<>());
    +
    103}
    +
    104
    +
    105template <typename ExecutionPolicy, dr::distributed_range R>
    +
    106rng::range_value_t<R> reduce(ExecutionPolicy &&policy, R &&r) {
    +
    107 return reduce(std::forward<ExecutionPolicy>(policy), std::forward<R>(r),
    +
    108 rng::range_value_t<R>{}, std::plus<>());
    +
    109}
    +
    110
    +
    111// Iterator versions
    +
    112
    +
    113template <typename ExecutionPolicy, dr::distributed_iterator Iter>
    +
    114std::iter_value_t<Iter> reduce(ExecutionPolicy &&policy, Iter first,
    +
    115 Iter last) {
    +
    116 return reduce(std::forward<ExecutionPolicy>(policy),
    +
    117 rng::subrange(first, last), std::iter_value_t<Iter>{},
    +
    118 std::plus<>());
    +
    119}
    +
    120
    +
    121template <typename ExecutionPolicy, dr::distributed_iterator Iter, typename T>
    +
    122T reduce(ExecutionPolicy &&policy, Iter first, Iter last, T init) {
    +
    123 return reduce(std::forward<ExecutionPolicy>(policy),
    +
    124 rng::subrange(first, last), init, std::plus<>());
    +
    125}
    +
    126
    +
    127template <typename ExecutionPolicy, dr::distributed_iterator Iter, typename T,
    +
    128 typename BinaryOp>
    +
    129T reduce(ExecutionPolicy &&policy, Iter first, Iter last, T init,
    +
    130 BinaryOp &&binary_op) {
    +
    131 return reduce(std::forward<ExecutionPolicy>(policy),
    +
    132 rng::subrange(first, last), init,
    +
    133 std::forward<BinaryOp>(binary_op));
    +
    134}
    +
    135
    +
    136// Execution policy-less algorithms
    +
    137
    +
    138template <dr::distributed_range R> rng::range_value_t<R> reduce(R &&r) {
    +
    139 return reduce(dr::shp::par_unseq, std::forward<R>(r));
    +
    140}
    +
    141
    +
    142template <dr::distributed_range R, typename T> T reduce(R &&r, T init) {
    +
    143 return reduce(dr::shp::par_unseq, std::forward<R>(r), init);
    +
    144}
    +
    145
    +
    146template <dr::distributed_range R, typename T, typename BinaryOp>
    +
    147T reduce(R &&r, T init, BinaryOp &&binary_op) {
    +
    148 return reduce(dr::shp::par_unseq, std::forward<R>(r), init,
    +
    149 std::forward<BinaryOp>(binary_op));
    +
    150}
    +
    151
    +
    152template <dr::distributed_iterator Iter>
    +
    153std::iter_value_t<Iter> reduce(Iter first, Iter last) {
    +
    154 return reduce(dr::shp::par_unseq, first, last);
    +
    155}
    +
    156
    +
    157template <dr::distributed_iterator Iter, typename T>
    +
    158T reduce(Iter first, Iter last, T init) {
    +
    159 return reduce(dr::shp::par_unseq, first, last, init);
    +
    160}
    +
    161
    +
    162template <dr::distributed_iterator Iter, typename T, typename BinaryOp>
    +
    163T reduce(Iter first, Iter last, T init, BinaryOp &&binary_op) {
    +
    164 return reduce(dr::shp::par_unseq, first, last, init,
    +
    165 std::forward<BinaryOp>(binary_op));
    +
    166}
    +
    167
    +
    168} // namespace dr::shp
    +
    Definition: onedpl_direct_iterator.hpp:15
    +
    Definition: concepts.hpp:31
    +
    Definition: concepts.hpp:20
    +
    + + + + diff --git a/doxygen/shp_2algorithms_2sort_8hpp_source.html b/doxygen/shp_2algorithms_2sort_8hpp_source.html new file mode 100644 index 0000000000..5e64c23aa2 --- /dev/null +++ b/doxygen/shp_2algorithms_2sort_8hpp_source.html @@ -0,0 +1,374 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/init.hpp>
    +
    15#include <sycl/sycl.hpp>
    +
    16
    +
    17namespace dr::shp {
    +
    18
    +
    19namespace __detail {
    +
    20
    +
    21template <typename LocalPolicy, typename InputIt, typename Compare>
    +
    22sycl::event sort_async(LocalPolicy &&policy, InputIt first, InputIt last,
    +
    23 Compare &&comp) {
    +
    24 if (rng::distance(first, last) >= 2) {
    +
    25 dr::__detail::direct_iterator d_first(first);
    + +
    27 return oneapi::dpl::experimental::sort_async(
    +
    28 std::forward<LocalPolicy>(policy), d_first, d_last,
    +
    29 std::forward<Compare>(comp));
    +
    30 } else {
    +
    31 return sycl::event{};
    +
    32 }
    +
    33}
    +
    34
    +
    35template <typename LocalPolicy, typename InputIt1, typename InputIt2,
    +
    36 typename OutputIt, typename Comparator = std::less<>>
    +
    37OutputIt lower_bound(LocalPolicy &&policy, InputIt1 start, InputIt1 end,
    +
    38 InputIt2 value_first, InputIt2 value_last, OutputIt result,
    +
    39 Comparator comp = Comparator()) {
    +
    40 dr::__detail::direct_iterator d_start(start);
    + +
    42
    +
    43 dr::__detail::direct_iterator d_value_first(value_first);
    +
    44 dr::__detail::direct_iterator d_value_last(value_last);
    +
    45
    +
    46 dr::__detail::direct_iterator d_result(result);
    +
    47
    +
    48 return oneapi::dpl::lower_bound(std::forward<LocalPolicy>(policy), d_start,
    +
    49 d_end, d_value_first, d_value_last, d_result,
    +
    50 comp)
    +
    51 .base();
    +
    52}
    +
    53
    +
    54} // namespace __detail
    +
    55
    +
    56template <dr::distributed_range R, typename Compare = std::less<>>
    +
    57void sort(R &&r, Compare comp = Compare()) {
    +
    58 auto &&segments = dr::ranges::segments(r);
    +
    59
    +
    60 if (rng::size(segments) == 0) {
    +
    61 return;
    +
    62 } else if (rng::size(segments) == 1) {
    +
    63 auto &&segment = *rng::begin(segments);
    +
    64 auto &&local_policy =
    +
    65 dr::shp::__detail::dpl_policy(dr::ranges::rank(segment));
    +
    66 auto &&local_segment = dr::shp::__detail::local(segment);
    +
    67
    +
    68 __detail::sort_async(local_policy, rng::begin(local_segment),
    +
    69 rng::end(local_segment), comp)
    +
    70 .wait();
    +
    71 return;
    +
    72 }
    +
    73
    +
    74 using T = rng::range_value_t<R>;
    +
    75 std::vector<sycl::event> events;
    +
    76
    +
    77 std::size_t n_segments = std::size_t(rng::size(segments));
    +
    78 std::size_t n_splitters = n_segments - 1;
    +
    79
    +
    80 // Sort each local segment, then compute medians.
    +
    81 // Each segment has `n_splitters` medians,
    +
    82 // so `n_segments * n_splitters` medians total.
    +
    83
    +
    84 T *medians = sycl::malloc_device<T>(n_segments * n_splitters,
    +
    85 shp::devices()[0], shp::context());
    +
    86 std::size_t segment_id = 0;
    +
    87
    +
    88 for (auto &&segment : segments) {
    +
    89 auto &&q = dr::shp::__detail::queue(dr::ranges::rank(segment));
    +
    90 auto &&local_policy =
    +
    91 dr::shp::__detail::dpl_policy(dr::ranges::rank(segment));
    +
    92
    +
    93 auto &&local_segment = dr::shp::__detail::local(segment);
    +
    94
    +
    95 auto s = __detail::sort_async(local_policy, rng::begin(local_segment),
    +
    96 rng::end(local_segment), comp);
    +
    97
    +
    98 double step_size = static_cast<double>(rng::size(segment)) / n_segments;
    +
    99
    +
    100 auto local_begin = rng::begin(local_segment);
    +
    101
    +
    102 auto e = q.submit([&](auto &&h) {
    +
    103 h.depends_on(s);
    +
    104
    +
    105 h.parallel_for(n_splitters, [=](auto i) {
    +
    106 medians[n_splitters * segment_id + i] =
    +
    107 local_begin[std::size_t(step_size * (i + 1) + 0.5)];
    +
    108 });
    +
    109 });
    +
    110
    +
    111 events.push_back(e);
    +
    112 ++segment_id;
    +
    113 }
    +
    114
    +
    115 dr::shp::__detail::wait(events);
    +
    116 events.clear();
    +
    117
    +
    118 // Compute global medians by sorting medians and
    +
    119 // computing `n_splitters` medians from the medians.
    +
    120 auto &&local_policy = dr::shp::__detail::dpl_policy(0);
    +
    121 __detail::sort_async(local_policy, medians,
    +
    122 medians + n_segments * n_splitters, comp)
    +
    123 .wait();
    +
    124
    +
    125 double step_size = static_cast<double>(n_segments * n_splitters) / n_segments;
    +
    126
    +
    127 // - Collect median of medians to get final splitters.
    +
    128 // - Write splitters to [0, n_splitters) in `medians`
    +
    129
    +
    130 auto &&q = dr::shp::__detail::queue(0);
    +
    131 q.single_task([=] {
    +
    132 for (std::size_t i = 0; i < n_splitters; i++) {
    +
    133 medians[i] = medians[std::size_t(step_size * (i + 1) + 0.5)];
    +
    134 }
    +
    135 }).wait();
    +
    136
    +
    137 std::vector<std::size_t *> splitter_indices;
    +
    138 std::vector<std::size_t> sorted_seg_sizes(n_splitters + 1);
    +
    139 std::vector<std::vector<std::size_t>> push_positions(n_segments);
    +
    140
    +
    141 // Compute how many elements will be sent to each of the new "sorted
    +
    142 // segments". Simultaneously compute the offsets `push_positions` where each
    +
    143 // segments' corresponding elements will be pushed.
    +
    144
    +
    145 segment_id = 0;
    +
    146 for (auto &&segment : segments) {
    +
    147 auto &&q = dr::shp::__detail::queue(dr::ranges::rank(segment));
    +
    148 auto &&local_policy =
    +
    149 dr::shp::__detail::dpl_policy(dr::ranges::rank(segment));
    +
    150
    +
    151 auto &&local_segment = dr::shp::__detail::local(segment);
    +
    152
    +
    153 std::size_t *splitter_i = sycl::malloc_shared<std::size_t>(
    +
    154 n_splitters, q.get_device(), shp::context());
    +
    155 splitter_indices.push_back(splitter_i);
    +
    156
    +
    157 // Local copy `medians_l` necessary due to [GSD-3893]
    +
    158 T *medians_l =
    +
    159 sycl::malloc_device<T>(n_splitters, q.get_device(), shp::context());
    +
    160
    +
    161 q.memcpy(medians_l, medians, sizeof(T) * n_splitters).wait();
    +
    162
    +
    163 __detail::lower_bound(local_policy, rng::begin(local_segment),
    +
    164 rng::end(local_segment), medians_l,
    +
    165 medians_l + n_splitters, splitter_i, comp);
    +
    166
    +
    167 sycl::free(medians_l, shp::context());
    +
    168
    +
    169 auto p_first = rng::begin(local_segment);
    +
    170 auto p_last = p_first;
    +
    171 for (std::size_t i = 0; i < n_splitters; i++) {
    +
    172 p_last = rng::begin(local_segment) + splitter_i[i];
    +
    173
    +
    174 std::size_t n_elements = rng::distance(p_first, p_last);
    +
    175 std::size_t pos =
    +
    176 std::atomic_ref(sorted_seg_sizes[i]).fetch_add(n_elements);
    +
    177
    +
    178 push_positions[segment_id].push_back(pos);
    +
    179
    +
    180 p_first = p_last;
    +
    181 }
    +
    182
    +
    183 std::size_t n_elements = rng::distance(p_first, rng::end(local_segment));
    +
    184 std::size_t pos =
    +
    185 std::atomic_ref(sorted_seg_sizes.back()).fetch_add(n_elements);
    +
    186
    +
    187 push_positions[segment_id].push_back(pos);
    +
    188
    +
    189 ++segment_id;
    +
    190 }
    +
    191
    +
    192 // Allocate new "sorted segments"
    +
    193 std::vector<T *> sorted_segments;
    +
    194
    +
    195 segment_id = 0;
    +
    196 for (auto &&segment : segments) {
    +
    197 auto &&q = dr::shp::__detail::queue(dr::ranges::rank(segment));
    +
    198
    +
    199 T *buffer = sycl::malloc_device<T>(sorted_seg_sizes[segment_id], q);
    +
    200 sorted_segments.push_back(buffer);
    +
    201
    +
    202 ++segment_id;
    +
    203 }
    +
    204
    +
    205 // Copy corresponding elements to each "sorted segment"
    +
    206 segment_id = 0;
    +
    207 for (auto &&segment : segments) {
    +
    208 auto &&local_segment = dr::shp::__detail::local(segment);
    +
    209
    +
    210 std::size_t *splitter_i = splitter_indices[segment_id];
    +
    211
    +
    212 auto p_first = rng::begin(local_segment);
    +
    213 auto p_last = p_first;
    +
    214 for (std::size_t i = 0; i < n_splitters; i++) {
    +
    215 p_last = rng::begin(local_segment) + splitter_i[i];
    +
    216
    +
    217 std::size_t pos = push_positions[segment_id][i];
    +
    218
    +
    219 auto e = shp::copy_async(p_first, p_last, sorted_segments[i] + pos);
    +
    220 events.push_back(e);
    +
    221
    +
    222 p_first = p_last;
    +
    223 }
    +
    224
    +
    225 std::size_t pos = push_positions[segment_id].back();
    +
    226
    +
    227 auto e = shp::copy_async(p_first, rng::end(local_segment),
    +
    228 sorted_segments.back() + pos);
    +
    229
    +
    230 events.push_back(e);
    +
    231
    +
    232 ++segment_id;
    +
    233 }
    +
    234
    +
    235 dr::shp::__detail::wait(events);
    +
    236 events.clear();
    +
    237
    +
    238 // Sort each of these new segments
    +
    239 for (std::size_t i = 0; i < sorted_segments.size(); i++) {
    +
    240 auto &&local_policy =
    +
    241 dr::shp::__detail::dpl_policy(dr::ranges::rank(segments[i]));
    +
    242 T *seg = sorted_segments[i];
    +
    243 std::size_t n_elements = sorted_seg_sizes[i];
    +
    244
    +
    245 auto e = __detail::sort_async(local_policy, seg, seg + n_elements, comp);
    +
    246
    +
    247 events.push_back(e);
    +
    248 }
    +
    249
    +
    250 dr::shp::__detail::wait(events);
    +
    251 events.clear();
    +
    252
    +
    253 // Copy the results into the output.
    +
    254
    +
    255 auto d_first = rng::begin(r);
    +
    256
    +
    257 for (std::size_t i = 0; i < sorted_segments.size(); i++) {
    +
    258 T *seg = sorted_segments[i];
    +
    259 std::size_t n_elements = sorted_seg_sizes[i];
    +
    260
    +
    261 auto e = shp::copy_async(seg, seg + n_elements, d_first);
    +
    262
    +
    263 events.push_back(e);
    +
    264
    +
    265 rng::advance(d_first, n_elements);
    +
    266 }
    +
    267
    +
    268 dr::shp::__detail::wait(events);
    +
    269
    +
    270 // Free temporary memory.
    +
    271
    +
    272 for (auto &&sorted_seg : sorted_segments) {
    +
    273 sycl::free(sorted_seg, shp::context());
    +
    274 }
    +
    275
    +
    276 for (auto &&splitter_i : splitter_indices) {
    +
    277 sycl::free(splitter_i, shp::context());
    +
    278 }
    +
    279
    +
    280 sycl::free(medians, shp::context());
    +
    281}
    +
    282
    +
    283template <dr::distributed_iterator RandomIt, typename Compare = std::less<>>
    +
    284void sort(RandomIt first, RandomIt last, Compare comp = Compare()) {
    +
    285 sort(rng::subrange(first, last), comp);
    +
    286}
    +
    287
    +
    288} // namespace dr::shp
    +
    Definition: onedpl_direct_iterator.hpp:15
    +
    + + + + diff --git a/doxygen/shp_2algorithms_2transform_8hpp_source.html b/doxygen/shp_2algorithms_2transform_8hpp_source.html new file mode 100644 index 0000000000..e41a507ae1 --- /dev/null +++ b/doxygen/shp_2algorithms_2transform_8hpp_source.html @@ -0,0 +1,168 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/detail.hpp>
    +
    7#include <dr/shp/init.hpp>
    +
    8#include <dr/shp/util.hpp>
    +
    9
    +
    10namespace dr::shp {
    +
    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::shp::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::shp::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::shp::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::shp::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::shp
    +
    Definition: concepts.hpp:31
    +
    Definition: concepts.hpp:20
    +
    + + + + diff --git a/doxygen/shp_2distributed__vector_8hpp_source.html b/doxygen/shp_2distributed__vector_8hpp_source.html new file mode 100644 index 0000000000..8189d2d681 --- /dev/null +++ b/doxygen/shp_2distributed__vector_8hpp_source.html @@ -0,0 +1,296 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/allocators.hpp>
    +
    13#include <dr/shp/device_ptr.hpp>
    +
    14#include <dr/shp/device_vector.hpp>
    +
    15#include <dr/shp/vector.hpp>
    +
    16
    +
    17namespace dr::shp {
    +
    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::shp::device_allocator<T>>
    + +
    118public:
    + +
    120 using const_segment_type =
    +
    121 std::add_const_t<dr::shp::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::shp::devices().size() > 0);
    +
    141 size_ = count;
    +
    142 segment_size_ =
    +
    143 (count + dr::shp::devices().size() - 1) / dr::shp::devices().size();
    +
    144 capacity_ = segment_size_ * dr::shp::devices().size();
    +
    145
    +
    146 std::size_t rank = 0;
    +
    147 for (auto &&device : dr::shp::devices()) {
    +
    148 segments_.emplace_back(segment_type(
    +
    149 segment_size_, Allocator(dr::shp::context(), device), rank++));
    +
    150 }
    +
    151 }
    +
    152
    +
    153 distributed_vector(std::size_t count, const T &value)
    +
    154 : distributed_vector(count) {
    +
    155 dr::shp::fill(*this, value);
    +
    156 }
    +
    157
    +
    158 distributed_vector(std::initializer_list<T> init)
    +
    159 : distributed_vector(init.size()) {
    +
    160 dr::shp::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
    +
    201private:
    +
    202 std::vector<segment_type> segments_;
    +
    203 std::size_t capacity_ = 0;
    +
    204 std::size_t size_ = 0;
    +
    205 std::size_t segment_size_ = 0;
    +
    206};
    +
    207
    +
    208} // namespace dr::shp
    +
    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/shp_2views_2enumerate_8hpp_source.html b/doxygen/shp_2views_2enumerate_8hpp_source.html new file mode 100644 index 0000000000..c47d3f0a9e --- /dev/null +++ b/doxygen/shp_2views_2enumerate_8hpp_source.html @@ -0,0 +1,144 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/zip_view.hpp>
    +
    8
    +
    9namespace dr::shp {
    +
    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::shp::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::shp
    +
    Definition: enumerate.hpp:27
    +
    Definition: enumerate.hpp:43
    +
    zip
    Definition: zip_view.hpp:108
    +
    + + + + diff --git a/doxygen/shp_2views_2views_8hpp_source.html b/doxygen/shp_2views_2views_8hpp_source.html new file mode 100644 index 0000000000..43dac0eeaa --- /dev/null +++ b/doxygen/shp_2views_2views_8hpp_source.html @@ -0,0 +1,111 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/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::shp::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::shp::views
    +
    + + + + diff --git a/doxygen/shp_8hpp_source.html b/doxygen/shp_8hpp_source.html new file mode 100644 index 0000000000..317b78ae99 --- /dev/null +++ b/doxygen/shp_8hpp_source.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    shp.hpp
    +
    +
    +
    1// SPDX-FileCopyrightText: Intel Corporation
    +
    2//
    +
    3// SPDX-License-Identifier: BSD-3-Clause
    +
    4
    +
    5#pragma once
    +
    6
    +
    7#include <dr/shp/algorithms/algorithms.hpp>
    +
    8#include <dr/shp/containers/distributed_dense_matrix.hpp>
    +
    9#include <dr/shp/containers/sparse_matrix.hpp>
    +
    10#include <dr/shp/detail.hpp>
    +
    11#include <dr/shp/distributed_span.hpp>
    +
    12#include <dr/shp/distributed_vector.hpp>
    +
    13#include <dr/shp/init.hpp>
    +
    14#include <dr/shp/range.hpp>
    +
    15#include <dr/shp/range_adaptors.hpp>
    +
    16#include <dr/shp/util.hpp>
    +
    17#include <dr/shp/util/matrix_io.hpp>
    +
    18#include <dr/shp/views/views.hpp>
    +
    19#include <dr/views/views.hpp>
    +
    + + + + diff --git a/doxygen/sliding_8hpp_source.html b/doxygen/sliding_8hpp_source.html new file mode 100644 index 0000000000..3cdd343d18 --- /dev/null +++ b/doxygen/sliding_8hpp_source.html @@ -0,0 +1,148 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/views/segmented.hpp>
    +
    10
    +
    11namespace dr::mhp {
    +
    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::mhp
    +
    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::mhp::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::mhp::halo(dr::mhp::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..d789727706 --- /dev/null +++ b/doxygen/source__location_8hpp_source.html @@ -0,0 +1,151 @@ + + + + + + + +Distributed Ranges: /home/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/span_8hpp_source.html b/doxygen/span_8hpp_source.html new file mode 100644 index 0000000000..491d0b408b --- /dev/null +++ b/doxygen/span_8hpp_source.html @@ -0,0 +1,148 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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::shp {
    +
    12
    +
    13template <typename T, rng::random_access_iterator Iter = T *>
    +
    14class span : public rng::view_interface<dr::shp::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::shp
    +
    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..3c83a6172b --- /dev/null +++ b/doxygen/sparse__matrix_8hpp_source.html @@ -0,0 +1,509 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/algorithms/copy.hpp>
    +
    9#include <dr/shp/containers/matrix_entry.hpp>
    +
    10#include <dr/shp/containers/matrix_partition.hpp>
    +
    11#include <dr/shp/device_vector.hpp>
    +
    12#include <dr/shp/distributed_span.hpp>
    +
    13#include <dr/shp/init.hpp>
    +
    14#include <dr/shp/util/generate_random.hpp>
    +
    15#include <dr/shp/views/csr_matrix_view.hpp>
    +
    16#include <iterator>
    +
    17
    +
    18namespace dr::shp {
    +
    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
    + +
    52 operator+=(difference_type offset) noexcept {
    +
    53
    +
    54 while (offset > 0) {
    +
    55 difference_type current_offset = std::min(
    +
    56 offset,
    +
    57 difference_type(rng::size(*(segments_.begin() + segment_id_))) -
    +
    58 difference_type(idx_));
    +
    59 idx_ += current_offset;
    +
    60 offset -= current_offset;
    +
    61
    +
    62 if (idx_ >= rng::size((*(segments_.begin() + segment_id_)))) {
    +
    63 segment_id_++;
    +
    64 idx_ = 0;
    +
    65 }
    +
    66 }
    +
    67
    +
    68 while (offset < 0) {
    +
    69 difference_type current_offset =
    +
    70 std::min(-offset, difference_type(idx_) + 1);
    +
    71
    +
    72 difference_type new_idx = difference_type(idx_) - current_offset;
    +
    73
    +
    74 if (new_idx < 0) {
    +
    75 segment_id_--;
    +
    76 new_idx = rng::size(*(segments_.begin() + segment_id_)) - 1;
    +
    77 }
    +
    78
    +
    79 idx_ = new_idx;
    +
    80 }
    +
    81
    +
    82 return *this;
    +
    83 }
    +
    84
    +
    85 constexpr bool operator==(const iterator_accessor &other) const noexcept {
    +
    86 return segment_id_ == other.segment_id_ && idx_ == other.idx_;
    +
    87 }
    +
    88
    +
    89 constexpr difference_type
    +
    90 operator-(const iterator_accessor &other) const noexcept {
    +
    91 return difference_type(get_global_idx()) - other.get_global_idx();
    +
    92 }
    +
    93
    +
    94 constexpr bool operator<(const iterator_accessor &other) const noexcept {
    +
    95 if (segment_id_ < other.segment_id_) {
    +
    96 return true;
    +
    97 } else if (segment_id_ == other.segment_id_) {
    +
    98 return idx_ < other.idx_;
    +
    99 } else {
    +
    100 return false;
    +
    101 }
    +
    102 }
    +
    103
    +
    104 constexpr reference operator*() const noexcept {
    +
    105 return *((*(segments_.begin() + segment_id_)).begin() + 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 rng::views::all_t<Segments> segments_;
    +
    118 size_type segment_id_ = 0;
    +
    119 size_type idx_ = 0;
    +
    120};
    +
    121
    +
    122template <typename Segments>
    + + +
    125
    +
    126template <typename T, std::integral I = std::int64_t> class sparse_matrix {
    +
    127public:
    +
    128 using size_type = std::size_t;
    +
    129 using difference_type = std::ptrdiff_t;
    +
    130
    + +
    132
    +
    133 using scalar_reference = rng::range_reference_t<
    + +
    135 using const_scalar_reference = rng::range_reference_t<
    + +
    137
    + + +
    140
    +
    141 using key_type = dr::index<I>;
    +
    142
    + +
    144 T, I,
    +
    145 rng::iterator_t<dr::shp::device_vector<T, dr::shp::device_allocator<T>>>,
    +
    146 rng::iterator_t<dr::shp::device_vector<I, dr::shp::device_allocator<I>>>>;
    +
    147
    +
    148 // using iterator = sparse_matrix_iterator<T, dr::shp::device_vector<T,
    +
    149 // dr::shp::device_allocator<T>>>;
    +
    150 using iterator =
    + +
    152
    + +
    154 : shape_(shape), partition_(new dr::shp::block_cyclic()) {
    +
    155 init_();
    +
    156 }
    +
    157
    +
    158 sparse_matrix(key_type shape, double density)
    +
    159 : shape_(shape), partition_(new dr::shp::block_cyclic()) {
    +
    160 init_random_(density);
    +
    161 }
    +
    162
    +
    163 sparse_matrix(key_type shape, double density,
    +
    164 const matrix_partition &partition)
    +
    165 : shape_(shape), partition_(partition.clone()) {
    +
    166 init_random_(density);
    +
    167 }
    +
    168
    +
    169 sparse_matrix(key_type shape, const matrix_partition &partition)
    +
    170 : shape_(shape), partition_(partition.clone()) {
    +
    171 init_();
    +
    172 }
    +
    173
    +
    174 size_type size() const noexcept { return total_nnz_; }
    +
    175
    +
    176 key_type shape() const noexcept { return shape_; }
    +
    177
    +
    178 iterator begin() { return iterator(segments(), 0, 0); }
    +
    179
    +
    180 iterator end() {
    +
    181 return iterator(segments(), grid_shape_[0] * grid_shape_[1], 0);
    +
    182 }
    +
    183
    +
    184 segment_type tile(key_type tile_index) {
    +
    185 std::size_t tile_idx = tile_index[0] * grid_shape_[1] + tile_index[1];
    +
    186 auto values = values_[tile_idx].begin();
    +
    187 auto rowptr = rowptr_[tile_idx].begin();
    +
    188 auto colind = colind_[tile_idx].begin();
    +
    189 auto nnz = nnz_[tile_idx];
    +
    190
    +
    191 std::size_t tm =
    +
    192 std::min(tile_shape_[0], shape()[0] - tile_index[0] * tile_shape_[0]);
    +
    193 std::size_t tn =
    +
    194 std::min(tile_shape_[1], shape()[1] - tile_index[1] * tile_shape_[1]);
    +
    195
    +
    196 return segment_type(values, rowptr, colind, key_type(tm, tn), nnz,
    +
    197 values_[tile_idx].rank());
    +
    198 }
    +
    199
    +
    200 // Note: this function is currently *not* asynchronous due to a deadlock
    +
    201 // in `gemv_benchmark`. I believe this is a SYCL bug.
    +
    202 template <typename... Args>
    +
    203 auto copy_tile_async(key_type tile_index,
    + +
    205 std::size_t tile_idx = tile_index[0] * grid_shape_[1] + tile_index[1];
    +
    206 auto &&values = values_[tile_idx];
    +
    207 auto &&colind = colind_[tile_idx];
    +
    208 auto &&rowptr = rowptr_[tile_idx];
    +
    209 auto &&nnz = nnz_[tile_idx];
    +
    210
    +
    211 total_nnz_ -= nnz;
    +
    212 nnz = tile_view.size();
    +
    213
    +
    214 total_nnz_ += tile_view.size();
    +
    215
    +
    216 values.resize(tile_view.size());
    +
    217 colind.resize(tile_view.size());
    +
    218 rowptr.resize(tile_view.shape()[0] + 1);
    +
    219
    +
    220 auto v_e = dr::shp::copy_async(tile_view.values_data(),
    +
    221 tile_view.values_data() + values.size(),
    +
    222 values.data());
    +
    223
    +
    224 auto c_e = dr::shp::copy_async(tile_view.colind_data(),
    +
    225 tile_view.colind_data() + colind.size(),
    +
    226 colind.data());
    +
    227
    +
    228 auto r_e = dr::shp::copy_async(tile_view.rowptr_data(),
    +
    229 tile_view.rowptr_data() + rowptr.size(),
    +
    230 rowptr.data());
    +
    231
    +
    232 tiles_ = generate_tiles_();
    +
    233 segments_ = generate_segments_();
    +
    234
    +
    235 v_e.wait();
    +
    236 c_e.wait();
    +
    237 r_e.wait();
    +
    238
    +
    239 return __detail::combine_events({v_e, c_e, r_e});
    +
    240 }
    +
    241
    +
    242 template <typename... Args>
    +
    243 void copy_tile(key_type tile_index,
    + +
    245 copy_tile_async(tile_index, tile_view).wait();
    +
    246 }
    +
    247
    +
    248 key_type tile_shape() const noexcept { return tile_shape_; }
    +
    249
    +
    250 key_type grid_shape() const noexcept { return grid_shape_; }
    +
    251
    +
    252 std::span<segment_type> tiles() { return std::span(tiles_); }
    +
    253
    +
    254 std::span<segment_type> segments() { return std::span(segments_); }
    +
    255
    +
    256private:
    +
    257 std::vector<segment_type> generate_tiles_() {
    +
    258 std::vector<segment_type> views_;
    +
    259
    +
    260 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
    +
    261 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
    +
    262 std::size_t tm = std::min<std::size_t>(tile_shape_[0],
    +
    263 shape()[0] - i * tile_shape_[0]);
    +
    264 std::size_t tn = std::min<std::size_t>(tile_shape_[1],
    +
    265 shape()[1] - j * tile_shape_[1]);
    +
    266
    +
    267 std::size_t tile_idx = i * grid_shape_[1] + j;
    +
    268
    +
    269 auto values = values_[tile_idx].begin();
    +
    270 auto rowptr = rowptr_[tile_idx].begin();
    +
    271 auto colind = colind_[tile_idx].begin();
    +
    272 auto nnz = nnz_[tile_idx];
    +
    273
    +
    274 views_.emplace_back(values, rowptr, colind, key_type(tm, tn), nnz,
    +
    275 values_[tile_idx].rank());
    +
    276 }
    +
    277 }
    +
    278 return views_;
    +
    279 }
    +
    280
    +
    281 std::vector<segment_type> generate_segments_() {
    +
    282 std::vector<segment_type> views_;
    +
    283
    +
    284 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
    +
    285 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
    +
    286 std::size_t tm = std::min<std::size_t>(tile_shape_[0],
    +
    287 shape()[0] - i * tile_shape_[0]);
    +
    288 std::size_t tn = std::min<std::size_t>(tile_shape_[1],
    +
    289 shape()[1] - j * tile_shape_[1]);
    +
    290
    +
    291 std::size_t tile_idx = i * grid_shape_[1] + j;
    +
    292
    +
    293 auto values = values_[tile_idx].begin();
    +
    294 auto rowptr = rowptr_[tile_idx].begin();
    +
    295 auto colind = colind_[tile_idx].begin();
    +
    296 auto nnz = nnz_[tile_idx];
    +
    297
    +
    298 std::size_t m_offset = i * tile_shape_[0];
    +
    299 std::size_t n_offset = j * tile_shape_[1];
    +
    300
    +
    301 views_.emplace_back(values, rowptr, colind, key_type(tm, tn), nnz,
    +
    302 values_[i * grid_shape_[1] + j].rank(),
    +
    303 key_type(m_offset, n_offset));
    +
    304 }
    +
    305 }
    +
    306 return views_;
    +
    307 }
    +
    308
    +
    309private:
    +
    310 void init_() {
    +
    311 grid_shape_ = key_type(partition_->grid_shape(shape()));
    +
    312 tile_shape_ = key_type(partition_->tile_shape(shape()));
    +
    313
    +
    314 values_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    315 rowptr_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    316 colind_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    317 nnz_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    318
    +
    319 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
    +
    320 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
    +
    321 std::size_t rank = partition_->tile_rank(shape(), {i, j});
    +
    322
    +
    323 auto device = dr::shp::devices()[rank];
    +
    324 dr::shp::device_allocator<T> alloc(dr::shp::context(), device);
    +
    325 dr::shp::device_allocator<I> i_alloc(dr::shp::context(), device);
    +
    326
    +
    327 values_.emplace_back(1, alloc, rank);
    +
    328 rowptr_.emplace_back(2, i_alloc, rank);
    +
    329 colind_.emplace_back(1, i_alloc, rank);
    +
    330 nnz_.push_back(0);
    +
    331 rowptr_.back()[0] = 0;
    +
    332 rowptr_.back()[1] = 0;
    +
    333 }
    +
    334 }
    +
    335 tiles_ = generate_tiles_();
    +
    336 segments_ = generate_segments_();
    +
    337 }
    +
    338
    +
    339 void init_random_(double density) {
    +
    340 grid_shape_ = key_type(partition_->grid_shape(shape()));
    +
    341 tile_shape_ = key_type(partition_->tile_shape(shape()));
    +
    342
    +
    343 values_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    344 rowptr_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    345 colind_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    346 nnz_.reserve(grid_shape_[0] * grid_shape_[1]);
    +
    347
    +
    348 for (std::size_t i = 0; i < grid_shape_[0]; i++) {
    +
    349 for (std::size_t j = 0; j < grid_shape_[1]; j++) {
    +
    350 std::size_t rank = partition_->tile_rank(shape(), {i, j});
    +
    351
    +
    352 std::size_t tm = std::min<std::size_t>(tile_shape_[0],
    +
    353 shape()[0] - i * tile_shape_[0]);
    +
    354 std::size_t tn = std::min<std::size_t>(tile_shape_[1],
    +
    355 shape()[1] - j * tile_shape_[1]);
    +
    356
    +
    357 auto device = dr::shp::devices()[rank];
    +
    358 dr::shp::device_allocator<T> alloc(dr::shp::context(), device);
    +
    359 dr::shp::device_allocator<I> i_alloc(dr::shp::context(), device);
    +
    360
    +
    361 auto seed = i * grid_shape_[1] + j;
    +
    362
    +
    363 auto csr = generate_random_csr<T, I>(key_type(tm, tn), density, seed);
    +
    364 std::size_t nnz = csr.size();
    +
    365
    + +
    367 csr.size(), alloc, rank);
    + +
    369 tm + 1, i_alloc, rank);
    +
    370
    + +
    372 csr.size(), i_alloc, rank);
    +
    373
    +
    374 dr::shp::copy(csr.values_data(), csr.values_data() + csr.size(),
    +
    375 values.data());
    +
    376 dr::shp::copy(csr.rowptr_data(), csr.rowptr_data() + tm + 1,
    +
    377 rowptr.data());
    +
    378 dr::shp::copy(csr.colind_data(), csr.colind_data() + csr.size(),
    +
    379 colind.data());
    +
    380
    +
    381 values_.push_back(std::move(values));
    +
    382 rowptr_.emplace_back(std::move(rowptr));
    +
    383 colind_.emplace_back(std::move(colind));
    +
    384 nnz_.push_back(nnz);
    +
    385 total_nnz_ += nnz;
    +
    386
    +
    387 delete[] csr.values_data();
    +
    388 delete[] csr.rowptr_data();
    +
    389 delete[] csr.colind_data();
    +
    390 }
    +
    391 }
    +
    392 tiles_ = generate_tiles_();
    +
    393 segments_ = generate_segments_();
    +
    394 }
    +
    395
    +
    396private:
    +
    397 key_type shape_;
    +
    398 key_type grid_shape_;
    +
    399 key_type tile_shape_;
    +
    400 std::unique_ptr<dr::shp::matrix_partition> partition_;
    +
    401
    +
    402 std::vector<dr::shp::device_vector<T, dr::shp::device_allocator<T>>> values_;
    +
    403 std::vector<dr::shp::device_vector<I, dr::shp::device_allocator<I>>> rowptr_;
    +
    404 std::vector<dr::shp::device_vector<I, dr::shp::device_allocator<I>>> colind_;
    +
    405
    +
    406 std::vector<std::size_t> nnz_;
    +
    407 std::size_t total_nnz_ = 0;
    +
    408
    +
    409 std::vector<segment_type> tiles_;
    +
    410 std::vector<segment_type> segments_;
    +
    411};
    +
    412
    +
    413} // namespace dr::shp
    + +
    Definition: iterator_adaptor.hpp:23
    +
    Definition: matrix_partition.hpp:34
    +
    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:113
    +
    Definition: sparse_matrix.hpp:126
    +
    + + + + 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..07d1d57fb4 --- /dev/null +++ b/doxygen/standard__views_8hpp_source.html @@ -0,0 +1,135 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/distributed_span.hpp>
    +
    10#include <dr/shp/views/enumerate.hpp>
    +
    11#include <dr/shp/zip_view.hpp>
    +
    12#include <dr/views/transform.hpp>
    +
    13
    +
    14namespace dr::shp {
    +
    15
    +
    16namespace views {
    +
    17
    +
    18template <dr::distributed_range R>
    +
    19auto slice(R &&r, dr::index<> slice_indices) {
    +
    20 return dr::shp::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::shp
    +
    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..51e6d9e9f1 --- /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:
      +
    • /home/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..85f966f578 --- /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:
      +
    • /home/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..58b1619988 --- /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:
      +
    • /home/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..28610c3881 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..28610c3881 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..d2994bfaa9 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..d2994bfaa9 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..9866e3bf8d --- /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:
      +
    • /home/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..4b0ed97541 --- /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:
      +
    • /home/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..4cdb29a993 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..4cdb29a993 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..01f7075e09 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..01f7075e09 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..055dc74a6e --- /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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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..a3f07f611b 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..a3f07f611b 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..64501f7e5c --- /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:
      +
    • /home/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..6f8b349090 --- /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:
      +
    • /home/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..c20bc133f0 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..c20bc133f0 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..43090bb596 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..43090bb596 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..1c5dc054db --- /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:
      +
    • /home/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..b94e232bda --- /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:
      +
    • /home/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..2317305a83 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..2317305a83 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..430fb9a76a 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..430fb9a76a 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..cb011764ba --- /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:
      +
    • /home/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..b4369c752a --- /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:
      +
    • /home/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..60e68d8170 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..60e68d8170 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..65ca36e641 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..65ca36e641 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..040eff484b --- /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:
      +
    • /home/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..f19d319dca --- /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:
      +
    • /home/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..35b25af826 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..35b25af826 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..ec38718e20 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..ec38718e20 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..59955ab098 --- /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:
      +
    • /home/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..d2905aaa2c --- /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:
      +
    • /home/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..78a00efc38 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..78a00efc38 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..294dd43ca8 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..294dd43ca8 Binary files /dev/null and b/doxygen/structdr_1_1is__zip__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1mhp_1_1____detail_1_1any-members.html b/doxygen/structdr_1_1mhp_1_1____detail_1_1any-members.html new file mode 100644 index 0000000000..2110e58484 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1____detail_1_1any-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mhp::__detail::any Member List
    +
    +
    + +

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

    + + +
    operator T() const noexcept (defined in dr::mhp::__detail::any)dr::mhp::__detail::anyinline
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1____detail_1_1any.html b/doxygen/structdr_1_1mhp_1_1____detail_1_1any.html new file mode 100644 index 0000000000..e4cfb92142 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1____detail_1_1any.html @@ -0,0 +1,99 @@ + + + + + + + +Distributed Ranges: dr::mhp::__detail::any Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::__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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/algorithms/md_for_each.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context-members.html b/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context-members.html new file mode 100644 index 0000000000..812a82d64d --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context-members.html @@ -0,0 +1,97 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mhp::__detail::global_context Member List
    +
    + + + + + diff --git a/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context.html b/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context.html new file mode 100644 index 0000000000..bb767563b6 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context.html @@ -0,0 +1,134 @@ + + + + + + + +Distributed Ranges: dr::mhp::__detail::global_context Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::__detail::global_context Struct Reference
    +
    +
    +
    +Collaboration diagram for dr::mhp::__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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/global.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context__coll__graph.map b/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context__coll__graph.map new file mode 100644 index 0000000000..a8355892d0 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context__coll__graph.md5 b/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context__coll__graph.md5 new file mode 100644 index 0000000000..1b00de855a --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context__coll__graph.md5 @@ -0,0 +1 @@ +a0bd365a159db1e09e95568b33c33726 \ No newline at end of file diff --git a/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context__coll__graph.png b/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context__coll__graph.png new file mode 100644 index 0000000000..9460fe9f60 Binary files /dev/null and b/doxygen/structdr_1_1mhp_1_1____detail_1_1global__context__coll__graph.png differ diff --git a/doxygen/structdr_1_1mhp_1_1device__policy.html b/doxygen/structdr_1_1mhp_1_1device__policy.html new file mode 100644 index 0000000000..959cb63b28 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1device__policy.html @@ -0,0 +1,88 @@ + + + + + + + +Distributed Ranges: dr::mhp::device_policy Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mhp::device_policy Struct Reference
    +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/sycl_support.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1distribution-members.html b/doxygen/structdr_1_1mhp_1_1distribution-members.html new file mode 100644 index 0000000000..4be456623a --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1distribution-members.html @@ -0,0 +1,95 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mhp::distribution Member List
    +
    +
    + +

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

    + + + + + + + + +
    granularity(std::size_t size) (defined in dr::mhp::distribution)dr::mhp::distributioninline
    granularity() const (defined in dr::mhp::distribution)dr::mhp::distributioninline
    halo(std::size_t radius) (defined in dr::mhp::distribution)dr::mhp::distributioninline
    halo(std::size_t prev, std::size_t next) (defined in dr::mhp::distribution)dr::mhp::distributioninline
    halo() const (defined in dr::mhp::distribution)dr::mhp::distributioninline
    periodic(bool periodic) (defined in dr::mhp::distribution)dr::mhp::distributioninline
    periodic() const (defined in dr::mhp::distribution)dr::mhp::distributioninline
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1distribution.html b/doxygen/structdr_1_1mhp_1_1distribution.html new file mode 100644 index 0000000000..af430a7552 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1distribution.html @@ -0,0 +1,116 @@ + + + + + + + +Distributed Ranges: dr::mhp::distribution Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/containers/distribution.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1halo__bounds-members.html b/doxygen/structdr_1_1mhp_1_1halo__bounds-members.html new file mode 100644 index 0000000000..5b6be29c24 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1halo__bounds-members.html @@ -0,0 +1,91 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mhp::halo_bounds Member List
    +
    +
    + +

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

    + + + + +
    next (defined in dr::mhp::halo_bounds)dr::mhp::halo_bounds
    periodic (defined in dr::mhp::halo_bounds)dr::mhp::halo_bounds
    prev (defined in dr::mhp::halo_bounds)dr::mhp::halo_bounds
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1halo__bounds.html b/doxygen/structdr_1_1mhp_1_1halo__bounds.html new file mode 100644 index 0000000000..0a4e09416c --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1halo__bounds.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: dr::mhp::halo_bounds Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/halo.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1halo__impl_1_1max__op-members.html b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1max__op-members.html new file mode 100644 index 0000000000..bc00f5c303 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1max__op-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mhp::halo_impl< Group >::max_op Member List
    +
    +
    + +

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

    + + +
    operator()(T &a, T &b) const (defined in dr::mhp::halo_impl< Group >::max_op)dr::mhp::halo_impl< Group >::max_opinline
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1halo__impl_1_1max__op.html b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1max__op.html new file mode 100644 index 0000000000..6e1fe42f76 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1max__op.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mhp::halo_impl< Group >::max_op Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/halo.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1halo__impl_1_1min__op-members.html b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1min__op-members.html new file mode 100644 index 0000000000..1174bccf5d --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1min__op-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mhp::halo_impl< Group >::min_op Member List
    +
    +
    + +

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

    + + +
    operator()(T &a, T &b) const (defined in dr::mhp::halo_impl< Group >::min_op)dr::mhp::halo_impl< Group >::min_opinline
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1halo__impl_1_1min__op.html b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1min__op.html new file mode 100644 index 0000000000..1c931a8b13 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1min__op.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mhp::halo_impl< Group >::min_op Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/halo.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1halo__impl_1_1multiplies__op-members.html b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1multiplies__op-members.html new file mode 100644 index 0000000000..193f53e115 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1multiplies__op-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mhp::halo_impl< Group >::multiplies_op Member List
    +
    +
    + +

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

    + + +
    operator()(T &a, T &b) const (defined in dr::mhp::halo_impl< Group >::multiplies_op)dr::mhp::halo_impl< Group >::multiplies_opinline
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1halo__impl_1_1multiplies__op.html b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1multiplies__op.html new file mode 100644 index 0000000000..73607e0ef8 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1multiplies__op.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mhp::halo_impl< Group >::multiplies_op Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/halo.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1halo__impl_1_1plus__op-members.html b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1plus__op-members.html new file mode 100644 index 0000000000..dee5aeeb88 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1plus__op-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mhp::halo_impl< Group >::plus_op Member List
    +
    +
    + +

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

    + + +
    operator()(T &a, T &b) const (defined in dr::mhp::halo_impl< Group >::plus_op)dr::mhp::halo_impl< Group >::plus_opinline
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1halo__impl_1_1plus__op.html b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1plus__op.html new file mode 100644 index 0000000000..6df741195d --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1plus__op.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mhp::halo_impl< Group >::plus_op Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/halo.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1halo__impl_1_1second__op-members.html b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1second__op-members.html new file mode 100644 index 0000000000..0b7bbb8143 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1second__op-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mhp::halo_impl< Group >::second_op Member List
    +
    +
    + +

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

    + + +
    operator()(T &a, T &b) const (defined in dr::mhp::halo_impl< Group >::second_op)dr::mhp::halo_impl< Group >::second_opinline
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1halo__impl_1_1second__op.html b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1second__op.html new file mode 100644 index 0000000000..f230a7dcbe --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1halo__impl_1_1second__op.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mhp::halo_impl< Group >::second_op Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/halo.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1mdspan__view-members.html b/doxygen/structdr_1_1mhp_1_1mdspan__view-members.html new file mode 100644 index 0000000000..c11af68b71 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1mdspan__view-members.html @@ -0,0 +1,97 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mhp::mdspan_view< R, Rank, Layout > Member List
    +
    +
    + +

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

    + + + + + + + + + + +
    begin() const (defined in dr::mhp::mdspan_view< R, Rank, Layout >)dr::mhp::mdspan_view< R, Rank, Layout >inline
    end() const (defined in dr::mhp::mdspan_view< R, Rank, Layout >)dr::mhp::mdspan_view< R, Rank, Layout >inline
    grid() (defined in dr::mhp::mdspan_view< R, Rank, Layout >)dr::mhp::mdspan_view< R, Rank, Layout >inline
    mdspan() const (defined in dr::mhp::mdspan_view< R, Rank, Layout >)dr::mhp::mdspan_view< R, Rank, Layout >inline
    mdspan_view(R r, dr::__detail::dr_extents< Rank > full_shape) (defined in dr::mhp::mdspan_view< R, Rank, Layout >)dr::mhp::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::mhp::mdspan_view< R, Rank, Layout >)dr::mhp::mdspan_view< R, Rank, Layout >inline
    operator[](difference_type n) (defined in dr::mhp::mdspan_view< R, Rank, Layout >)dr::mhp::mdspan_view< R, Rank, Layout >inline
    rank() (defined in dr::mhp::mdspan_view< R, Rank, Layout >)dr::mhp::mdspan_view< R, Rank, Layout >inlinestatic
    segments() const (defined in dr::mhp::mdspan_view< R, Rank, Layout >)dr::mhp::mdspan_view< R, Rank, Layout >inline
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1mdspan__view.html b/doxygen/structdr_1_1mhp_1_1mdspan__view.html new file mode 100644 index 0000000000..5522428a46 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1mdspan__view.html @@ -0,0 +1,144 @@ + + + + + + + +Distributed Ranges: dr::mhp::mdspan_view< R, Rank, Layout > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::mdspan_view< R, Rank, Layout > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::mhp::mdspan_view< R, Rank, Layout >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::mhp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/views/mdspan_view.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1mdspan__view__coll__graph.map b/doxygen/structdr_1_1mhp_1_1mdspan__view__coll__graph.map new file mode 100644 index 0000000000..26f370fcfc --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1mdspan__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1mhp_1_1mdspan__view__coll__graph.md5 b/doxygen/structdr_1_1mhp_1_1mdspan__view__coll__graph.md5 new file mode 100644 index 0000000000..72a84717f9 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1mdspan__view__coll__graph.md5 @@ -0,0 +1 @@ +3d0a6d602cd3273c78f94299173212bc \ No newline at end of file diff --git a/doxygen/structdr_1_1mhp_1_1mdspan__view__coll__graph.png b/doxygen/structdr_1_1mhp_1_1mdspan__view__coll__graph.png new file mode 100644 index 0000000000..9c539fe429 Binary files /dev/null and b/doxygen/structdr_1_1mhp_1_1mdspan__view__coll__graph.png differ diff --git a/doxygen/structdr_1_1mhp_1_1mdspan__view__inherit__graph.map b/doxygen/structdr_1_1mhp_1_1mdspan__view__inherit__graph.map new file mode 100644 index 0000000000..26f370fcfc --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1mdspan__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1mhp_1_1mdspan__view__inherit__graph.md5 b/doxygen/structdr_1_1mhp_1_1mdspan__view__inherit__graph.md5 new file mode 100644 index 0000000000..72a84717f9 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1mdspan__view__inherit__graph.md5 @@ -0,0 +1 @@ +3d0a6d602cd3273c78f94299173212bc \ No newline at end of file diff --git a/doxygen/structdr_1_1mhp_1_1mdspan__view__inherit__graph.png b/doxygen/structdr_1_1mhp_1_1mdspan__view__inherit__graph.png new file mode 100644 index 0000000000..9c539fe429 Binary files /dev/null and b/doxygen/structdr_1_1mhp_1_1mdspan__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1mhp_1_1submdspan__view-members.html b/doxygen/structdr_1_1mhp_1_1submdspan__view-members.html new file mode 100644 index 0000000000..5069758e03 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1submdspan__view-members.html @@ -0,0 +1,95 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::mhp::submdspan_view< Base > Member List
    +
    +
    + +

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

    + + + + + + + + +
    begin() const (defined in dr::mhp::submdspan_view< Base >)dr::mhp::submdspan_view< Base >inline
    end() const (defined in dr::mhp::submdspan_view< Base >)dr::mhp::submdspan_view< Base >inline
    grid() (defined in dr::mhp::submdspan_view< Base >)dr::mhp::submdspan_view< Base >inline
    mdspan() const (defined in dr::mhp::submdspan_view< Base >)dr::mhp::submdspan_view< Base >inline
    operator[](difference_type n) (defined in dr::mhp::submdspan_view< Base >)dr::mhp::submdspan_view< Base >inline
    segments() const (defined in dr::mhp::submdspan_view< Base >)dr::mhp::submdspan_view< Base >inline
    submdspan_view(is_mdspan_view auto base, extents_type slice_starts, extents_type slice_ends) (defined in dr::mhp::submdspan_view< Base >)dr::mhp::submdspan_view< Base >inline
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1submdspan__view.html b/doxygen/structdr_1_1mhp_1_1submdspan__view.html new file mode 100644 index 0000000000..e80f8208ca --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1submdspan__view.html @@ -0,0 +1,134 @@ + + + + + + + +Distributed Ranges: dr::mhp::submdspan_view< Base > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::submdspan_view< Base > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for dr::mhp::submdspan_view< Base >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for dr::mhp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/views/submdspan_view.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1submdspan__view__coll__graph.map b/doxygen/structdr_1_1mhp_1_1submdspan__view__coll__graph.map new file mode 100644 index 0000000000..5e7bd652c2 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1submdspan__view__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1mhp_1_1submdspan__view__coll__graph.md5 b/doxygen/structdr_1_1mhp_1_1submdspan__view__coll__graph.md5 new file mode 100644 index 0000000000..9840d3ba4a --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1submdspan__view__coll__graph.md5 @@ -0,0 +1 @@ +281df382173094ba45ac093971b17453 \ No newline at end of file diff --git a/doxygen/structdr_1_1mhp_1_1submdspan__view__coll__graph.png b/doxygen/structdr_1_1mhp_1_1submdspan__view__coll__graph.png new file mode 100644 index 0000000000..b0f6b2ae18 Binary files /dev/null and b/doxygen/structdr_1_1mhp_1_1submdspan__view__coll__graph.png differ diff --git a/doxygen/structdr_1_1mhp_1_1submdspan__view__inherit__graph.map b/doxygen/structdr_1_1mhp_1_1submdspan__view__inherit__graph.map new file mode 100644 index 0000000000..5e7bd652c2 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1submdspan__view__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/doxygen/structdr_1_1mhp_1_1submdspan__view__inherit__graph.md5 b/doxygen/structdr_1_1mhp_1_1submdspan__view__inherit__graph.md5 new file mode 100644 index 0000000000..9840d3ba4a --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1submdspan__view__inherit__graph.md5 @@ -0,0 +1 @@ +281df382173094ba45ac093971b17453 \ No newline at end of file diff --git a/doxygen/structdr_1_1mhp_1_1submdspan__view__inherit__graph.png b/doxygen/structdr_1_1mhp_1_1submdspan__view__inherit__graph.png new file mode 100644 index 0000000000..b0f6b2ae18 Binary files /dev/null and b/doxygen/structdr_1_1mhp_1_1submdspan__view__inherit__graph.png differ diff --git a/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1range__size-members.html b/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1range__size-members.html new file mode 100644 index 0000000000..9009794562 --- /dev/null +++ b/doxygen/structdr_1_1mhp_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::mhp::views::__detail::range_size< R > Member List
    +
    +
    + +

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

    + + +
    type typedef (defined in dr::mhp::views::__detail::range_size< R >)dr::mhp::views::__detail::range_size< R >
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1range__size.html b/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1range__size.html new file mode 100644 index 0000000000..b7a7322b18 --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1range__size.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mhp::views::__detail::range_size< R > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/views/enumerate.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1range__size_3_01R_01_4-members.html b/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1range__size_3_01R_01_4-members.html new file mode 100644 index 0000000000..4e61845d2e --- /dev/null +++ b/doxygen/structdr_1_1mhp_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::mhp::views::__detail::range_size< R > Member List
    +
    +
    + +

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

    + + +
    type typedef (defined in dr::mhp::views::__detail::range_size< R >)dr::mhp::views::__detail::range_size< R >
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1range__size_3_01R_01_4.html b/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1range__size_3_01R_01_4.html new file mode 100644 index 0000000000..fff448aced --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1range__size_3_01R_01_4.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::mhp::views::__detail::range_size< R > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/views/enumerate.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1sliding__fn-members.html b/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1sliding__fn-members.html new file mode 100644 index 0000000000..726c6b6f17 --- /dev/null +++ b/doxygen/structdr_1_1mhp_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::mhp::views::__detail::sliding_fn Member List
    +
    +
    + +

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

    + + +
    operator()(Rng &&r, Int n) const (defined in dr::mhp::views::__detail::sliding_fn)dr::mhp::views::__detail::sliding_fninline
    + + + + diff --git a/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1sliding__fn.html b/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1sliding__fn.html new file mode 100644 index 0000000000..6f8e7d21ff --- /dev/null +++ b/doxygen/structdr_1_1mhp_1_1views_1_1____detail_1_1sliding__fn.html @@ -0,0 +1,100 @@ + + + + + + + +Distributed Ranges: dr::mhp::views::__detail::sliding_fn Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::mhp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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..0d09cd3d74 --- /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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/detail/ranges.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1shp_1_1____detail_1_1tuple__or__pair-members.html b/doxygen/structdr_1_1shp_1_1____detail_1_1tuple__or__pair-members.html new file mode 100644 index 0000000000..b7782a688d --- /dev/null +++ b/doxygen/structdr_1_1shp_1_1____detail_1_1tuple__or__pair-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::shp::__detail::tuple_or_pair< Args > Member List
    +
    +
    + +

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

    + + +
    type typedef (defined in dr::shp::__detail::tuple_or_pair< Args >)dr::shp::__detail::tuple_or_pair< Args >
    + + + + diff --git a/doxygen/structdr_1_1shp_1_1____detail_1_1tuple__or__pair.html b/doxygen/structdr_1_1shp_1_1____detail_1_1tuple__or__pair.html new file mode 100644 index 0000000000..e44ef05d19 --- /dev/null +++ b/doxygen/structdr_1_1shp_1_1____detail_1_1tuple__or__pair.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::shp::__detail::tuple_or_pair< Args > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::shp::__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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/zip_view.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1shp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4-members.html b/doxygen/structdr_1_1shp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4-members.html new file mode 100644 index 0000000000..ae9ad722a7 --- /dev/null +++ b/doxygen/structdr_1_1shp_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::shp::__detail::tuple_or_pair< T, U > Member List
    +
    +
    + +

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

    + + +
    type typedef (defined in dr::shp::__detail::tuple_or_pair< T, U >)dr::shp::__detail::tuple_or_pair< T, U >
    + + + + diff --git a/doxygen/structdr_1_1shp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4.html b/doxygen/structdr_1_1shp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4.html new file mode 100644 index 0000000000..1a86b47a43 --- /dev/null +++ b/doxygen/structdr_1_1shp_1_1____detail_1_1tuple__or__pair_3_01T_00_01U_01_4.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::shp::__detail::tuple_or_pair< T, U > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::shp::__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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/zip_view.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1shp_1_1device__allocator_1_1rebind-members.html b/doxygen/structdr_1_1shp_1_1device__allocator_1_1rebind-members.html new file mode 100644 index 0000000000..4374dcf00f --- /dev/null +++ b/doxygen/structdr_1_1shp_1_1device__allocator_1_1rebind-members.html @@ -0,0 +1,89 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::shp::device_allocator< T, Alignment >::rebind< U > Member List
    +
    +
    + +

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

    + + +
    other typedef (defined in dr::shp::device_allocator< T, Alignment >::rebind< U >)dr::shp::device_allocator< T, Alignment >::rebind< U >
    + + + + diff --git a/doxygen/structdr_1_1shp_1_1device__allocator_1_1rebind.html b/doxygen/structdr_1_1shp_1_1device__allocator_1_1rebind.html new file mode 100644 index 0000000000..488ac4e40b --- /dev/null +++ b/doxygen/structdr_1_1shp_1_1device__allocator_1_1rebind.html @@ -0,0 +1,98 @@ + + + + + + + +Distributed Ranges: dr::shp::device_allocator< T, Alignment >::rebind< U > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::shp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/allocators.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1shp_1_1device__policy-members.html b/doxygen/structdr_1_1shp_1_1device__policy-members.html new file mode 100644 index 0000000000..a716f6db3b --- /dev/null +++ b/doxygen/structdr_1_1shp_1_1device__policy-members.html @@ -0,0 +1,94 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::shp::device_policy Member List
    +
    +
    + +

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

    + + + + + + + +
    device_policy(sycl::device device) (defined in dr::shp::device_policy)dr::shp::device_policyinline
    device_policy(sycl::queue queue) (defined in dr::shp::device_policy)dr::shp::device_policyinline
    device_policy() (defined in dr::shp::device_policy)dr::shp::device_policyinline
    device_policy(R &&devices) (defined in dr::shp::device_policy)dr::shp::device_policyinline
    get_devices() noexcept (defined in dr::shp::device_policy)dr::shp::device_policyinline
    get_devices() const noexcept (defined in dr::shp::device_policy)dr::shp::device_policyinline
    + + + + diff --git a/doxygen/structdr_1_1shp_1_1device__policy.html b/doxygen/structdr_1_1shp_1_1device__policy.html new file mode 100644 index 0000000000..1c8c826964 --- /dev/null +++ b/doxygen/structdr_1_1shp_1_1device__policy.html @@ -0,0 +1,112 @@ + + + + + + + +Distributed Ranges: dr::shp::device_policy Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    dr::shp::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:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/algorithms/execution_policy.hpp
    • +
    +
    + + + + diff --git a/doxygen/structdr_1_1shp_1_1distributed__vector-members.html b/doxygen/structdr_1_1shp_1_1distributed__vector-members.html new file mode 100644 index 0000000000..3fd2cbe2e7 --- /dev/null +++ b/doxygen/structdr_1_1shp_1_1distributed__vector-members.html @@ -0,0 +1,112 @@ + + + + + + + +Distributed Ranges: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    dr::shp::distributed_vector< T, Allocator > Member List
    +
    +
    + +

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

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

    distributed vector + More...

    + +

    #include <distributed_vector.hpp>

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

    +Public Types

    +using segment_type = dr::shp::device_vector< T, Allocator >
     
    +using const_segment_type = std::add_const_t< dr::shp::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
     
    +

    Detailed Description

    +
    template<typename T, typename Allocator = dr::shp::device_allocator<T>>
    +struct dr::shp::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..a57ebef9e1 --- /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:
      +
    • /home/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..eff1b189e2 --- /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:
      +
    • /home/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..fbd5e3983b 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..fbd5e3983b 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..1c9359f5f6 --- /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:
      +
    • /home/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..66e7a4c7ac --- /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:
      +
    • /home/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..5d8b096d97 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..5d8b096d97 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_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html new file mode 100644 index 0000000000..71a6be117a --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: std::tuple_element< Index, dr::shp::matrix_entry< T, I > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    std::tuple_element< Index, dr::shp::matrix_entry< T, I > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for std::tuple_element< Index, dr::shp::matrix_entry< T, I > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for std::tuple_element< Index, dr::shp::matrix_entry< T, I > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/containers/matrix_entry.hpp
    • +
    +
    + + + + diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..d56bb7d0bf --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_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_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..40147c9970 --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +5701f37accae207f88946bde46263ba3 \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..cee460d363 Binary files /dev/null and b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_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_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..d56bb7d0bf --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_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_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..40147c9970 --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +5701f37accae207f88946bde46263ba3 \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..cee460d363 Binary files /dev/null and b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html new file mode 100644 index 0000000000..d6270c528f --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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::shp::matrix_ref< T, I, TRef > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    std::tuple_element< Index, dr::shp::matrix_ref< T, I, TRef > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for std::tuple_element< Index, dr::shp::matrix_ref< T, I, TRef > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for std::tuple_element< Index, dr::shp::matrix_ref< T, I, TRef > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/containers/matrix_entry.hpp
    • +
    +
    + + + + diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..6aed0a3378 --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..32db4750e8 --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +a2f45b7841bd88a67f588f8264876d7e \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..9e11a8a2c3 Binary files /dev/null and b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..6aed0a3378 --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..32db4750e8 --- /dev/null +++ b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +a2f45b7841bd88a67f588f8264876d7e \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..9e11a8a2c3 Binary files /dev/null and b/doxygen/structstd_1_1tuple__element_3_01Index_00_01dr_1_1shp_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..d63469645a --- /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:
      +
    • /home/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..d3759c930c 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..d3759c930c 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_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html new file mode 100644 index 0000000000..0d119bc6f1 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: std::tuple_size< dr::shp::matrix_entry< T, I > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    std::tuple_size< dr::shp::matrix_entry< T, I > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for std::tuple_size< dr::shp::matrix_entry< T, I > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for std::tuple_size< dr::shp::matrix_entry< T, I > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/containers/matrix_entry.hpp
    • +
    +
    + + + + diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.map b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..8d573714b9 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_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_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.md5 b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..b9a1bf1a11 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +de620959004563cfe17bab14179e0e38 \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.png b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..16051b41b4 Binary files /dev/null and b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_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_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.map b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..8d573714b9 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_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_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.md5 b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..b9a1bf1a11 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +de620959004563cfe17bab14179e0e38 \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.png b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__entry_3_01T_00_01I_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..16051b41b4 Binary files /dev/null and b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html new file mode 100644 index 0000000000..bbab34346b --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4.html @@ -0,0 +1,106 @@ + + + + + + + +Distributed Ranges: std::tuple_size< dr::shp::matrix_ref< T, I, TRef > > Struct Template Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Distributed Ranges +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    std::tuple_size< dr::shp::matrix_ref< T, I, TRef > > Struct Template Reference
    +
    +
    +
    +Inheritance diagram for std::tuple_size< dr::shp::matrix_ref< T, I, TRef > >:
    +
    +
    Inheritance graph
    + + + + +
    [legend]
    +
    +Collaboration diagram for std::tuple_size< dr::shp::matrix_ref< T, I, TRef > >:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/containers/matrix_entry.hpp
    • +
    +
    + + + + diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.map new file mode 100644 index 0000000000..63100b6553 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_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_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.md5 new file mode 100644 index 0000000000..259a873e99 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.md5 @@ -0,0 +1 @@ +641b22c5a6768ef2f8dd0fefcb68035b \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__coll__graph.png new file mode 100644 index 0000000000..a82d870189 Binary files /dev/null and b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_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_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.map new file mode 100644 index 0000000000..63100b6553 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_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_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.md5 new file mode 100644 index 0000000000..259a873e99 --- /dev/null +++ b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.md5 @@ -0,0 +1 @@ +641b22c5a6768ef2f8dd0fefcb68035b \ No newline at end of file diff --git a/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_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_1shp_1_1matrix__ref_3_01T_00_01I_00_01TRef_01_4_01_4__inherit__graph.png new file mode 100644 index 0000000000..a82d870189 Binary files /dev/null and b/doxygen/structstd_1_1tuple__size_3_01dr_1_1shp_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..c65cc8a647 --- /dev/null +++ b/doxygen/submdspan__view_8hpp_source.html @@ -0,0 +1,256 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/views/mdspan_view.hpp>
    +
    10
    +
    11namespace dr::mhp::__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::mhp::__detail
    +
    61
    +
    62namespace dr::mhp {
    +
    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::mhp
    +
    125
    +
    126namespace dr::mhp::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::mhp::views
    +
    Definition: mdspan_utils.hpp:45
    +
    Definition: submdspan_view.hpp:18
    +
    Definition: submdspan_view.hpp:128
    +
    Definition: submdspan_view.hpp:147
    +
    Definition: mdspan_view.hpp:197
    +
    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..a64359eb27 --- /dev/null +++ b/doxygen/subrange_8hpp_source.html @@ -0,0 +1,289 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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::mhp {
    +
    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 arithmetics 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::mhp
    +
    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..c9fed2ae57 --- /dev/null +++ b/doxygen/sycl__support_8hpp_source.html @@ -0,0 +1,160 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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#ifdef SYCL_LANGUAGE_VERSION
    +
    8
    +
    9namespace dr::mhp {
    +
    10
    +
    11sycl::queue &sycl_queue();
    +
    12
    +
    13} // namespace dr::mhp
    +
    14
    +
    15namespace dr::mhp::__detail {
    +
    16
    +
    17template <typename T> T sycl_get(T &v) {
    +
    18 T temp;
    +
    19 sycl_queue().memcpy(&temp, &v, sizeof(v)).wait();
    +
    20 return temp;
    +
    21}
    +
    22
    +
    23template <typename T> void sycl_copy(T *begin, T *end, T *dst) {
    +
    24 sycl_queue().memcpy(dst, begin, (end - begin) * sizeof(T)).wait();
    +
    25}
    +
    26
    +
    27template <typename T, std::size_t Alignment>
    +
    28using shared_base_allocator =
    +
    29 sycl::usm_allocator<T, sycl::usm::alloc::shared, Alignment>;
    +
    30
    +
    31}; // namespace dr::mhp::__detail
    +
    32
    +
    33namespace dr::mhp {
    +
    34
    +
    35template <typename T, std::size_t Alignment = 0>
    +
    36class sycl_shared_allocator
    +
    37 : public __detail::shared_base_allocator<T, Alignment> {
    +
    38public:
    +
    39 sycl_shared_allocator(sycl::queue q = sycl_queue())
    +
    40 : __detail::shared_base_allocator<T, Alignment>(q) {}
    +
    41};
    +
    42
    +
    43struct device_policy {
    +
    44 device_policy(sycl::queue q = sycl_queue()) : queue(q), dpl_policy(q) {}
    +
    45
    +
    46 sycl::queue queue;
    +
    47 decltype(oneapi::dpl::execution::make_device_policy(queue)) dpl_policy;
    +
    48};
    +
    49
    +
    50} // namespace dr::mhp
    +
    51
    +
    52#else // !SYCL_LANGUAGE_VERSION
    +
    53
    +
    54namespace dr::mhp {
    +
    55
    +
    56struct device_policy {};
    +
    57
    +
    58} // namespace dr::mhp
    +
    59
    +
    60namespace dr::mhp::__detail {
    +
    61
    +
    62// define here to avoid ifdefs where it is called
    +
    63template <typename T> T sycl_get(T &v) {
    +
    64 assert(false);
    +
    65 return v;
    +
    66}
    +
    67
    +
    68template <typename T> void sycl_copy(T *begin, T *end, T *dst) {
    +
    69 assert(false);
    +
    70}
    +
    71
    +
    72} // namespace dr::mhp::__detail
    +
    73
    +
    74#endif // SYCL_LANGUAGE_VERSION
    +
    Definition: sycl_support.hpp:56
    +
    + + + + diff --git a/doxygen/sycl__utils_8hpp_source.html b/doxygen/sycl__utils_8hpp_source.html new file mode 100644 index 0000000000..939b617520 --- /dev/null +++ b/doxygen/sycl__utils_8hpp_source.html @@ -0,0 +1,222 @@ + + + + + + + +Distributed Ranges: /home/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//
    +
    18// return true if the device can be partitioned by affinity domain
    +
    19//
    +
    20inline auto partitionable(sycl::device device) {
    +
    21 // Earlier commits used the query API, but they return true even
    +
    22 // though a partition will fail: Intel MPI mpirun with multiple
    +
    23 // processes.
    +
    24 try {
    +
    25 device.create_sub_devices<
    +
    26 sycl::info::partition_property::partition_by_affinity_domain>(
    +
    27 sycl::info::partition_affinity_domain::numa);
    +
    28 } catch (sycl::exception const &e) {
    +
    29 if (e.code() == sycl::errc::invalid ||
    +
    30 e.code() == sycl::errc::feature_not_supported) {
    +
    31 return false;
    +
    32 } else {
    +
    33 throw;
    +
    34 }
    +
    35 }
    +
    36
    +
    37 return true;
    +
    38}
    +
    39
    +
    40// Convert a global range to a nd_range using generic block size level
    +
    41// gpu requires uniform size workgroup, so round up to a multiple of a
    +
    42// workgroup.
    +
    43template <int Dim> auto nd_range(sycl::range<Dim> global) {
    +
    44 if constexpr (Dim == 1) {
    +
    45 sycl::range local(128);
    +
    46 return sycl::nd_range<Dim>(sycl::range(round_up(global[0], local[0])),
    +
    47 local);
    +
    48 } else if constexpr (Dim == 2) {
    +
    49 sycl::range local(16, 16);
    +
    50 return sycl::nd_range<Dim>(sycl::range(round_up(global[0], local[0]),
    +
    51 round_up(global[1], local[1])),
    +
    52 local);
    +
    53 } else if constexpr (Dim == 3) {
    +
    54 sycl::range local(8, 8, 8);
    +
    55 return sycl::nd_range<Dim>(sycl::range(round_up(global[0], local[0]),
    +
    56 round_up(global[1], local[1]),
    +
    57 round_up(global[2], local[2])),
    +
    58 local);
    +
    59 } else {
    +
    60 assert(false);
    +
    61 return sycl::range(0);
    +
    62 }
    +
    63}
    +
    64
    +
    65template <typename Fn>
    +
    66sycl::event parallel_for_nd(sycl::queue &q, sycl::range<1> global, Fn &&fn) {
    +
    67 return q.parallel_for(nd_range(global), [=](auto nd_idx) {
    +
    68 auto idx0 = nd_idx.get_global_id(0);
    +
    69 if (idx0 < global[0]) {
    +
    70 fn(idx0);
    +
    71 }
    +
    72 });
    +
    73}
    +
    74
    +
    75template <typename Fn>
    +
    76sycl::event parallel_for_nd(sycl::queue &q, sycl::range<2> global, Fn &&fn) {
    +
    77 return q.parallel_for(nd_range(global), [=](auto nd_idx) {
    +
    78 auto idx0 = nd_idx.get_global_id(0);
    +
    79 auto idx1 = nd_idx.get_global_id(1);
    +
    80 if (idx0 < global[0] && idx1 < global[1]) {
    +
    81 fn(std::array{idx0, idx1});
    +
    82 }
    +
    83 });
    +
    84}
    +
    85
    +
    86template <typename Fn>
    +
    87sycl::event parallel_for_nd(sycl::queue &q, sycl::range<3> global, Fn &&fn) {
    +
    88 return q.parallel_for(nd_range(global), [=](auto nd_idx) {
    +
    89 auto idx0 = nd_idx.get_global_id(0);
    +
    90 auto idx1 = nd_idx.get_global_id(1);
    +
    91 auto idx2 = nd_idx.get_global_id(2);
    +
    92 if (idx0 < global[0] && idx1 < global[1] && idx2 < global[2]) {
    +
    93 fn(std::array{idx0, idx1, idx2});
    +
    94 }
    +
    95 });
    +
    96}
    +
    97
    +
    98auto combine_events(sycl::queue &q, const auto &events) {
    +
    99 return q.submit([&](auto &&h) {
    +
    100 h.depends_on(events);
    +
    101 // Empty host task necessary due to [CMPLRLLVM-46542]
    +
    102 h.host_task([] {});
    +
    103 });
    +
    104}
    +
    105
    +
    106template <typename Fn>
    +
    107sycl::event parallel_for(sycl::queue &q, sycl::range<1> global, Fn &&fn) {
    +
    108 std::vector<sycl::event> events;
    +
    109
    +
    110 // Chunks are 32 bits
    +
    111 for (std::size_t remainder = global[0]; remainder != 0;) {
    +
    112 std::size_t chunk = std::min(
    +
    113 remainder, std::size_t(std::numeric_limits<std::int32_t>::max()));
    +
    114 events.push_back(parallel_for_nd(q, sycl::range<>(chunk), fn));
    +
    115 remainder -= chunk;
    +
    116 }
    +
    117
    +
    118 return combine_events(q, events);
    +
    119}
    +
    120
    +
    121template <typename Fn>
    +
    122sycl::event parallel_for(sycl::queue &q, sycl::range<2> global, Fn &&fn) {
    +
    123 auto max = std::numeric_limits<std::int32_t>::max();
    +
    124 assert(global[0] < max && global[1] < max);
    +
    125 return parallel_for_nd(q, global, fn);
    +
    126}
    +
    127
    +
    128template <typename Fn>
    +
    129sycl::event parallel_for(sycl::queue &q, sycl::range<3> global, Fn &&fn) {
    +
    130 auto max = std::numeric_limits<std::int32_t>::max();
    +
    131 assert(global[0] < max && global[1] < max && global[2] < max);
    +
    132 return parallel_for_nd(q, global, fn);
    +
    133}
    +
    134
    +
    135} // namespace dr::__detail
    +
    136
    +
    137#endif // SYCL_LANGUAGE_VERSION
    +
    + + + + 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/tuple__utils_8hpp_source.html b/doxygen/tuple__utils_8hpp_source.html new file mode 100644 index 0000000000..6e2ae22828 --- /dev/null +++ b/doxygen/tuple__utils_8hpp_source.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: /home/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..07c87be0ae --- /dev/null +++ b/doxygen/util_8hpp_source.html @@ -0,0 +1,332 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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 <sycl/sycl.hpp>
    +
    9
    +
    10namespace dr::shp {
    +
    11
    +
    12template <typename Selector> sycl::device select_device(Selector &&selector) {
    +
    13 sycl::device d;
    +
    14
    +
    15 try {
    +
    16 d = sycl::device(std::forward<Selector>(selector));
    +
    17 std::cout << "Running on device \""
    +
    18 << d.get_info<sycl::info::device::name>() << "\"" << std::endl;
    +
    19 } catch (sycl::exception const &e) {
    +
    20 std::cout << "Cannot select an accelerator\n" << e.what() << "\n";
    +
    21 std::cout << "Using a CPU device\n";
    +
    22 d = sycl::device(sycl::cpu_selector_v);
    +
    23 }
    +
    24 return d;
    +
    25}
    +
    26
    +
    27inline void list_devices() {
    +
    28 auto platforms = sycl::platform::get_platforms();
    +
    29
    +
    30 for (auto &platform : platforms) {
    +
    31 std::cout << "Platform: " << platform.get_info<sycl::info::platform::name>()
    +
    32 << std::endl;
    +
    33
    +
    34 auto devices = platform.get_devices();
    +
    35 for (auto &device : devices) {
    +
    36 std::cout << " Device: " << device.get_info<sycl::info::device::name>()
    +
    37 << std::endl;
    +
    38 }
    +
    39 }
    +
    40}
    +
    41
    +
    42inline void print_device_details(std::span<sycl::device> devices) {
    +
    43 std::size_t device_id = 0;
    +
    44 for (auto &&device : devices) {
    +
    45 std::cout << "Device " << device_id << ": "
    +
    46 << device.get_info<sycl::info::device::name>() << std::endl;
    +
    47 device_id++;
    +
    48 }
    +
    49}
    +
    50
    +
    51template <typename Selector> void list_devices(Selector &&selector) {
    +
    52 sycl::platform p(std::forward<Selector>(selector));
    +
    53 auto devices = p.get_devices();
    +
    54
    +
    55 printf("--Platform Info-----------------\n");
    +
    56
    +
    57 printf("Platform %s has %lu root devices.\n",
    +
    58 p.get_info<sycl::info::platform::name>().c_str(), devices.size());
    +
    59
    +
    60 for (std::size_t i = 0; i < devices.size(); i++) {
    +
    61 auto &&device = devices[i];
    +
    62
    +
    63 printf(" %lu %s\n", i,
    +
    64 device.get_info<sycl::info::device::name>().c_str());
    +
    65
    +
    66 auto subdevices = device.create_sub_devices<
    +
    67 sycl::info::partition_property::partition_by_affinity_domain>(
    +
    68 sycl::info::partition_affinity_domain::numa);
    +
    69
    +
    70 printf(" Subdevices:\n");
    +
    71 for (std::size_t j = 0; j < subdevices.size(); j++) {
    +
    72 auto &&subdevice = subdevices[j];
    +
    73 printf(" %lu.%lu %s\n", i, j,
    +
    74 subdevice.get_info<sycl::info::device::name>().c_str());
    +
    75 }
    +
    76 }
    +
    77
    +
    78 printf("--------------------------------\n");
    +
    79}
    +
    80
    +
    81inline std::vector<sycl::device>
    +
    82trim_devices(const std::vector<sycl::device> &devices, std::size_t n_devices) {
    +
    83 std::vector<sycl::device> trimmed_devices = devices;
    +
    84
    +
    85 if (n_devices < devices.size()) {
    +
    86 trimmed_devices.resize(n_devices);
    +
    87 }
    +
    88 return trimmed_devices;
    +
    89}
    +
    90
    +
    91template <typename Selector>
    +
    92std::vector<sycl::device> get_numa_devices_impl_(Selector &&selector) {
    +
    93 std::vector<sycl::device> devices;
    +
    94
    +
    95 sycl::platform p(std::forward<Selector>(selector));
    +
    96 auto root_devices = p.get_devices();
    +
    97
    +
    98 for (auto &&root_device : root_devices) {
    +
    99 auto subdevices = root_device.create_sub_devices<
    +
    100 sycl::info::partition_property::partition_by_affinity_domain>(
    +
    101 sycl::info::partition_affinity_domain::numa);
    +
    102
    +
    103 for (auto &&subdevice : subdevices) {
    +
    104 devices.push_back(subdevice);
    +
    105 }
    +
    106 }
    +
    107
    +
    108 return devices;
    +
    109}
    +
    110
    +
    111template <typename Selector>
    +
    112std::vector<sycl::device> get_devices(Selector &&selector) {
    +
    113 sycl::platform p(std::forward<Selector>(selector));
    +
    114 return p.get_devices();
    +
    115}
    +
    116
    +
    117template <typename Selector>
    +
    118std::vector<sycl::device> get_numa_devices(Selector &&selector) {
    +
    119 try {
    +
    120 return get_numa_devices_impl_(std::forward<Selector>(selector));
    +
    121 } catch (sycl::exception const &e) {
    +
    122 if (e.code() == sycl::errc::feature_not_supported) {
    +
    123 std::cerr << "NUMA partitioning not supported, returning root devices..."
    +
    124 << std::endl;
    +
    125 return get_devices(std::forward<Selector>(selector));
    +
    126 } else {
    +
    127 throw;
    +
    128 }
    +
    129 }
    +
    130}
    +
    131
    +
    132// Return exactly `n` devices obtained using the selector `selector`.
    +
    133// May duplicate devices
    +
    134template <typename Selector>
    +
    135std::vector<sycl::device> get_duplicated_devices(Selector &&selector,
    +
    136 std::size_t n) {
    +
    137 auto devices = get_numa_devices(std::forward<Selector>(selector));
    +
    138
    +
    139 if (devices.size() >= n) {
    +
    140 return std::vector<sycl::device>(devices.begin(), devices.begin() + n);
    +
    141 } else {
    +
    142 std::size_t i = 0;
    +
    143 while (devices.size() < n) {
    +
    144 auto d = devices[i++];
    +
    145 devices.push_back(d);
    +
    146 }
    +
    147 return devices;
    +
    148 }
    +
    149}
    +
    150
    +
    151template <typename Range> void print_range(Range &&r, std::string label = "") {
    +
    152 std::size_t indent = 1;
    +
    153
    +
    154 if (label != "") {
    +
    155 std::cout << "\"" << label << "\": ";
    +
    156 indent += label.size() + 4;
    +
    157 }
    +
    158
    +
    159 std::string indent_whitespace(indent, ' ');
    +
    160
    +
    161 std::cout << "[";
    +
    162 std::size_t columns = 10;
    +
    163 std::size_t count = 1;
    +
    164 for (auto iter = r.begin(); iter != r.end(); ++iter) {
    +
    165 std::cout << static_cast<rng::range_value_t<Range>>(*iter);
    +
    166
    +
    167 auto next = iter;
    +
    168 ++next;
    +
    169 if (next != r.end()) {
    +
    170 std::cout << ", ";
    +
    171 if (count % columns == 0) {
    +
    172 std::cout << "\n" << indent_whitespace;
    +
    173 }
    +
    174 }
    +
    175 ++count;
    +
    176 }
    +
    177 std::cout << "]" << std::endl;
    +
    178}
    +
    179
    +
    180template <typename Matrix>
    +
    181void print_matrix(Matrix &&m, std::string label = "") {
    +
    182 std::cout << m.shape()[0] << " x " << m.shape()[1] << " matrix with "
    +
    183 << m.size() << " stored values";
    +
    184 if (label != "") {
    +
    185 std::cout << " \"" << label << "\"";
    +
    186 }
    +
    187 std::cout << std::endl;
    +
    188
    +
    189 for (auto &&tuple : m) {
    +
    190 auto &&[index, value] = tuple;
    +
    191 auto &&[i, j] = index;
    +
    192
    +
    193 std::cout << "(" << i << ", " << j << "): " << value << std::endl;
    +
    194 }
    +
    195}
    +
    196
    +
    197template <typename R> void print_range_details(R &&r, std::string label = "") {
    +
    198 if (label != "") {
    +
    199 std::cout << "\"" << label << "\" ";
    +
    200 }
    +
    201
    +
    202 std::cout << "distributed range with " << rng::size(dr::ranges::segments(r))
    +
    203 << " segments." << std::endl;
    +
    204
    +
    205 std::size_t idx = 0;
    +
    206 for (auto &&segment : dr::ranges::segments(r)) {
    +
    207 std::cout << "Seg " << idx++ << ", size " << segment.size() << " (rank "
    +
    208 << dr::ranges::rank(segment) << ")" << std::endl;
    +
    209 }
    +
    210}
    +
    211
    +
    212template <dr::distributed_range R>
    +
    213void range_details(R &&r, std::size_t width = 80) {
    +
    214 std::size_t size = rng::size(r);
    +
    215
    +
    216 for (auto &&[idx, segment] :
    +
    217 dr::__detail::enumerate(dr::ranges::segments(r))) {
    +
    218 std::size_t local_size = rng::size(segment);
    +
    219
    +
    220 double percent = double(local_size) / size;
    +
    221
    +
    222 std::size_t num_chars = percent * width;
    +
    223 num_chars = std::max(num_chars, std::size_t(3));
    +
    224
    +
    225 std::size_t whitespace = num_chars - 3;
    +
    226
    +
    227 std::size_t initial_whitespace = whitespace / 2;
    +
    228 std::size_t after_whitespace = whitespace - initial_whitespace;
    +
    229
    +
    230 std::cout << "[" << std::string(initial_whitespace, ' ')
    +
    231 << dr::ranges::rank(segment) << std::string(after_whitespace, ' ')
    +
    232 << "]";
    +
    233 }
    +
    234 std::cout << std::endl;
    +
    235}
    +
    236
    +
    237namespace __detail {
    +
    238
    +
    239template <typename T>
    +
    240concept sycl_device_selector = requires(T &t, const sycl::device &device) {
    +
    241 { t(device) } -> std::convertible_to<int>;
    +
    242};
    +
    243
    +
    244}
    +
    245
    +
    246} // namespace dr::shp
    + +
    + + + + diff --git a/doxygen/utils_8hpp_source.html b/doxygen/utils_8hpp_source.html new file mode 100644 index 0000000000..63b84de47a --- /dev/null +++ b/doxygen/utils_8hpp_source.html @@ -0,0 +1,115 @@ + + + + + + + +Distributed Ranges: /home/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..87c32204a0 --- /dev/null +++ b/doxygen/vector_8hpp_source.html @@ -0,0 +1,334 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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::shp {
    +
    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::shp
    +
    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..16c01c69a0 --- /dev/null +++ b/doxygen/view__detectors_8hpp_source.html @@ -0,0 +1,151 @@ + + + + + + + +Distributed Ranges: /home/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..cc0b8a7ad6 --- /dev/null +++ b/doxygen/views_2iota_8hpp_source.html @@ -0,0 +1,113 @@ + + + + + + + +Distributed Ranges: /home/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..4a0538f423 --- /dev/null +++ b/doxygen/views_2transform_8hpp_source.html @@ -0,0 +1,299 @@ + + + + + + + +Distributed Ranges: /home/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>
    +
    121class transform_view : public rng::view_interface<transform_view<V, F>> {
    +
    122public:
    +
    123 template <rng::viewable_range R>
    +
    124 transform_view(R &&r, F fn)
    +
    125 : base_(rng::views::all(std::forward<R>(r))), fn_(fn) {}
    +
    126
    +
    127 auto begin() const { return transform_iterator(rng::begin(base_), fn_); }
    +
    128
    +
    129 auto end() const { return transform_iterator(rng::end(base_), fn_); }
    +
    130
    +
    131 auto size() const
    +
    132 requires(rng::sized_range<V>)
    +
    133 {
    +
    134 return rng::size(base_);
    +
    135 }
    +
    136
    +
    137 auto segments() const
    + +
    139 {
    +
    140 auto fn = fn_;
    +
    141 return dr::ranges::segments(base_) |
    +
    142 rng::views::transform([fn]<typename T>(T &&segment) {
    +
    143 return transform_view<rng::views::all_t<decltype(segment)>, F>(
    +
    144 std::forward<T>(segment), fn);
    +
    145 });
    +
    146 }
    +
    147
    +
    148 auto rank() const
    +
    149 requires(dr::remote_range<V>)
    +
    150 {
    +
    151 return dr::ranges::rank(base_);
    +
    152 }
    +
    153
    +
    154 V base() const { return base_; }
    +
    155
    +
    156private:
    +
    157 V base_;
    +
    158 F fn_;
    +
    159};
    +
    160
    +
    161template <rng::viewable_range R, std::copy_constructible F>
    + +
    163
    +
    164namespace views {
    +
    165
    +
    166template <std::copy_constructible F> class transform_adapter_closure {
    +
    167public:
    +
    168 transform_adapter_closure(F fn) : fn_(fn) {}
    +
    169
    +
    170 template <rng::viewable_range R> auto operator()(R &&r) const {
    +
    171 return dr::transform_view(std::forward<R>(r), fn_);
    +
    172 }
    +
    173
    +
    174 template <rng::viewable_range R>
    +
    175 friend auto operator|(R &&r, const transform_adapter_closure &closure) {
    +
    176 return closure(std::forward<R>(r));
    +
    177 }
    +
    178
    +
    179private:
    +
    180 F fn_;
    +
    181};
    +
    182
    + +
    184public:
    +
    185 template <rng::viewable_range R, std::copy_constructible F>
    +
    186 auto operator()(R &&r, F &&f) const {
    +
    187 return transform_adapter_closure(std::forward<F>(f))(std::forward<R>(r));
    +
    188 }
    +
    189
    +
    190 template <std::copy_constructible F> auto operator()(F &&fn) const {
    +
    191 return transform_adapter_closure(std::forward<F>(fn));
    +
    192 }
    +
    193};
    +
    194
    +
    195inline constexpr auto transform = transform_fn_{};
    +
    196} // namespace views
    +
    197
    +
    198} // namespace dr
    +
    199
    +
    200#if !defined(DR_SPEC)
    +
    201
    +
    202// Needed to satisfy rng::viewable_range
    +
    203template <rng::random_access_range V, std::copy_constructible F>
    +
    204inline constexpr bool rng::enable_borrowed_range<dr::transform_view<V, F>> =
    +
    205 true;
    +
    206
    +
    207#endif
    +
    Definition: transform.hpp:17
    +
    Definition: transform.hpp:121
    +
    Definition: transform.hpp:166
    +
    Definition: transform.hpp:183
    +
    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..3147461e7d --- /dev/null +++ b/doxygen/views_2views_8hpp_source.html @@ -0,0 +1,104 @@ + + + + + + + +Distributed Ranges: /home/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..6dde4f3511 --- /dev/null +++ b/doxygen/zip_8hpp_source.html @@ -0,0 +1,366 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/mhp/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/mhp/alignment.hpp>
    +
    15#include <dr/mhp/views/segmented.hpp>
    +
    16
    +
    17namespace dr::mhp::__detail {
    +
    18
    +
    19template <typename R>
    +
    20concept zipable = rng::random_access_range<R> && rng::common_range<R>;
    +
    21
    +
    22} // namespace dr::mhp::__detail
    +
    23
    +
    24namespace dr::mhp {
    +
    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::mhp
    +
    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..4ad037ee43 --- /dev/null +++ b/doxygen/zip__view_8hpp_source.html @@ -0,0 +1,442 @@ + + + + + + + +Distributed Ranges: /home/runner/work/distributed-ranges/distributed-ranges/include/dr/shp/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/shp/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::shp {
    +
    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::shp::device_span(std::forward<T>(t));
    +
    262 } else {
    +
    263 return dr::shp::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::shp::zip_view(std::forward<Rs>(rs)...);
    +
    345}
    +
    346
    +
    347} // namespace views
    +
    348
    +
    349} // namespace dr::shp
    +
    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..94b325a39d --- /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: 237842a580050ea7318fec37e96a9a67 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/spec/_sources/algorithms/algorithms.rst b/spec/_sources/algorithms/algorithms.rst new file mode 100644 index 0000000000..e1b584196d --- /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 + + shp_matrix_gemm + shp_matrix_gemv diff --git a/spec/_sources/algorithms/copy.rst b/spec/_sources/algorithms/copy.rst new file mode 100644 index 0000000000..ee0ef8299d --- /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 +========= + +MHP +--- + +.. doxygenfunction:: dr::mhp::copy(rng::forward_range auto &&in, dr::distributed_iterator auto out) + :outline: +.. doxygenfunction:: dr::mhp::copy(DI_IN &&first, DI_IN &&last, dr::distributed_iterator auto &&out) + :outline: +.. doxygenfunction:: dr::mhp::copy(std::size_t root, dr::distributed_contiguous_range auto &&in, std::contiguous_iterator auto out) + :outline: +.. doxygenfunction:: dr::mhp::copy(std::size_t root, rng::contiguous_range auto &&in, dr::distributed_contiguous_iterator auto out) + :outline: + +SHP +--- + +.. doxygenfunction:: dr::shp::copy(InputIt first, InputIt last, OutputIt d_first) + :outline: +.. doxygenfunction:: dr::shp::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..2f5f7fd5d2 --- /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 +========= +MHP +--- + +SHP +--- + +.. doxygenfunction:: dr::shp::exclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o, T init, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::shp::exclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o, T init) + :outline: +.. doxygenfunction:: dr::shp::exclusive_scan(R &&r, O &&o, T init, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::shp::exclusive_scan(R &&r, O &&o, T init) + :outline: +.. doxygenfunction:: dr::shp::exclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last, OutputIter d_first, T init, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::shp::exclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last, OutputIter d_first, T init) + :outline: +.. doxygenfunction:: dr::shp::exclusive_scan(Iter first, Iter last, OutputIter d_first, T init, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::shp::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..7f5362bb54 --- /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 +========= + +MHP +--- + +.. doxygenfunction:: dr::mhp::fill(dr::distributed_contiguous_range auto &&dr, auto value); + :outline: +.. doxygenfunction:: dr::mhp::fill(DI first, DI last, auto value) + :outline: + +SHP +--- + +.. doxygenfunction:: dr::shp::fill_async(Iter first, Iter last, const std::iter_value_t &value) + :outline: +.. doxygenfunction:: dr::shp::fill(Iter first, Iter last, const std::iter_value_t &value) + :outline: +.. doxygenfunction:: dr::shp::fill_async(device_ptr first, device_ptr last, const U &value) + :outline: +.. doxygenfunction:: dr::shp::fill(device_ptr first, device_ptr last, const U &value) + :outline: +.. doxygenfunction:: dr::shp::fill_async(R &&r, const T &value) + :outline: +.. doxygenfunction:: dr::shp::fill(R &&r, const T &value) + :outline: +.. doxygenfunction:: dr::shp::fill_async(DR &&r, const T &value) + :outline: +.. doxygenfunction:: dr::shp::fill(DR &&r, const T &value) + :outline: +.. doxygenfunction:: dr::shp::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..4539c10df9 --- /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 +========= +MHP +--- +.. doxygenfunction:: dr::mhp::for_each(dr::distributed_range auto &&dr, auto op) + :outline: +.. doxygenfunction:: dr::mhp::for_each(DI first, DI last, auto op) + :outline: + +SHP +--- + +.. doxygenfunction:: dr::shp::for_each(ExecutionPolicy &&policy, R &&r, Fn &&fn) + :outline: +.. doxygenfunction:: dr::shp::for_each(ExecutionPolicy &&policy, Iter begin, Iter end, Fn &&fn) + :outline: +.. doxygenfunction:: dr::shp::for_each(R &&r, Fn &&fn) + :outline: +.. doxygenfunction:: dr::shp::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..8520cc759e --- /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 +========= + +MHP +--- + +SHP +--- + +.. doxygenfunction:: dr::shp::inclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o, BinaryOp &&binary_op, T init) + :outline: +.. doxygenfunction:: dr::shp::inclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::shp::inclusive_scan(ExecutionPolicy &&policy, R &&r, O &&o) + :outline: +.. doxygenfunction:: dr::shp::inclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last, OutputIter d_first, BinaryOp &&binary_op, T init) + :outline: +.. doxygenfunction:: dr::shp::inclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last, OutputIter d_first, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::shp::inclusive_scan(ExecutionPolicy &&policy, Iter first, Iter last, OutputIter d_first) + :outline: + +Execution policy-less versions + +.. doxygenfunction:: dr::shp::inclusive_scan(R &&r, O &&o) + :outline: +.. doxygenfunction:: dr::shp::inclusive_scan(R &&r, O &&o, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::shp::inclusive_scan(R &&r, O &&o, BinaryOp &&binary_op, T init) + :outline: + +Distributed iterator versions + +.. doxygenfunction:: dr::shp::inclusive_scan(Iter first, Iter last, OutputIter d_first) + :outline: +.. doxygenfunction:: dr::shp::inclusive_scan(Iter first, Iter last, OutputIter d_first, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::shp::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..cb1b4cae41 --- /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 +========= + +MHP +--- + +.. doxygenfunction:: dr::mhp::iota(R &&r, T value) + :outline: +.. doxygenfunction:: dr::mhp::iota(Iter begin, Iter end, T value) + :outline: + +SHP +--- + +.. doxygenfunction:: dr::shp::iota(R &&r, T value) + :outline: +.. doxygenfunction:: dr::shp::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..41df3f06d2 --- /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 +========= + +MHP +--- + +.. doxygenfunction:: dr::mhp::reduce(std::size_t root, DR &&dr, T init, auto &&binary_op) + :outline: +.. doxygenfunction:: dr::mhp::reduce(DR &&dr, T init, auto &&binary_op) + :outline: +.. doxygenfunction:: dr::mhp::reduce(std::size_t root, DR &&dr, T init) + :outline: +.. doxygenfunction:: dr::mhp::reduce(DR &&dr, T init) + :outline: +.. doxygenfunction:: dr::mhp::reduce(std::size_t root, DR &&dr) + :outline: +.. doxygenfunction:: dr::mhp::reduce(DR &&dr) + :outline: +.. doxygenfunction:: dr::mhp::reduce(std::size_t root, DI first, DI last, T init, auto &&binary_op) + :outline: +.. doxygenfunction:: dr::mhp::reduce(DI first, DI last, T init, auto &&binary_op) + :outline: +.. doxygenfunction:: dr::mhp::reduce(std::size_t root, DI first, DI last, T init) + :outline: +.. doxygenfunction:: dr::mhp::reduce(DI first, DI last, T init) + :outline: +.. doxygenfunction:: dr::mhp::reduce(std::size_t root, DI first, DI last) + :outline: +.. doxygenfunction:: dr::mhp::reduce(DI first, DI last) + :outline: + +SHP +--- + +.. doxygenfunction:: dr::shp::reduce(ExecutionPolicy &&policy, R &&r, T init, BinaryOp &&binary_op) + :outline: +.. doxygenfunction:: dr::shp::reduce(ExecutionPolicy &&policy, R &&r, T init) + :outline: +.. doxygenfunction:: dr::shp::reduce(ExecutionPolicy &&policy, R &&r) + :outline: + +Iterator versions + +.. doxygenfunction:: dr::shp::reduce(ExecutionPolicy &&policy, Iter first, Iter last) + :outline: +.. doxygenfunction:: dr::shp::reduce(ExecutionPolicy &&policy, Iter first, Iter last, T init) + :outline: +.. doxygenfunction:: dr::shp::reduce(ExecutionPolicy &&policy, Iter first, Iter last, T init, BinaryOp &&binary_op) + :outline: + +Execution policy-less algorithms + +.. doxygenfunction:: dr::shp::reduce(R &&r) + :outline: +.. doxygenfunction:: dr::shp::reduce(R &&r, T init) + :outline: +.. doxygenfunction:: dr::shp::reduce(R &&r, T init, BinaryOp &&binary_op) + :outline: + +Description +=========== + +.. seealso:: `std::reduce`_ + +Examples +======== diff --git a/spec/_sources/algorithms/shp_matrix_gemm.rst b/spec/_sources/algorithms/shp_matrix_gemm.rst new file mode 100644 index 0000000000..4db975ca71 --- /dev/null +++ b/spec/_sources/algorithms/shp_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::shp::gemm(distributed_dense_matrix &a, distributed_dense_matrix &b, distributed_dense_matrix &c) + +Description +=========== + + +Examples +======== diff --git a/spec/_sources/algorithms/shp_matrix_gemv.rst b/spec/_sources/algorithms/shp_matrix_gemv.rst new file mode 100644 index 0000000000..aa8bba7eba --- /dev/null +++ b/spec/_sources/algorithms/shp_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::shp::flat_gemv(C &&c, dr::shp::sparse_matrix &a, B &&b) +.. doxygenfunction:: dr::shp::gemv(C &&c, dr::shp::sparse_matrix &a, B &&b, shp::duplicated_vector> &scratch) +.. doxygenfunction:: dr::shp::gemv(C &&c, dr::shp::sparse_matrix &a, B &&b) +.. doxygenfunction:: dr::shp::gemv_square(C &&c, dr::shp::sparse_matrix &a, B &&b) +.. doxygenfunction:: dr::shp::gemv_square_copy(C &&c, dr::shp::sparse_matrix &a, B &&b) + +Description +=========== + + +Examples +======== diff --git a/spec/_sources/algorithms/sort.rst b/spec/_sources/algorithms/sort.rst new file mode 100644 index 0000000000..699c1d73c3 --- /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 +========= + +MHP +--- + +SHP +--- + +.. doxygenfunction:: dr::shp::sort(R &&r, Compare comp = Compare()) + :outline: +.. doxygenfunction:: dr::shp::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/transform.rst b/spec/_sources/algorithms/transform.rst new file mode 100644 index 0000000000..c02a18481e --- /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 +========= + +MHP +--- + +.. doxygenfunction:: dr::mhp::transform(rng::forward_range auto &&in, dr::distributed_iterator auto out, auto op) +.. doxygenfunction:: dr::mhp::transform(DI_IN &&first, DI_IN &&last, dr::distributed_iterator auto &&out, auto op) + +SHP +--- + +.. doxygenfunction:: dr::shp::transform(ExecutionPolicy &&policy, dr::distributed_range auto &&in, dr::distributed_iterator auto out, auto &&fn) +.. doxygenfunction:: dr::shp::transform(R &&in, Iter out, Fn &&fn) +.. doxygenfunction:: dr::shp::transform(ExecutionPolicy &&policy, Iter1 in_begin, Iter1 in_end, Iter2 out_end, Fn &&fn) +.. doxygenfunction:: dr::shp::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..cad22a6423 --- /dev/null +++ b/spec/_sources/arch.rst @@ -0,0 +1,7 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +============== + Architecture +============== 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..81d9f50600 --- /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 + + mhp_distributed_vector + mhp_distributed_dense_matrix + + shp_distributed_vector + shp_dense_matrix + shp_sparse_matrix diff --git a/spec/_sources/containers/mhp_distributed_dense_matrix.rst b/spec/_sources/containers/mhp_distributed_dense_matrix.rst new file mode 100644 index 0000000000..a916587aa7 --- /dev/null +++ b/spec/_sources/containers/mhp_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::mhp::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/mhp_distributed_vector.rst b/spec/_sources/containers/mhp_distributed_vector.rst new file mode 100644 index 0000000000..05f3db016e --- /dev/null +++ b/spec/_sources/containers/mhp_distributed_vector.rst @@ -0,0 +1,27 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _mhp_distributed_vector: + +=============================== +``dr::mhp::distributed_vector`` +=============================== + +Interface +========= + +.. doxygenclass:: dr::mhp::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/shp_dense_matrix.rst b/spec/_sources/containers/shp_dense_matrix.rst new file mode 100644 index 0000000000..7c49c94472 --- /dev/null +++ b/spec/_sources/containers/shp_dense_matrix.rst @@ -0,0 +1,20 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _shp_dense_matrix: + +=============================== +``dr::shp::dense_matrix`` +=============================== + +Interface +========= + +.. doxygenclass:: dr::shp::dense_matrix + :members: + +Description +=========== diff --git a/spec/_sources/containers/shp_distributed_vector.rst b/spec/_sources/containers/shp_distributed_vector.rst new file mode 100644 index 0000000000..9a5fb3be33 --- /dev/null +++ b/spec/_sources/containers/shp_distributed_vector.rst @@ -0,0 +1,24 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _shp_distributed_vector: + +=============================== +``dr::shp::distributed_vector`` +=============================== + +Interface +========= + +.. doxygenstruct:: dr::shp::distributed_vector + :members: + +Description +=========== + +.. seealso:: + + `std::vector`_ diff --git a/spec/_sources/containers/shp_sparse_matrix.rst b/spec/_sources/containers/shp_sparse_matrix.rst new file mode 100644 index 0000000000..1f7466ad31 --- /dev/null +++ b/spec/_sources/containers/shp_sparse_matrix.rst @@ -0,0 +1,20 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +.. include:: ../include/distributed-ranges.rst + +.. _shp_sparse_matrix: + +=============================== +``dr::shp::sparse_matrix`` +=============================== + +Interface +========= + +.. doxygenclass:: dr::shp::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..d305771c88 --- /dev/null +++ b/spec/_sources/intro.rst @@ -0,0 +1,7 @@ +.. SPDX-FileCopyrightText: Intel Corporation +.. +.. SPDX-License-Identifier: BSD-3-Clause + +============== + Introduction +============== diff --git a/spec/_sources/views/all_view.rst b/spec/_sources/views/all_view.rst new file mode 100644 index 0000000000..d4dc3db4d8 --- /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::mhp::views::all + dr::shp::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..435af0281b --- /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::mhp::views::counted + dr::shp::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..af1b1b1d7f --- /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::mhp::views::drop + dr::shp::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..25775651d3 --- /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::mhp::views::all + dr::shp::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..316023640d --- /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::mhp::views::sliding + dr::shp::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..942931c6da --- /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::mhp::views::take + dr::shp::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..f3c9a948ea --- /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::mhp::views::transform + dr::shp::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..d24c0eae47 --- /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 +========= + +MHP +--- + +.. doxygenclass:: dr::mhp::zip_view + :members: +.. doxygenfunction:: dr::mhp::views::zip + :outline: + +SHP +--- + +.. doxygenclass:: dr::shp::zip_view + :members: +.. doxygenfunction:: dr::shp::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..61572969d1 --- /dev/null +++ b/spec/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 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; +} + +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; +} + +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; +} + +/* -- 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..d06a71d751 --- /dev/null +++ b/spec/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 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..03c0d01dcb --- /dev/null +++ b/spec/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + 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..250f5665fa --- /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-2023 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, is 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..2e8d682024 --- /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 "suggest edit" +msgstr "أقترح تحرير" + +msgid "Last updated on" +msgstr "آخر تحديث في" + +msgid "Edit this page" +msgstr "قم بتحرير هذه الصفحة" + +msgid "Launch" +msgstr "إطلاق" + +msgid "Print to PDF" +msgstr "طباعة إلى PDF" + +msgid "open issue" +msgstr "قضية مفتوحة" + +msgid "Download notebook file" +msgstr "تنزيل ملف دفتر الملاحظات" + +msgid "Toggle navigation" +msgstr "تبديل التنقل" + +msgid "Source repository" +msgstr "مستودع المصدر" + +msgid "By the" +msgstr "بواسطة" + +msgid "next page" +msgstr "الصفحة التالية" + +msgid "repository" +msgstr "مخزن" + +msgid "Sphinx Book Theme" +msgstr "موضوع كتاب أبو الهول" + +msgid "Download source file" +msgstr "تنزيل ملف المصدر" + +msgid "Contents" +msgstr "محتويات" + +msgid "By" +msgstr "بواسطة" + +msgid "Copyright" +msgstr "حقوق النشر" + +msgid "Fullscreen mode" +msgstr "وضع ملء الشاشة" + +msgid "Open an issue" +msgstr "افتح قضية" + +msgid "previous page" +msgstr "الصفحة السابقة" + +msgid "Download this page" +msgstr "قم بتنزيل هذه الصفحة" + +msgid "Theme by the" +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..56ef0ebdfa --- /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 "suggest edit" +msgstr "предложи редактиране" + +msgid "Last updated on" +msgstr "Последна актуализация на" + +msgid "Edit this page" +msgstr "Редактирайте тази страница" + +msgid "Launch" +msgstr "Стартиране" + +msgid "Print to PDF" +msgstr "Печат в PDF" + +msgid "open issue" +msgstr "отворен брой" + +msgid "Download notebook file" +msgstr "Изтеглете файла на бележника" + +msgid "Toggle navigation" +msgstr "Превключване на навигацията" + +msgid "Source repository" +msgstr "Хранилище на източника" + +msgid "By the" +msgstr "По" + +msgid "next page" +msgstr "Следваща страница" + +msgid "repository" +msgstr "хранилище" + +msgid "Sphinx Book Theme" +msgstr "Тема на книгата Sphinx" + +msgid "Download source file" +msgstr "Изтеглете изходния файл" + +msgid "Contents" +msgstr "Съдържание" + +msgid "By" +msgstr "От" + +msgid "Copyright" +msgstr "Авторско право" + +msgid "Fullscreen mode" +msgstr "Режим на цял екран" + +msgid "Open an issue" +msgstr "Отворете проблем" + +msgid "previous page" +msgstr "предишна страница" + +msgid "Download this page" +msgstr "Изтеглете тази страница" + +msgid "Theme by the" +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..243ca31f73 --- /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 "Last updated on" +msgstr "সর্বশেষ আপডেট" + +msgid "Edit this page" +msgstr "এই পৃষ্ঠাটি সম্পাদনা করুন" + +msgid "Launch" +msgstr "শুরু করা" + +msgid "Print to PDF" +msgstr "পিডিএফ প্রিন্ট করুন" + +msgid "open issue" +msgstr "খোলা সমস্যা" + +msgid "Download notebook file" +msgstr "নোটবুক ফাইল ডাউনলোড করুন" + +msgid "Toggle navigation" +msgstr "নেভিগেশন টগল করুন" + +msgid "Source repository" +msgstr "উত্স সংগ্রহস্থল" + +msgid "By the" +msgstr "দ্বারা" + +msgid "next page" +msgstr "পরবর্তী পৃষ্ঠা" + +msgid "Sphinx Book Theme" +msgstr "স্পিনিক্স বুক থিম" + +msgid "Download source file" +msgstr "উত্স ফাইল ডাউনলোড করুন" + +msgid "By" +msgstr "দ্বারা" + +msgid "Copyright" +msgstr "কপিরাইট" + +msgid "Open an issue" +msgstr "একটি সমস্যা খুলুন" + +msgid "previous page" +msgstr "আগের পৃষ্ঠা" + +msgid "Download this page" +msgstr "এই পৃষ্ঠাটি ডাউনলোড করুন" + +msgid "Theme by the" +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..b27a13db9c --- /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 "suggest edit" +msgstr "suggerir edició" + +msgid "Last updated on" +msgstr "Darrera actualització el" + +msgid "Edit this page" +msgstr "Editeu aquesta pàgina" + +msgid "Launch" +msgstr "Llançament" + +msgid "Print to PDF" +msgstr "Imprimeix a PDF" + +msgid "open issue" +msgstr "número obert" + +msgid "Download notebook file" +msgstr "Descarregar fitxer de quadern" + +msgid "Toggle navigation" +msgstr "Commuta la navegació" + +msgid "Source repository" +msgstr "Dipòsit de fonts" + +msgid "By the" +msgstr "Per la" + +msgid "next page" +msgstr "pàgina següent" + +msgid "Sphinx Book Theme" +msgstr "Tema del llibre Esfinx" + +msgid "Download source file" +msgstr "Baixeu el fitxer font" + +msgid "By" +msgstr "Per" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Open an issue" +msgstr "Obriu un número" + +msgid "previous page" +msgstr "Pàgina anterior" + +msgid "Download this page" +msgstr "Descarregueu aquesta pàgina" + +msgid "Theme by the" +msgstr "Tema del" 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..3818df9765 --- /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 "suggest edit" +msgstr "navrhnout úpravy" + +msgid "Last updated on" +msgstr "Naposledy aktualizováno" + +msgid "Edit this page" +msgstr "Upravit tuto stránku" + +msgid "Launch" +msgstr "Zahájení" + +msgid "Print to PDF" +msgstr "Tisk do PDF" + +msgid "open issue" +msgstr "otevřené číslo" + +msgid "Download notebook file" +msgstr "Stáhnout soubor poznámkového bloku" + +msgid "Toggle navigation" +msgstr "Přepnout navigaci" + +msgid "Source repository" +msgstr "Zdrojové úložiště" + +msgid "By the" +msgstr "Podle" + +msgid "next page" +msgstr "další strana" + +msgid "repository" +msgstr "úložiště" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "Download source file" +msgstr "Stáhněte si zdrojový soubor" + +msgid "Contents" +msgstr "Obsah" + +msgid "By" +msgstr "Podle" + +msgid "Copyright" +msgstr "autorská práva" + +msgid "Fullscreen mode" +msgstr "Režim celé obrazovky" + +msgid "Open an issue" +msgstr "Otevřete problém" + +msgid "previous page" +msgstr "předchozí stránka" + +msgid "Download this page" +msgstr "Stáhněte si tuto stránku" + +msgid "Theme by the" +msgstr "Téma od" 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..7f20a3bd09 --- /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 "suggest edit" +msgstr "foreslå redigering" + +msgid "Last updated on" +msgstr "Sidst opdateret den" + +msgid "Edit this page" +msgstr "Rediger denne side" + +msgid "Launch" +msgstr "Start" + +msgid "Print to PDF" +msgstr "Udskriv til PDF" + +msgid "open issue" +msgstr "åbent nummer" + +msgid "Download notebook file" +msgstr "Download notesbog-fil" + +msgid "Toggle navigation" +msgstr "Skift navigation" + +msgid "Source repository" +msgstr "Kildelager" + +msgid "By the" +msgstr "Ved" + +msgid "next page" +msgstr "Næste side" + +msgid "repository" +msgstr "lager" + +msgid "Sphinx Book Theme" +msgstr "Sphinx bogtema" + +msgid "Download source file" +msgstr "Download kildefil" + +msgid "Contents" +msgstr "Indhold" + +msgid "By" +msgstr "Ved" + +msgid "Copyright" +msgstr "ophavsret" + +msgid "Fullscreen mode" +msgstr "Fuldskærmstilstand" + +msgid "Open an issue" +msgstr "Åbn et problem" + +msgid "previous page" +msgstr "forrige side" + +msgid "Download this page" +msgstr "Download denne side" + +msgid "Theme by the" +msgstr "Tema af" 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..c0027d3ab0 --- /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 "suggest edit" +msgstr "vorschlagen zu bearbeiten" + +msgid "Last updated on" +msgstr "Zuletzt aktualisiert am" + +msgid "Edit this page" +msgstr "Bearbeite diese Seite" + +msgid "Launch" +msgstr "Starten" + +msgid "Print to PDF" +msgstr "In PDF drucken" + +msgid "open issue" +msgstr "offenes Thema" + +msgid "Download notebook file" +msgstr "Notebook-Datei herunterladen" + +msgid "Toggle navigation" +msgstr "Navigation umschalten" + +msgid "Source repository" +msgstr "Quell-Repository" + +msgid "By the" +msgstr "Bis zum" + +msgid "next page" +msgstr "Nächste Seite" + +msgid "repository" +msgstr "Repository" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-Buch-Thema" + +msgid "Download source file" +msgstr "Quelldatei herunterladen" + +msgid "Contents" +msgstr "Inhalt" + +msgid "By" +msgstr "Durch" + +msgid "Copyright" +msgstr "Urheberrechte ©" + +msgid "Fullscreen mode" +msgstr "Vollbildmodus" + +msgid "Open an issue" +msgstr "Öffnen Sie ein Problem" + +msgid "previous page" +msgstr "vorherige Seite" + +msgid "Download this page" +msgstr "Laden Sie diese Seite herunter" + +msgid "Theme by the" +msgstr "Thema von der" 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..bdeb3270aa --- /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 "suggest edit" +msgstr "προτείνω επεξεργασία" + +msgid "Last updated on" +msgstr "Τελευταία ενημέρωση στις" + +msgid "Edit this page" +msgstr "Επεξεργαστείτε αυτήν τη σελίδα" + +msgid "Launch" +msgstr "Εκτόξευση" + +msgid "Print to PDF" +msgstr "Εκτύπωση σε PDF" + +msgid "open issue" +msgstr "ανοιχτό ζήτημα" + +msgid "Download notebook file" +msgstr "Λήψη αρχείου σημειωματάριου" + +msgid "Toggle navigation" +msgstr "Εναλλαγή πλοήγησης" + +msgid "Source repository" +msgstr "Αποθήκη πηγής" + +msgid "By the" +msgstr "Από το" + +msgid "next page" +msgstr "επόμενη σελίδα" + +msgid "repository" +msgstr "αποθήκη" + +msgid "Sphinx Book Theme" +msgstr "Θέμα βιβλίου Sphinx" + +msgid "Download source file" +msgstr "Λήψη αρχείου προέλευσης" + +msgid "Contents" +msgstr "Περιεχόμενα" + +msgid "By" +msgstr "Με" + +msgid "Copyright" +msgstr "Πνευματική ιδιοκτησία" + +msgid "Fullscreen mode" +msgstr "ΛΕΙΤΟΥΡΓΙΑ ΠΛΗΡΟΥΣ ΟΘΟΝΗΣ" + +msgid "Open an issue" +msgstr "Ανοίξτε ένα ζήτημα" + +msgid "previous page" +msgstr "προηγούμενη σελίδα" + +msgid "Download this page" +msgstr "Λήψη αυτής της σελίδας" + +msgid "Theme by the" +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..6749f3a34a --- /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 "suggest edit" +msgstr "sugesti redaktadon" + +msgid "Last updated on" +msgstr "Laste ĝisdatigita la" + +msgid "Edit this page" +msgstr "Redaktu ĉi tiun paĝon" + +msgid "Launch" +msgstr "Lanĉo" + +msgid "Print to PDF" +msgstr "Presi al PDF" + +msgid "open issue" +msgstr "malferma numero" + +msgid "Download notebook file" +msgstr "Elŝutu kajeran dosieron" + +msgid "Toggle navigation" +msgstr "Ŝalti navigadon" + +msgid "Source repository" +msgstr "Fonto-deponejo" + +msgid "By the" +msgstr "Per la" + +msgid "next page" +msgstr "sekva paĝo" + +msgid "repository" +msgstr "deponejo" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa Libro-Temo" + +msgid "Download source file" +msgstr "Elŝutu fontodosieron" + +msgid "Contents" +msgstr "Enhavo" + +msgid "By" +msgstr "De" + +msgid "Copyright" +msgstr "Kopirajto" + +msgid "Fullscreen mode" +msgstr "Plenekrana reĝimo" + +msgid "Open an issue" +msgstr "Malfermu numeron" + +msgid "previous page" +msgstr "antaŭa paĝo" + +msgid "Download this page" +msgstr "Elŝutu ĉi tiun paĝon" + +msgid "Theme by the" +msgstr "Temo de la" 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..71dde37f27 --- /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 "suggest edit" +msgstr "sugerir editar" + +msgid "Last updated on" +msgstr "Ultima actualización en" + +msgid "Edit this page" +msgstr "Edita esta página" + +msgid "Launch" +msgstr "Lanzamiento" + +msgid "Print to PDF" +msgstr "Imprimir en PDF" + +msgid "open issue" +msgstr "Tema abierto" + +msgid "Download notebook file" +msgstr "Descargar archivo de cuaderno" + +msgid "Toggle navigation" +msgstr "Navegación de palanca" + +msgid "Source repository" +msgstr "Repositorio de origen" + +msgid "By the" +msgstr "Por el" + +msgid "next page" +msgstr "siguiente página" + +msgid "repository" +msgstr "repositorio" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro de la esfinge" + +msgid "Download source file" +msgstr "Descargar archivo fuente" + +msgid "Contents" +msgstr "Contenido" + +msgid "By" +msgstr "Por" + +msgid "Copyright" +msgstr "Derechos de autor" + +msgid "Fullscreen mode" +msgstr "Modo de pantalla completa" + +msgid "Open an issue" +msgstr "Abrir un problema" + +msgid "previous page" +msgstr "pagina anterior" + +msgid "Download this page" +msgstr "Descarga esta pagina" + +msgid "Theme by the" +msgstr "Tema por el" 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..cdcd07c7d8 --- /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 "suggest edit" +msgstr "soovita muuta" + +msgid "Last updated on" +msgstr "Viimati uuendatud" + +msgid "Edit this page" +msgstr "Muutke seda lehte" + +msgid "Launch" +msgstr "Käivitage" + +msgid "Print to PDF" +msgstr "Prindi PDF-i" + +msgid "open issue" +msgstr "avatud küsimus" + +msgid "Download notebook file" +msgstr "Laadige sülearvuti fail alla" + +msgid "Toggle navigation" +msgstr "Lülita navigeerimine sisse" + +msgid "Source repository" +msgstr "Allikahoidla" + +msgid "By the" +msgstr "Autor" + +msgid "next page" +msgstr "järgmine leht" + +msgid "repository" +msgstr "hoidla" + +msgid "Sphinx Book Theme" +msgstr "Sfinksiraamatu teema" + +msgid "Download source file" +msgstr "Laadige alla lähtefail" + +msgid "Contents" +msgstr "Sisu" + +msgid "By" +msgstr "Kõrval" + +msgid "Copyright" +msgstr "Autoriõigus" + +msgid "Fullscreen mode" +msgstr "Täisekraanirežiim" + +msgid "Open an issue" +msgstr "Avage probleem" + +msgid "previous page" +msgstr "eelmine leht" + +msgid "Download this page" +msgstr "Laadige see leht alla" + +msgid "Theme by the" +msgstr "Teema" 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..3c3dd08962 --- /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 "suggest edit" +msgstr "ehdottaa muokkausta" + +msgid "Last updated on" +msgstr "Viimeksi päivitetty" + +msgid "Edit this page" +msgstr "Muokkaa tätä sivua" + +msgid "Launch" +msgstr "Tuoda markkinoille" + +msgid "Print to PDF" +msgstr "Tulosta PDF-tiedostoon" + +msgid "open issue" +msgstr "avoin ongelma" + +msgid "Download notebook file" +msgstr "Lataa muistikirjatiedosto" + +msgid "Toggle navigation" +msgstr "Vaihda navigointia" + +msgid "Source repository" +msgstr "Lähteen arkisto" + +msgid "By the" +msgstr "Mukaan" + +msgid "next page" +msgstr "seuraava sivu" + +msgid "repository" +msgstr "arkisto" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-kirjan teema" + +msgid "Download source file" +msgstr "Lataa lähdetiedosto" + +msgid "Contents" +msgstr "Sisällys" + +msgid "By" +msgstr "Tekijä" + +msgid "Copyright" +msgstr "Tekijänoikeus" + +msgid "Fullscreen mode" +msgstr "Koko näytön tila" + +msgid "Open an issue" +msgstr "Avaa ongelma" + +msgid "previous page" +msgstr "Edellinen sivu" + +msgid "Download this page" +msgstr "Lataa tämä sivu" + +msgid "Theme by the" +msgstr "Teeman tekijä" 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..b57d2fe745 --- /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 "suggest edit" +msgstr "suggestion de modification" + +msgid "Last updated on" +msgstr "Dernière mise à jour le" + +msgid "Edit this page" +msgstr "Modifier cette page" + +msgid "Launch" +msgstr "lancement" + +msgid "Print to PDF" +msgstr "Imprimer au format PDF" + +msgid "open issue" +msgstr "signaler un problème" + +msgid "Download notebook file" +msgstr "Télécharger le fichier notebook" + +msgid "Toggle navigation" +msgstr "Basculer la navigation" + +msgid "Source repository" +msgstr "Dépôt source" + +msgid "By the" +msgstr "Par le" + +msgid "next page" +msgstr "page suivante" + +msgid "repository" +msgstr "dépôt" + +msgid "Sphinx Book Theme" +msgstr "Thème du livre Sphinx" + +msgid "Download source file" +msgstr "Télécharger le fichier source" + +msgid "Contents" +msgstr "Contenu" + +msgid "By" +msgstr "Par" + +msgid "Copyright" +msgstr "droits d'auteur" + +msgid "Fullscreen mode" +msgstr "Mode plein écran" + +msgid "Open an issue" +msgstr "Ouvrez un problème" + +msgid "previous page" +msgstr "page précédente" + +msgid "Download this page" +msgstr "Téléchargez cette page" + +msgid "Theme by the" +msgstr "Thème par le" 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..4c425e89ae --- /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 "suggest edit" +msgstr "predloži uređivanje" + +msgid "Last updated on" +msgstr "Posljednje ažuriranje:" + +msgid "Edit this page" +msgstr "Uredite ovu stranicu" + +msgid "Launch" +msgstr "Pokrenite" + +msgid "Print to PDF" +msgstr "Ispis u PDF" + +msgid "open issue" +msgstr "otvoreno izdanje" + +msgid "Download notebook file" +msgstr "Preuzmi datoteku bilježnice" + +msgid "Toggle navigation" +msgstr "Uključi / isključi navigaciju" + +msgid "Source repository" +msgstr "Izvorno spremište" + +msgid "By the" +msgstr "Od strane" + +msgid "next page" +msgstr "sljedeća stranica" + +msgid "repository" +msgstr "spremište" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "Download source file" +msgstr "Preuzmi izvornu datoteku" + +msgid "Contents" +msgstr "Sadržaj" + +msgid "By" +msgstr "Po" + +msgid "Copyright" +msgstr "Autorska prava" + +msgid "Fullscreen mode" +msgstr "Način preko cijelog zaslona" + +msgid "Open an issue" +msgstr "Otvorite izdanje" + +msgid "previous page" +msgstr "Prethodna stranica" + +msgid "Download this page" +msgstr "Preuzmite ovu stranicu" + +msgid "Theme by the" +msgstr "Tema autora" 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..5db2ae1474 --- /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 "suggest edit" +msgstr "menyarankan edit" + +msgid "Last updated on" +msgstr "Terakhir diperbarui saat" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "Launch" +msgstr "Meluncurkan" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "open issue" +msgstr "masalah terbuka" + +msgid "Download notebook file" +msgstr "Unduh file notebook" + +msgid "Toggle navigation" +msgstr "Alihkan navigasi" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "By the" +msgstr "Oleh" + +msgid "next page" +msgstr "halaman selanjutnya" + +msgid "repository" +msgstr "gudang" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "Download source file" +msgstr "Unduh file sumber" + +msgid "Contents" +msgstr "Isi" + +msgid "By" +msgstr "Oleh" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Fullscreen mode" +msgstr "Mode layar penuh" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "Download this page" +msgstr "Unduh halaman ini" + +msgid "Theme by the" +msgstr "Tema oleh" 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..7d54fdefa8 --- /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 "suggest edit" +msgstr "suggerisci modifica" + +msgid "Last updated on" +msgstr "Ultimo aggiornamento il" + +msgid "Edit this page" +msgstr "Modifica questa pagina" + +msgid "Launch" +msgstr "Lanciare" + +msgid "Print to PDF" +msgstr "Stampa in PDF" + +msgid "open issue" +msgstr "questione aperta" + +msgid "Download notebook file" +msgstr "Scarica il file del taccuino" + +msgid "Toggle navigation" +msgstr "Attiva / disattiva la navigazione" + +msgid "Source repository" +msgstr "Repository di origine" + +msgid "By the" +msgstr "Dal" + +msgid "next page" +msgstr "pagina successiva" + +msgid "repository" +msgstr "repository" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro della Sfinge" + +msgid "Download source file" +msgstr "Scarica il file sorgente" + +msgid "Contents" +msgstr "Contenuti" + +msgid "By" +msgstr "Di" + +msgid "Copyright" +msgstr "Diritto d'autore" + +msgid "Fullscreen mode" +msgstr "Modalità schermo intero" + +msgid "Open an issue" +msgstr "Apri un problema" + +msgid "previous page" +msgstr "pagina precedente" + +msgid "Download this page" +msgstr "Scarica questa pagina" + +msgid "Theme by the" +msgstr "Tema di" 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..32b017cf69 --- /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 "suggest edit" +msgstr "מציע לערוך" + +msgid "Last updated on" +msgstr "עודכן לאחרונה ב" + +msgid "Edit this page" +msgstr "ערוך דף זה" + +msgid "Launch" +msgstr "לְהַשִׁיק" + +msgid "Print to PDF" +msgstr "הדפס לקובץ PDF" + +msgid "open issue" +msgstr "בעיה פתוחה" + +msgid "Download notebook file" +msgstr "הורד קובץ מחברת" + +msgid "Toggle navigation" +msgstr "החלף ניווט" + +msgid "Source repository" +msgstr "מאגר המקורות" + +msgid "By the" +msgstr "דרך" + +msgid "next page" +msgstr "עמוד הבא" + +msgid "repository" +msgstr "מאגר" + +msgid "Sphinx Book Theme" +msgstr "נושא ספר ספינקס" + +msgid "Download source file" +msgstr "הורד את קובץ המקור" + +msgid "Contents" +msgstr "תוכן" + +msgid "By" +msgstr "על ידי" + +msgid "Copyright" +msgstr "זכויות יוצרים" + +msgid "Fullscreen mode" +msgstr "מצב מסך מלא" + +msgid "Open an issue" +msgstr "פתח גיליון" + +msgid "previous page" +msgstr "עמוד קודם" + +msgid "Download this page" +msgstr "הורד דף זה" + +msgid "Theme by the" +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..16924e1972 --- /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 "suggest edit" +msgstr "編集を提案する" + +msgid "Last updated on" +msgstr "最終更新日" + +msgid "Edit this page" +msgstr "このページを編集" + +msgid "Launch" +msgstr "起動" + +msgid "Print to PDF" +msgstr "PDFに印刷" + +msgid "open issue" +msgstr "未解決の問題" + +msgid "Download notebook file" +msgstr "ノートブックファイルをダウンロード" + +msgid "Toggle navigation" +msgstr "ナビゲーションを切り替え" + +msgid "Source repository" +msgstr "ソースリポジトリ" + +msgid "By the" +msgstr "によって" + +msgid "next page" +msgstr "次のページ" + +msgid "repository" +msgstr "リポジトリ" + +msgid "Sphinx Book Theme" +msgstr "スフィンクスの本のテーマ" + +msgid "Download source file" +msgstr "ソースファイルをダウンロード" + +msgid "Contents" +msgstr "目次" + +msgid "By" +msgstr "著者" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Fullscreen mode" +msgstr "全画面モード" + +msgid "Open an issue" +msgstr "問題を報告" + +msgid "previous page" +msgstr "前のページ" + +msgid "Download this page" +msgstr "このページをダウンロード" + +msgid "Theme by the" +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..69dd18f773 --- /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 "suggest edit" +msgstr "편집 제안" + +msgid "Last updated on" +msgstr "마지막 업데이트" + +msgid "Edit this page" +msgstr "이 페이지 편집" + +msgid "Launch" +msgstr "시작하다" + +msgid "Print to PDF" +msgstr "PDF로 인쇄" + +msgid "open issue" +msgstr "열린 문제" + +msgid "Download notebook file" +msgstr "노트북 파일 다운로드" + +msgid "Toggle navigation" +msgstr "탐색 전환" + +msgid "Source repository" +msgstr "소스 저장소" + +msgid "By the" +msgstr "에 의해" + +msgid "next page" +msgstr "다음 페이지" + +msgid "repository" +msgstr "저장소" + +msgid "Sphinx Book Theme" +msgstr "스핑크스 도서 테마" + +msgid "Download source file" +msgstr "소스 파일 다운로드" + +msgid "Contents" +msgstr "내용" + +msgid "By" +msgstr "으로" + +msgid "Copyright" +msgstr "저작권" + +msgid "Fullscreen mode" +msgstr "전체 화면으로보기" + +msgid "Open an issue" +msgstr "이슈 열기" + +msgid "previous page" +msgstr "이전 페이지" + +msgid "Download this page" +msgstr "이 페이지 다운로드" + +msgid "Theme by the" +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..9f037752c0 --- /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 "suggest edit" +msgstr "pasiūlyti redaguoti" + +msgid "Last updated on" +msgstr "Paskutinį kartą atnaujinta" + +msgid "Edit this page" +msgstr "Redaguoti šį puslapį" + +msgid "Launch" +msgstr "Paleiskite" + +msgid "Print to PDF" +msgstr "Spausdinti į PDF" + +msgid "open issue" +msgstr "atviras klausimas" + +msgid "Download notebook file" +msgstr "Atsisiųsti nešiojamojo kompiuterio failą" + +msgid "Toggle navigation" +msgstr "Perjungti naršymą" + +msgid "Source repository" +msgstr "Šaltinio saugykla" + +msgid "By the" +msgstr "Prie" + +msgid "next page" +msgstr "Kitas puslapis" + +msgid "repository" +msgstr "saugykla" + +msgid "Sphinx Book Theme" +msgstr "Sfinkso knygos tema" + +msgid "Download source file" +msgstr "Atsisiųsti šaltinio failą" + +msgid "Contents" +msgstr "Turinys" + +msgid "By" +msgstr "Iki" + +msgid "Copyright" +msgstr "Autorių teisės" + +msgid "Fullscreen mode" +msgstr "Pilno ekrano režimas" + +msgid "Open an issue" +msgstr "Atidarykite problemą" + +msgid "previous page" +msgstr "Ankstesnis puslapis" + +msgid "Download this page" +msgstr "Atsisiųskite šį puslapį" + +msgid "Theme by the" +msgstr "Tema" 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..c9633b545c --- /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 "suggest edit" +msgstr "ieteikt rediģēt" + +msgid "Last updated on" +msgstr "Pēdējoreiz atjaunināts" + +msgid "Edit this page" +msgstr "Rediģēt šo lapu" + +msgid "Launch" +msgstr "Uzsākt" + +msgid "Print to PDF" +msgstr "Drukāt PDF formātā" + +msgid "open issue" +msgstr "atklāts jautājums" + +msgid "Download notebook file" +msgstr "Lejupielādēt piezīmju grāmatiņu" + +msgid "Toggle navigation" +msgstr "Pārslēgt navigāciju" + +msgid "Source repository" +msgstr "Avota krātuve" + +msgid "By the" +msgstr "Ar" + +msgid "next page" +msgstr "nākamā lapaspuse" + +msgid "repository" +msgstr "krātuve" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa grāmatas tēma" + +msgid "Download source file" +msgstr "Lejupielādēt avota failu" + +msgid "Contents" +msgstr "Saturs" + +msgid "By" +msgstr "Autors" + +msgid "Copyright" +msgstr "Autortiesības" + +msgid "Fullscreen mode" +msgstr "Pilnekrāna režīms" + +msgid "Open an issue" +msgstr "Atveriet problēmu" + +msgid "previous page" +msgstr "iepriekšējā lapa" + +msgid "Download this page" +msgstr "Lejupielādējiet šo lapu" + +msgid "Theme by the" +msgstr "Autora tēma" 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..9a6a41e8ec --- /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 "suggest edit" +msgstr "എഡിറ്റുചെയ്യാൻ നിർദ്ദേശിക്കുക" + +msgid "Last updated on" +msgstr "അവസാനം അപ്‌ഡേറ്റുചെയ്‌തത്" + +msgid "Edit this page" +msgstr "ഈ പേജ് എഡിറ്റുചെയ്യുക" + +msgid "Launch" +msgstr "സമാരംഭിക്കുക" + +msgid "Print to PDF" +msgstr "PDF- ലേക്ക് പ്രിന്റുചെയ്യുക" + +msgid "open issue" +msgstr "തുറന്ന പ്രശ്നം" + +msgid "Download notebook file" +msgstr "നോട്ട്ബുക്ക് ഫയൽ ഡൺലോഡ് ചെയ്യുക" + +msgid "Toggle navigation" +msgstr "നാവിഗേഷൻ ടോഗിൾ ചെയ്യുക" + +msgid "Source repository" +msgstr "ഉറവിട ശേഖരം" + +msgid "By the" +msgstr "എഴുതിയത്" + +msgid "next page" +msgstr "അടുത്ത പേജ്" + +msgid "Sphinx Book Theme" +msgstr "സ്ഫിങ്ക്സ് പുസ്തക തീം" + +msgid "Download source file" +msgstr "ഉറവിട ഫയൽ ഡൗൺലോഡുചെയ്യുക" + +msgid "By" +msgstr "എഴുതിയത്" + +msgid "Copyright" +msgstr "പകർപ്പവകാശം" + +msgid "Open an issue" +msgstr "ഒരു പ്രശ്നം തുറക്കുക" + +msgid "previous page" +msgstr "മുൻപത്തെ താൾ" + +msgid "Download this page" +msgstr "ഈ പേജ് ഡൗൺലോഡുചെയ്യുക" + +msgid "Theme by the" +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..ef72d8c6bc --- /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 "suggest edit" +msgstr "संपादन सुचवा" + +msgid "Last updated on" +msgstr "अखेरचे अद्यतनित" + +msgid "Edit this page" +msgstr "हे पृष्ठ संपादित करा" + +msgid "Launch" +msgstr "लाँच करा" + +msgid "Print to PDF" +msgstr "पीडीएफवर मुद्रित करा" + +msgid "open issue" +msgstr "खुला मुद्दा" + +msgid "Download notebook file" +msgstr "नोटबुक फाईल डाउनलोड करा" + +msgid "Toggle navigation" +msgstr "नेव्हिगेशन टॉगल करा" + +msgid "Source repository" +msgstr "स्त्रोत भांडार" + +msgid "By the" +msgstr "द्वारा" + +msgid "next page" +msgstr "पुढील पृष्ठ" + +msgid "Sphinx Book Theme" +msgstr "स्फिंक्स बुक थीम" + +msgid "Download source file" +msgstr "स्त्रोत फाइल डाउनलोड करा" + +msgid "By" +msgstr "द्वारा" + +msgid "Copyright" +msgstr "कॉपीराइट" + +msgid "Open an issue" +msgstr "एक मुद्दा उघडा" + +msgid "previous page" +msgstr "मागील पान" + +msgid "Download this page" +msgstr "हे पृष्ठ डाउनलोड करा" + +msgid "Theme by the" +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..e29cbe2ec2 --- /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 "suggest edit" +msgstr "cadangkan edit" + +msgid "Last updated on" +msgstr "Terakhir dikemas kini pada" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "Launch" +msgstr "Lancarkan" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "open issue" +msgstr "isu terbuka" + +msgid "Download notebook file" +msgstr "Muat turun fail buku nota" + +msgid "Toggle navigation" +msgstr "Togol navigasi" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "By the" +msgstr "Oleh" + +msgid "next page" +msgstr "muka surat seterusnya" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "Download source file" +msgstr "Muat turun fail sumber" + +msgid "By" +msgstr "Oleh" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "Download this page" +msgstr "Muat turun halaman ini" + +msgid "Theme by the" +msgstr "Tema oleh" 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..e4844d7c98 --- /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 "suggest edit" +msgstr "suggereren bewerken" + +msgid "Last updated on" +msgstr "Laatst geupdate op" + +msgid "Edit this page" +msgstr "bewerk deze pagina" + +msgid "Launch" +msgstr "Lancering" + +msgid "Print to PDF" +msgstr "Afdrukken naar pdf" + +msgid "open issue" +msgstr "open probleem" + +msgid "Download notebook file" +msgstr "Download notebookbestand" + +msgid "Toggle navigation" +msgstr "Schakel navigatie" + +msgid "Source repository" +msgstr "Bronopslagplaats" + +msgid "By the" +msgstr "Door de" + +msgid "next page" +msgstr "volgende bladzijde" + +msgid "repository" +msgstr "repository" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-boekthema" + +msgid "Download source file" +msgstr "Download het bronbestand" + +msgid "Contents" +msgstr "Inhoud" + +msgid "By" +msgstr "Door" + +msgid "Copyright" +msgstr "auteursrechten" + +msgid "Fullscreen mode" +msgstr "Volledig scherm" + +msgid "Open an issue" +msgstr "Open een probleem" + +msgid "previous page" +msgstr "vorige pagina" + +msgid "Download this page" +msgstr "Download deze pagina" + +msgid "Theme by the" +msgstr "Thema door de" 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..d079dd9b09 --- /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 "suggest edit" +msgstr "foreslå redigering" + +msgid "Last updated on" +msgstr "Sist oppdatert den" + +msgid "Edit this page" +msgstr "Rediger denne siden" + +msgid "Launch" +msgstr "Start" + +msgid "Print to PDF" +msgstr "Skriv ut til PDF" + +msgid "open issue" +msgstr "åpent nummer" + +msgid "Download notebook file" +msgstr "Last ned notatbokfilen" + +msgid "Toggle navigation" +msgstr "Bytt navigasjon" + +msgid "Source repository" +msgstr "Kildedepot" + +msgid "By the" +msgstr "Ved" + +msgid "next page" +msgstr "neste side" + +msgid "repository" +msgstr "oppbevaringssted" + +msgid "Sphinx Book Theme" +msgstr "Sphinx boktema" + +msgid "Download source file" +msgstr "Last ned kildefilen" + +msgid "Contents" +msgstr "Innhold" + +msgid "By" +msgstr "Av" + +msgid "Copyright" +msgstr "opphavsrett" + +msgid "Fullscreen mode" +msgstr "Fullskjerm-modus" + +msgid "Open an issue" +msgstr "Åpne et problem" + +msgid "previous page" +msgstr "forrige side" + +msgid "Download this page" +msgstr "Last ned denne siden" + +msgid "Theme by the" +msgstr "Tema av" 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..fcac51d329 --- /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 "suggest edit" +msgstr "zaproponuj edycję" + +msgid "Last updated on" +msgstr "Ostatnia aktualizacja" + +msgid "Edit this page" +msgstr "Edytuj tę strone" + +msgid "Launch" +msgstr "Uruchomić" + +msgid "Print to PDF" +msgstr "Drukuj do PDF" + +msgid "open issue" +msgstr "otwarty problem" + +msgid "Download notebook file" +msgstr "Pobierz plik notatnika" + +msgid "Toggle navigation" +msgstr "Przełącz nawigację" + +msgid "Source repository" +msgstr "Repozytorium źródłowe" + +msgid "By the" +msgstr "Przez" + +msgid "next page" +msgstr "Następna strona" + +msgid "repository" +msgstr "magazyn" + +msgid "Sphinx Book Theme" +msgstr "Motyw książki Sphinx" + +msgid "Download source file" +msgstr "Pobierz plik źródłowy" + +msgid "Contents" +msgstr "Zawartość" + +msgid "By" +msgstr "Przez" + +msgid "Copyright" +msgstr "prawa autorskie" + +msgid "Fullscreen mode" +msgstr "Pełny ekran" + +msgid "Open an issue" +msgstr "Otwórz problem" + +msgid "previous page" +msgstr "Poprzednia strona" + +msgid "Download this page" +msgstr "Pobierz tę stronę" + +msgid "Theme by the" +msgstr "Motyw autorstwa" 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..1761db08ae --- /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 "suggest edit" +msgstr "sugerir edição" + +msgid "Last updated on" +msgstr "Última atualização em" + +msgid "Edit this page" +msgstr "Edite essa página" + +msgid "Launch" +msgstr "Lançamento" + +msgid "Print to PDF" +msgstr "Imprimir em PDF" + +msgid "open issue" +msgstr "questão aberta" + +msgid "Download notebook file" +msgstr "Baixar arquivo de notebook" + +msgid "Toggle navigation" +msgstr "Alternar de navegação" + +msgid "Source repository" +msgstr "Repositório fonte" + +msgid "By the" +msgstr "Pelo" + +msgid "next page" +msgstr "próxima página" + +msgid "repository" +msgstr "repositório" + +msgid "Sphinx Book Theme" +msgstr "Tema do livro Sphinx" + +msgid "Download source file" +msgstr "Baixar arquivo fonte" + +msgid "Contents" +msgstr "Conteúdo" + +msgid "By" +msgstr "De" + +msgid "Copyright" +msgstr "direito autoral" + +msgid "Fullscreen mode" +msgstr "Modo tela cheia" + +msgid "Open an issue" +msgstr "Abra um problema" + +msgid "previous page" +msgstr "página anterior" + +msgid "Download this page" +msgstr "Baixe esta página" + +msgid "Theme by the" +msgstr "Tema por" 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..db865c8f65 --- /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 "suggest edit" +msgstr "sugerează editare" + +msgid "Last updated on" +msgstr "Ultima actualizare la" + +msgid "Edit this page" +msgstr "Editați această pagină" + +msgid "Launch" +msgstr "Lansa" + +msgid "Print to PDF" +msgstr "Imprimați în PDF" + +msgid "open issue" +msgstr "problema deschisă" + +msgid "Download notebook file" +msgstr "Descărcați fișierul notebook" + +msgid "Toggle navigation" +msgstr "Comutare navigare" + +msgid "Source repository" +msgstr "Depozit sursă" + +msgid "By the" +msgstr "Langa" + +msgid "next page" +msgstr "pagina următoare" + +msgid "repository" +msgstr "repertoriu" + +msgid "Sphinx Book Theme" +msgstr "Tema Sphinx Book" + +msgid "Download source file" +msgstr "Descărcați fișierul sursă" + +msgid "Contents" +msgstr "Cuprins" + +msgid "By" +msgstr "De" + +msgid "Copyright" +msgstr "Drepturi de autor" + +msgid "Fullscreen mode" +msgstr "Modul ecran întreg" + +msgid "Open an issue" +msgstr "Deschideți o problemă" + +msgid "previous page" +msgstr "pagina anterioară" + +msgid "Download this page" +msgstr "Descarcă această pagină" + +msgid "Theme by the" +msgstr "Tema de" 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..84ab6eb531 --- /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 "suggest edit" +msgstr "предложить редактировать" + +msgid "Last updated on" +msgstr "Последнее обновление" + +msgid "Edit this page" +msgstr "Редактировать эту страницу" + +msgid "Launch" +msgstr "Запуск" + +msgid "Print to PDF" +msgstr "Распечатать в PDF" + +msgid "open issue" +msgstr "открытый вопрос" + +msgid "Download notebook file" +msgstr "Скачать файл записной книжки" + +msgid "Toggle navigation" +msgstr "Переключить навигацию" + +msgid "Source repository" +msgstr "Исходный репозиторий" + +msgid "By the" +msgstr "Посредством" + +msgid "next page" +msgstr "Следующая страница" + +msgid "repository" +msgstr "хранилище" + +msgid "Sphinx Book Theme" +msgstr "Тема книги Сфинкс" + +msgid "Download source file" +msgstr "Скачать исходный файл" + +msgid "Contents" +msgstr "Содержание" + +msgid "By" +msgstr "По" + +msgid "Copyright" +msgstr "авторское право" + +msgid "Fullscreen mode" +msgstr "Полноэкранный режим" + +msgid "Open an issue" +msgstr "Открыть вопрос" + +msgid "previous page" +msgstr "Предыдущая страница" + +msgid "Download this page" +msgstr "Загрузите эту страницу" + +msgid "Theme by the" +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..e44878b50e --- /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 "suggest edit" +msgstr "navrhnúť úpravu" + +msgid "Last updated on" +msgstr "Posledná aktualizácia dňa" + +msgid "Edit this page" +msgstr "Upraviť túto stránku" + +msgid "Launch" +msgstr "Spustiť" + +msgid "Print to PDF" +msgstr "Tlač do PDF" + +msgid "open issue" +msgstr "otvorené vydanie" + +msgid "Download notebook file" +msgstr "Stiahnite si zošit" + +msgid "Toggle navigation" +msgstr "Prepnúť navigáciu" + +msgid "Source repository" +msgstr "Zdrojové úložisko" + +msgid "By the" +msgstr "Podľa" + +msgid "next page" +msgstr "ďalšia strana" + +msgid "repository" +msgstr "Úložisko" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "Download source file" +msgstr "Stiahnite si zdrojový súbor" + +msgid "Contents" +msgstr "Obsah" + +msgid "By" +msgstr "Autor:" + +msgid "Copyright" +msgstr "Autorské práva" + +msgid "Fullscreen mode" +msgstr "Režim celej obrazovky" + +msgid "Open an issue" +msgstr "Otvorte problém" + +msgid "previous page" +msgstr "predchádzajúca strana" + +msgid "Download this page" +msgstr "Stiahnite si túto stránku" + +msgid "Theme by the" +msgstr "Téma od" 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..228939bcdd --- /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 "suggest edit" +msgstr "predlagajte urejanje" + +msgid "Last updated on" +msgstr "Nazadnje posodobljeno dne" + +msgid "Edit this page" +msgstr "Uredite to stran" + +msgid "Launch" +msgstr "Kosilo" + +msgid "Print to PDF" +msgstr "Natisni v PDF" + +msgid "open issue" +msgstr "odprto vprašanje" + +msgid "Download notebook file" +msgstr "Prenesite datoteko zvezka" + +msgid "Toggle navigation" +msgstr "Preklopi navigacijo" + +msgid "Source repository" +msgstr "Izvorno skladišče" + +msgid "By the" +msgstr "Avtor" + +msgid "next page" +msgstr "Naslednja stran" + +msgid "repository" +msgstr "odlagališče" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "Download source file" +msgstr "Prenesite izvorno datoteko" + +msgid "Contents" +msgstr "Vsebina" + +msgid "By" +msgstr "Avtor" + +msgid "Copyright" +msgstr "avtorske pravice" + +msgid "Fullscreen mode" +msgstr "Celozaslonski način" + +msgid "Open an issue" +msgstr "Odprite številko" + +msgid "previous page" +msgstr "Prejšnja stran" + +msgid "Download this page" +msgstr "Prenesite to stran" + +msgid "Theme by the" +msgstr "Tema avtorja" 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..1a712a18d8 --- /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 "suggest edit" +msgstr "предложи уређивање" + +msgid "Last updated on" +msgstr "Последње ажурирање" + +msgid "Edit this page" +msgstr "Уредите ову страницу" + +msgid "Launch" +msgstr "Лансирање" + +msgid "Print to PDF" +msgstr "Испис у ПДФ" + +msgid "open issue" +msgstr "отворено издање" + +msgid "Download notebook file" +msgstr "Преузмите датотеку бележнице" + +msgid "Toggle navigation" +msgstr "Укључи / искључи навигацију" + +msgid "Source repository" +msgstr "Изворно спремиште" + +msgid "By the" +msgstr "Од" + +msgid "next page" +msgstr "Следећа страна" + +msgid "repository" +msgstr "спремиште" + +msgid "Sphinx Book Theme" +msgstr "Тема књиге Спхинк" + +msgid "Download source file" +msgstr "Преузми изворну датотеку" + +msgid "Contents" +msgstr "Садржај" + +msgid "By" +msgstr "Од стране" + +msgid "Copyright" +msgstr "Ауторско право" + +msgid "Fullscreen mode" +msgstr "Режим целог екрана" + +msgid "Open an issue" +msgstr "Отворите издање" + +msgid "previous page" +msgstr "Претходна страница" + +msgid "Download this page" +msgstr "Преузмите ову страницу" + +msgid "Theme by the" +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..be951bec20 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..7d2b56d949 --- /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 "suggest edit" +msgstr "föreslå redigering" + +msgid "Last updated on" +msgstr "Senast uppdaterad den" + +msgid "Edit this page" +msgstr "Redigera den här sidan" + +msgid "Launch" +msgstr "Lansera" + +msgid "Print to PDF" +msgstr "Skriv ut till PDF" + +msgid "open issue" +msgstr "öppet problem" + +msgid "Download notebook file" +msgstr "Ladda ner anteckningsbokfilen" + +msgid "Toggle navigation" +msgstr "Växla navigering" + +msgid "Source repository" +msgstr "Källförvar" + +msgid "By the" +msgstr "Vid" + +msgid "next page" +msgstr "nästa sida" + +msgid "repository" +msgstr "förvar" + +msgid "Sphinx Book Theme" +msgstr "Sphinx boktema" + +msgid "Download source file" +msgstr "Ladda ner källfil" + +msgid "Contents" +msgstr "Innehåll" + +msgid "By" +msgstr "Förbi" + +msgid "Copyright" +msgstr "upphovsrätt" + +msgid "Fullscreen mode" +msgstr "Fullskärmsläge" + +msgid "Open an issue" +msgstr "Öppna ett problem" + +msgid "previous page" +msgstr "föregående sida" + +msgid "Download this page" +msgstr "Ladda ner den här sidan" + +msgid "Theme by the" +msgstr "Tema av" 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..c75ffe192c --- /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 "suggest edit" +msgstr "திருத்த பரிந்துரைக்கவும்" + +msgid "Last updated on" +msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" + +msgid "Edit this page" +msgstr "இந்தப் பக்கத்தைத் திருத்தவும்" + +msgid "Launch" +msgstr "தொடங்க" + +msgid "Print to PDF" +msgstr "PDF இல் அச்சிடுக" + +msgid "open issue" +msgstr "திறந்த பிரச்சினை" + +msgid "Download notebook file" +msgstr "நோட்புக் கோப்பைப் பதிவிறக்கவும்" + +msgid "Toggle navigation" +msgstr "வழிசெலுத்தலை நிலைமாற்று" + +msgid "Source repository" +msgstr "மூல களஞ்சியம்" + +msgid "By the" +msgstr "மூலம்" + +msgid "next page" +msgstr "அடுத்த பக்கம்" + +msgid "Sphinx Book Theme" +msgstr "ஸ்பிங்க்ஸ் புத்தக தீம்" + +msgid "Download source file" +msgstr "மூல கோப்பைப் பதிவிறக்குக" + +msgid "By" +msgstr "வழங்கியவர்" + +msgid "Copyright" +msgstr "பதிப்புரிமை" + +msgid "Open an issue" +msgstr "சிக்கலைத் திறக்கவும்" + +msgid "previous page" +msgstr "முந்தைய பக்கம்" + +msgid "Download this page" +msgstr "இந்தப் பக்கத்தைப் பதிவிறக்கவும்" + +msgid "Theme by the" +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..2595c03590 --- /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 "suggest edit" +msgstr "సవరించమని సూచించండి" + +msgid "Last updated on" +msgstr "చివరిగా నవీకరించబడింది" + +msgid "Edit this page" +msgstr "ఈ పేజీని సవరించండి" + +msgid "Launch" +msgstr "ప్రారంభించండి" + +msgid "Print to PDF" +msgstr "PDF కి ముద్రించండి" + +msgid "open issue" +msgstr "ఓపెన్ ఇష్యూ" + +msgid "Download notebook file" +msgstr "నోట్బుక్ ఫైల్ను డౌన్లోడ్ చేయండి" + +msgid "Toggle navigation" +msgstr "నావిగేషన్‌ను టోగుల్ చేయండి" + +msgid "Source repository" +msgstr "మూల రిపోజిటరీ" + +msgid "By the" +msgstr "ద్వారా" + +msgid "next page" +msgstr "తరువాతి పేజీ" + +msgid "Sphinx Book Theme" +msgstr "సింహిక పుస్తక థీమ్" + +msgid "Download source file" +msgstr "మూల ఫైల్‌ను డౌన్‌లోడ్ చేయండి" + +msgid "By" +msgstr "ద్వారా" + +msgid "Copyright" +msgstr "కాపీరైట్" + +msgid "Open an issue" +msgstr "సమస్యను తెరవండి" + +msgid "previous page" +msgstr "ముందు పేజి" + +msgid "Download this page" +msgstr "ఈ పేజీని డౌన్‌లోడ్ చేయండి" + +msgid "Theme by the" +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..73cd30ea97 --- /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 "suggest edit" +msgstr "пешниҳод вироиш" + +msgid "Last updated on" +msgstr "Last навсозӣ дар" + +msgid "Edit this page" +msgstr "Ин саҳифаро таҳрир кунед" + +msgid "Launch" +msgstr "Оғоз" + +msgid "Print to PDF" +msgstr "Чоп ба PDF" + +msgid "open issue" +msgstr "барориши кушод" + +msgid "Download notebook file" +msgstr "Файли дафтарро зеркашӣ кунед" + +msgid "Toggle navigation" +msgstr "Гузаришро иваз кунед" + +msgid "Source repository" +msgstr "Анбори манбаъ" + +msgid "By the" +msgstr "Бо" + +msgid "next page" +msgstr "саҳифаи оянда" + +msgid "repository" +msgstr "анбор" + +msgid "Sphinx Book Theme" +msgstr "Сфинкс Мавзӯи китоб" + +msgid "Download source file" +msgstr "Файли манбаъро зеркашӣ кунед" + +msgid "Contents" +msgstr "Мундариҷа" + +msgid "By" +msgstr "Бо" + +msgid "Copyright" +msgstr "Ҳуқуқи муаллиф" + +msgid "Fullscreen mode" +msgstr "Ҳолати экрани пурра" + +msgid "Open an issue" +msgstr "Масъаларо кушоед" + +msgid "previous page" +msgstr "саҳифаи қаблӣ" + +msgid "Download this page" +msgstr "Ин саҳифаро зеркашӣ кунед" + +msgid "Theme by the" +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..0392b4ad39 --- /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 "suggest edit" +msgstr "แนะนำแก้ไข" + +msgid "Last updated on" +msgstr "ปรับปรุงล่าสุดเมื่อ" + +msgid "Edit this page" +msgstr "แก้ไขหน้านี้" + +msgid "Launch" +msgstr "เปิด" + +msgid "Print to PDF" +msgstr "พิมพ์เป็น PDF" + +msgid "open issue" +msgstr "เปิดปัญหา" + +msgid "Download notebook file" +msgstr "ดาวน์โหลดไฟล์สมุดบันทึก" + +msgid "Toggle navigation" +msgstr "ไม่ต้องสลับช่องทาง" + +msgid "Source repository" +msgstr "ที่เก็บซอร์ส" + +msgid "By the" +msgstr "โดย" + +msgid "next page" +msgstr "หน้าต่อไป" + +msgid "repository" +msgstr "ที่เก็บ" + +msgid "Sphinx Book Theme" +msgstr "ธีมหนังสือสฟิงซ์" + +msgid "Download source file" +msgstr "ดาวน์โหลดไฟล์ต้นฉบับ" + +msgid "Contents" +msgstr "สารบัญ" + +msgid "By" +msgstr "โดย" + +msgid "Copyright" +msgstr "ลิขสิทธิ์" + +msgid "Fullscreen mode" +msgstr "โหมดเต็มหน้าจอ" + +msgid "Open an issue" +msgstr "เปิดปัญหา" + +msgid "previous page" +msgstr "หน้าที่แล้ว" + +msgid "Download this page" +msgstr "ดาวน์โหลดหน้านี้" + +msgid "Theme by the" +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..c8375b5431 --- /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 "suggest edit" +msgstr "iminumungkahi i-edit" + +msgid "Last updated on" +msgstr "Huling na-update noong" + +msgid "Edit this page" +msgstr "I-edit ang pahinang ito" + +msgid "Launch" +msgstr "Ilunsad" + +msgid "Print to PDF" +msgstr "I-print sa PDF" + +msgid "open issue" +msgstr "bukas na isyu" + +msgid "Download notebook file" +msgstr "Mag-download ng file ng notebook" + +msgid "Toggle navigation" +msgstr "I-toggle ang pag-navigate" + +msgid "Source repository" +msgstr "Pinagmulan ng imbakan" + +msgid "By the" +msgstr "Sa pamamagitan ng" + +msgid "next page" +msgstr "Susunod na pahina" + +msgid "Sphinx Book Theme" +msgstr "Tema ng Sphinx Book" + +msgid "Download source file" +msgstr "Mag-download ng file ng pinagmulan" + +msgid "By" +msgstr "Ni" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Open an issue" +msgstr "Magbukas ng isyu" + +msgid "previous page" +msgstr "Nakaraang pahina" + +msgid "Download this page" +msgstr "I-download ang pahinang ito" + +msgid "Theme by the" +msgstr "Tema ng" 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..47d7bdf7f5 --- /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 "suggest edit" +msgstr "düzenleme öner" + +msgid "Last updated on" +msgstr "Son güncelleme tarihi" + +msgid "Edit this page" +msgstr "Bu sayfayı düzenle" + +msgid "Launch" +msgstr "Başlatmak" + +msgid "Print to PDF" +msgstr "PDF olarak yazdır" + +msgid "open issue" +msgstr "Açık konu" + +msgid "Download notebook file" +msgstr "Defter dosyasını indirin" + +msgid "Toggle navigation" +msgstr "Gezinmeyi değiştir" + +msgid "Source repository" +msgstr "Kaynak kod deposu" + +msgid "By the" +msgstr "Tarafından" + +msgid "next page" +msgstr "sonraki Sayfa" + +msgid "repository" +msgstr "depo" + +msgid "Sphinx Book Theme" +msgstr "Sfenks Kitap Teması" + +msgid "Download source file" +msgstr "Kaynak dosyayı indirin" + +msgid "Contents" +msgstr "İçindekiler" + +msgid "By" +msgstr "Tarafından" + +msgid "Copyright" +msgstr "Telif hakkı" + +msgid "Fullscreen mode" +msgstr "Tam ekran modu" + +msgid "Open an issue" +msgstr "Bir sorunu açın" + +msgid "previous page" +msgstr "önceki sayfa" + +msgid "Download this page" +msgstr "Bu sayfayı indirin" + +msgid "Theme by the" +msgstr "Tarafından tema" 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..e85f6f16ac --- /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 "suggest edit" +msgstr "запропонувати редагувати" + +msgid "Last updated on" +msgstr "Останнє оновлення:" + +msgid "Edit this page" +msgstr "Редагувати цю сторінку" + +msgid "Launch" +msgstr "Запуск" + +msgid "Print to PDF" +msgstr "Друк у форматі PDF" + +msgid "open issue" +msgstr "відкритий випуск" + +msgid "Download notebook file" +msgstr "Завантажте файл блокнота" + +msgid "Toggle navigation" +msgstr "Переключити навігацію" + +msgid "Source repository" +msgstr "Джерело сховища" + +msgid "By the" +msgstr "По" + +msgid "next page" +msgstr "Наступна сторінка" + +msgid "repository" +msgstr "сховище" + +msgid "Sphinx Book Theme" +msgstr "Тема книги \"Сфінкс\"" + +msgid "Download source file" +msgstr "Завантажити вихідний файл" + +msgid "Contents" +msgstr "Зміст" + +msgid "By" +msgstr "Автор" + +msgid "Copyright" +msgstr "Авторське право" + +msgid "Fullscreen mode" +msgstr "Повноекранний режим" + +msgid "Open an issue" +msgstr "Відкрийте випуск" + +msgid "previous page" +msgstr "Попередня сторінка" + +msgid "Download this page" +msgstr "Завантажте цю сторінку" + +msgid "Theme by the" +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..0f90726c12 --- /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 "suggest edit" +msgstr "ترمیم کی تجویز کریں" + +msgid "Last updated on" +msgstr "آخری بار تازہ کاری ہوئی" + +msgid "Edit this page" +msgstr "اس صفحے میں ترمیم کریں" + +msgid "Launch" +msgstr "لانچ کریں" + +msgid "Print to PDF" +msgstr "پی ڈی ایف پرنٹ کریں" + +msgid "open issue" +msgstr "کھلا مسئلہ" + +msgid "Download notebook file" +msgstr "نوٹ بک فائل ڈاؤن لوڈ کریں" + +msgid "Toggle navigation" +msgstr "نیویگیشن ٹوگل کریں" + +msgid "Source repository" +msgstr "ماخذ ذخیرہ" + +msgid "By the" +msgstr "کی طرف" + +msgid "next page" +msgstr "اگلا صفحہ" + +msgid "Sphinx Book Theme" +msgstr "سپنکس بک تھیم" + +msgid "Download source file" +msgstr "سورس فائل ڈاؤن لوڈ کریں" + +msgid "By" +msgstr "بذریعہ" + +msgid "Copyright" +msgstr "کاپی رائٹ" + +msgid "Open an issue" +msgstr "ایک مسئلہ کھولیں" + +msgid "previous page" +msgstr "سابقہ ​​صفحہ" + +msgid "Download this page" +msgstr "اس صفحے کو ڈاؤن لوڈ کریں" + +msgid "Theme by the" +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..2cb5cf3b82 --- /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 "suggest edit" +msgstr "đề nghị chỉnh sửa" + +msgid "Last updated on" +msgstr "Cập nhật lần cuối vào" + +msgid "Edit this page" +msgstr "chỉnh sửa trang này" + +msgid "Launch" +msgstr "Phóng" + +msgid "Print to PDF" +msgstr "In sang PDF" + +msgid "open issue" +msgstr "vấn đề mở" + +msgid "Download notebook file" +msgstr "Tải xuống tệp sổ tay" + +msgid "Toggle navigation" +msgstr "Chuyển đổi điều hướng thành" + +msgid "Source repository" +msgstr "Kho nguồn" + +msgid "By the" +msgstr "Bằng" + +msgid "next page" +msgstr "Trang tiếp theo" + +msgid "repository" +msgstr "kho" + +msgid "Sphinx Book Theme" +msgstr "Chủ đề sách nhân sư" + +msgid "Download source file" +msgstr "Tải xuống tệp nguồn" + +msgid "Contents" +msgstr "Nội dung" + +msgid "By" +msgstr "Bởi" + +msgid "Copyright" +msgstr "Bản quyền" + +msgid "Fullscreen mode" +msgstr "Chế độ toàn màn hình" + +msgid "Open an issue" +msgstr "Mở một vấn đề" + +msgid "previous page" +msgstr "trang trước" + +msgid "Download this page" +msgstr "Tải xuống trang này" + +msgid "Theme by the" +msgstr "Chủ đề của" 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..f91f3ba0a2 --- /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 "suggest edit" +msgstr "提出修改建议" + +msgid "Last updated on" +msgstr "上次更新时间:" + +msgid "Edit this page" +msgstr "编辑此页面" + +msgid "Launch" +msgstr "启动" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "open issue" +msgstr "创建议题" + +msgid "Download notebook file" +msgstr "下载笔记本文件" + +msgid "Toggle navigation" +msgstr "显示或隐藏导航栏" + +msgid "Source repository" +msgstr "源码库" + +msgid "By the" +msgstr "作者:" + +msgid "next page" +msgstr "下一页" + +msgid "repository" +msgstr "仓库" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 主题" + +msgid "Download source file" +msgstr "下载源文件" + +msgid "Contents" +msgstr "目录" + +msgid "By" +msgstr "作者:" + +msgid "Copyright" +msgstr "版权" + +msgid "Fullscreen mode" +msgstr "全屏模式" + +msgid "Open an issue" +msgstr "创建议题" + +msgid "previous page" +msgstr "上一页" + +msgid "Download this page" +msgstr "下载此页面" + +msgid "Theme by the" +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..7833d90432 --- /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 "suggest edit" +msgstr "提出修改建議" + +msgid "Last updated on" +msgstr "最後更新時間:" + +msgid "Edit this page" +msgstr "編輯此頁面" + +msgid "Launch" +msgstr "啟動" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "open issue" +msgstr "公開的問題" + +msgid "Download notebook file" +msgstr "下載 Notebook 檔案" + +msgid "Toggle navigation" +msgstr "顯示或隱藏導覽列" + +msgid "Source repository" +msgstr "來源儲存庫" + +msgid "By the" +msgstr "作者:" + +msgid "next page" +msgstr "下一頁" + +msgid "repository" +msgstr "儲存庫" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 佈景主題" + +msgid "Download source file" +msgstr "下載原始檔" + +msgid "Contents" +msgstr "目錄" + +msgid "By" +msgstr "作者:" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Fullscreen mode" +msgstr "全螢幕模式" + +msgid "Open an issue" +msgstr "開啟議題" + +msgid "previous page" +msgstr "上一頁" + +msgid "Download this page" +msgstr "下載此頁面" + +msgid "Theme by the" +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..997797f270 --- /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: #7971292e } +html[data-theme="light"] .highlight { background: #fefefe; color: #545454 } +html[data-theme="light"] .highlight .c { color: #797129 } /* Comment */ +html[data-theme="light"] .highlight .err { color: #d91e18 } /* Error */ +html[data-theme="light"] .highlight .k { color: #7928a1 } /* Keyword */ +html[data-theme="light"] .highlight .l { color: #797129 } /* Literal */ +html[data-theme="light"] .highlight .n { color: #545454 } /* Name */ +html[data-theme="light"] .highlight .o { color: #008000 } /* Operator */ +html[data-theme="light"] .highlight .p { color: #545454 } /* Punctuation */ +html[data-theme="light"] .highlight .ch { color: #797129 } /* Comment.Hashbang */ +html[data-theme="light"] .highlight .cm { color: #797129 } /* Comment.Multiline */ +html[data-theme="light"] .highlight .cp { color: #797129 } /* Comment.Preproc */ +html[data-theme="light"] .highlight .cpf { color: #797129 } /* Comment.PreprocFile */ +html[data-theme="light"] .highlight .c1 { color: #797129 } /* Comment.Single */ +html[data-theme="light"] .highlight .cs { color: #797129 } /* Comment.Special */ +html[data-theme="light"] .highlight .gd { color: #007faa } /* Generic.Deleted */ +html[data-theme="light"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="light"] .highlight .gh { color: #007faa } /* Generic.Heading */ +html[data-theme="light"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="light"] .highlight .gu { color: #007faa } /* Generic.Subheading */ +html[data-theme="light"] .highlight .kc { color: #7928a1 } /* Keyword.Constant */ +html[data-theme="light"] .highlight .kd { color: #7928a1 } /* Keyword.Declaration */ +html[data-theme="light"] .highlight .kn { color: #7928a1 } /* Keyword.Namespace */ +html[data-theme="light"] .highlight .kp { color: #7928a1 } /* Keyword.Pseudo */ +html[data-theme="light"] .highlight .kr { color: #7928a1 } /* Keyword.Reserved */ +html[data-theme="light"] .highlight .kt { color: #797129 } /* Keyword.Type */ +html[data-theme="light"] .highlight .ld { color: #797129 } /* Literal.Date */ +html[data-theme="light"] .highlight .m { color: #797129 } /* Literal.Number */ +html[data-theme="light"] .highlight .s { color: #008000 } /* Literal.String */ +html[data-theme="light"] .highlight .na { color: #797129 } /* Name.Attribute */ +html[data-theme="light"] .highlight .nb { color: #797129 } /* Name.Builtin */ +html[data-theme="light"] .highlight .nc { color: #007faa } /* Name.Class */ +html[data-theme="light"] .highlight .no { color: #007faa } /* Name.Constant */ +html[data-theme="light"] .highlight .nd { color: #797129 } /* Name.Decorator */ +html[data-theme="light"] .highlight .ni { color: #008000 } /* Name.Entity */ +html[data-theme="light"] .highlight .ne { color: #7928a1 } /* Name.Exception */ +html[data-theme="light"] .highlight .nf { color: #007faa } /* Name.Function */ +html[data-theme="light"] .highlight .nl { color: #797129 } /* Name.Label */ +html[data-theme="light"] .highlight .nn { color: #545454 } /* Name.Namespace */ +html[data-theme="light"] .highlight .nx { color: #545454 } /* Name.Other */ +html[data-theme="light"] .highlight .py { color: #007faa } /* Name.Property */ +html[data-theme="light"] .highlight .nt { color: #007faa } /* Name.Tag */ +html[data-theme="light"] .highlight .nv { color: #d91e18 } /* Name.Variable */ +html[data-theme="light"] .highlight .ow { color: #7928a1 } /* Operator.Word */ +html[data-theme="light"] .highlight .pm { color: #545454 } /* Punctuation.Marker */ +html[data-theme="light"] .highlight .w { color: #545454 } /* Text.Whitespace */ +html[data-theme="light"] .highlight .mb { color: #797129 } /* Literal.Number.Bin */ +html[data-theme="light"] .highlight .mf { color: #797129 } /* Literal.Number.Float */ +html[data-theme="light"] .highlight .mh { color: #797129 } /* Literal.Number.Hex */ +html[data-theme="light"] .highlight .mi { color: #797129 } /* Literal.Number.Integer */ +html[data-theme="light"] .highlight .mo { color: #797129 } /* Literal.Number.Oct */ +html[data-theme="light"] .highlight .sa { color: #008000 } /* Literal.String.Affix */ +html[data-theme="light"] .highlight .sb { color: #008000 } /* Literal.String.Backtick */ +html[data-theme="light"] .highlight .sc { color: #008000 } /* Literal.String.Char */ +html[data-theme="light"] .highlight .dl { color: #008000 } /* Literal.String.Delimiter */ +html[data-theme="light"] .highlight .sd { color: #008000 } /* Literal.String.Doc */ +html[data-theme="light"] .highlight .s2 { color: #008000 } /* Literal.String.Double */ +html[data-theme="light"] .highlight .se { color: #008000 } /* Literal.String.Escape */ +html[data-theme="light"] .highlight .sh { color: #008000 } /* Literal.String.Heredoc */ +html[data-theme="light"] .highlight .si { color: #008000 } /* Literal.String.Interpol */ +html[data-theme="light"] .highlight .sx { color: #008000 } /* Literal.String.Other */ +html[data-theme="light"] .highlight .sr { color: #d91e18 } /* Literal.String.Regex */ +html[data-theme="light"] .highlight .s1 { color: #008000 } /* Literal.String.Single */ +html[data-theme="light"] .highlight .ss { color: #007faa } /* Literal.String.Symbol */ +html[data-theme="light"] .highlight .bp { color: #797129 } /* Name.Builtin.Pseudo */ +html[data-theme="light"] .highlight .fm { color: #007faa } /* Name.Function.Magic */ +html[data-theme="light"] .highlight .vc { color: #d91e18 } /* Name.Variable.Class */ +html[data-theme="light"] .highlight .vg { color: #d91e18 } /* Name.Variable.Global */ +html[data-theme="light"] .highlight .vi { color: #d91e18 } /* Name.Variable.Instance */ +html[data-theme="light"] .highlight .vm { color: #797129 } /* Name.Variable.Magic */ +html[data-theme="light"] .highlight .il { color: #797129 } /* 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..bda8a60272 --- /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:()=>w,afterRead:()=>b,afterWrite:()=>T,applyStyles:()=>D,arrow:()=>G,auto:()=>r,basePlacements:()=>a,beforeMain:()=>v,beforeRead:()=>g,beforeWrite:()=>E,bottom:()=>n,clippingParents:()=>h,computeStyles:()=>et,createPopper:()=>St,createPopperBase:()=>Lt,createPopperLite:()=>Dt,detectOverflow:()=>gt,end:()=>c,eventListeners:()=>nt,flip:()=>_t,hide:()=>yt,left:()=>o,main:()=>y,modifierPhases:()=>C,offset:()=>wt,placements:()=>m,popper:()=>u,popperGenerator:()=>kt,popperOffsets:()=>Et,preventOverflow:()=>At,read:()=>_,reference:()=>f,right:()=>s,start:()=>l,top:()=>i,variationPlacements:()=>p,viewport:()=>d,write:()=>A});var i="top",n="bottom",s="right",o="left",r="auto",a=[i,n,s,o],l="start",c="end",h="clippingParents",d="viewport",u="popper",f="reference",p=a.reduce((function(t,e){return t.concat([e+"-"+l,e+"-"+c])}),[]),m=[].concat(a,[r]).reduce((function(t,e){return t.concat([e,e+"-"+l,e+"-"+c])}),[]),g="beforeRead",_="read",b="afterRead",v="beforeMain",y="main",w="afterMain",E="beforeWrite",A="write",T="afterWrite",C=[g,_,b,v,y,w,E,A,T];function O(t){return t?(t.nodeName||"").toLowerCase():null}function x(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function k(t){return t instanceof x(t).Element||t instanceof Element}function L(t){return t instanceof x(t).HTMLElement||t instanceof HTMLElement}function S(t){return"undefined"!=typeof ShadowRoot&&(t instanceof x(t).ShadowRoot||t instanceof ShadowRoot)}const D={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];L(s)&&O(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}),{});L(n)&&O(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function $(t){return t.split("-")[0]}var I=Math.max,N=Math.min,P=Math.round;function M(){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 j(){return!/^((?!chrome|android).)*safari/i.test(M())}function F(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&L(t)&&(s=t.offsetWidth>0&&P(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&P(n.height)/t.offsetHeight||1);var r=(k(t)?x(t):window).visualViewport,a=!j()&&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 H(t){var e=F(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 B(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&S(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function W(t){return x(t).getComputedStyle(t)}function z(t){return["table","td","th"].indexOf(O(t))>=0}function R(t){return((k(t)?t.ownerDocument:t.document)||window.document).documentElement}function q(t){return"html"===O(t)?t:t.assignedSlot||t.parentNode||(S(t)?t.host:null)||R(t)}function V(t){return L(t)&&"fixed"!==W(t).position?t.offsetParent:null}function Y(t){for(var e=x(t),i=V(t);i&&z(i)&&"static"===W(i).position;)i=V(i);return i&&("html"===O(i)||"body"===O(i)&&"static"===W(i).position)?e:i||function(t){var e=/firefox/i.test(M());if(/Trident/i.test(M())&&L(t)&&"fixed"===W(t).position)return null;var i=q(t);for(S(i)&&(i=i.host);L(i)&&["html","body"].indexOf(O(i))<0;){var n=W(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 K(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Q(t,e,i){return I(t,N(e,i))}function X(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function U(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const G={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,r=t.state,l=t.name,c=t.options,h=r.elements.arrow,d=r.modifiersData.popperOffsets,u=$(r.placement),f=K(u),p=[o,s].indexOf(u)>=0?"height":"width";if(h&&d){var m=function(t,e){return X("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:U(t,a))}(c.padding,r),g=H(h),_="y"===f?i:o,b="y"===f?n:s,v=r.rects.reference[p]+r.rects.reference[f]-d[f]-r.rects.popper[p],y=d[f]-r.rects.reference[f],w=Y(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=Q(T,O,C),k=f;r.modifiersData[l]=((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)))&&B(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function J(t){return t.split("-")[1]}var Z={top:"auto",right:"auto",bottom:"auto",left:"auto"};function tt(t){var e,r=t.popper,a=t.popperRect,l=t.placement,h=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=o,C=i,O=window;if(p){var k=Y(r),L="clientHeight",S="clientWidth";k===x(r)&&"static"!==W(k=R(r)).position&&"absolute"===u&&(L="scrollHeight",S="scrollWidth"),(l===i||(l===o||l===s)&&h===c)&&(C=n,y-=(g&&k===O&&O.visualViewport?O.visualViewport.height:k[L])-a.height,y*=f?1:-1),l!==o&&(l!==i&&l!==n||h!==c)||(T=s,b-=(g&&k===O&&O.visualViewport?O.visualViewport.width:k[S])-a.width,b*=f?1:-1)}var D,$=Object.assign({position:u},p&&Z),I=!0===m?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:P(i*s)/s||0,y:P(n*s)/s||0}}({x:b,y},x(r)):{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 et={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:$(e.placement),variation:J(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,tt(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,tt(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 it={passive:!0};const nt={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=x(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,it)})),a&&l.addEventListener("resize",i.update,it),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,it)})),a&&l.removeEventListener("resize",i.update,it)}},data:{}};var st={left:"right",right:"left",bottom:"top",top:"bottom"};function ot(t){return t.replace(/left|right|bottom|top/g,(function(t){return st[t]}))}var rt={start:"end",end:"start"};function at(t){return t.replace(/start|end/g,(function(t){return rt[t]}))}function lt(t){var e=x(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ct(t){return F(R(t)).left+lt(t).scrollLeft}function ht(t){var e=W(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function dt(t){return["html","body","#document"].indexOf(O(t))>=0?t.ownerDocument.body:L(t)&&ht(t)?t:dt(q(t))}function ut(t,e){var i;void 0===e&&(e=[]);var n=dt(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=x(n),r=s?[o].concat(o.visualViewport||[],ht(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ut(q(r)))}function ft(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function pt(t,e,i){return e===d?ft(function(t,e){var i=x(t),n=R(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=j();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ct(t),y:l}}(t,i)):k(e)?function(t,e){var i=F(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):ft(function(t){var e,i=R(t),n=lt(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=I(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=I(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ct(t),l=-n.scrollTop;return"rtl"===W(s||i).direction&&(a+=I(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(R(t)))}function mt(t){var e,r=t.reference,a=t.element,h=t.placement,d=h?$(h):null,u=h?J(h):null,f=r.x+r.width/2-a.width/2,p=r.y+r.height/2-a.height/2;switch(d){case i:e={x:f,y:r.y-a.height};break;case n:e={x:f,y:r.y+r.height};break;case s:e={x:r.x+r.width,y:p};break;case o:e={x:r.x-a.width,y:p};break;default:e={x:r.x,y:r.y}}var m=d?K(d):null;if(null!=m){var g="y"===m?"height":"width";switch(u){case l:e[m]=e[m]-(r[g]/2-a[g]/2);break;case c:e[m]=e[m]+(r[g]/2-a[g]/2)}}return e}function gt(t,e){void 0===e&&(e={});var o=e,r=o.placement,l=void 0===r?t.placement:r,c=o.strategy,p=void 0===c?t.strategy:c,m=o.boundary,g=void 0===m?h:m,_=o.rootBoundary,b=void 0===_?d:_,v=o.elementContext,y=void 0===v?u:v,w=o.altBoundary,E=void 0!==w&&w,A=o.padding,T=void 0===A?0:A,C=X("number"!=typeof T?T:U(T,a)),x=y===u?f:u,S=t.rects.popper,D=t.elements[E?x:y],$=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ut(q(t)),i=["absolute","fixed"].indexOf(W(t).position)>=0&&L(t)?Y(t):t;return k(i)?e.filter((function(t){return k(t)&&B(t,i)&&"body"!==O(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=pt(t,i,n);return e.top=I(s.top,e.top),e.right=N(s.right,e.right),e.bottom=N(s.bottom,e.bottom),e.left=I(s.left,e.left),e}),pt(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}(k(D)?D:D.contextElement||R(t.elements.popper),g,b,p),P=F(t.elements.reference),M=mt({reference:P,element:S,strategy:"absolute",placement:l}),j=ft(Object.assign({},S,M)),H=y===u?j:P,z={top:$.top-H.top+C.top,bottom:H.bottom-$.bottom+C.bottom,left:$.left-H.left+C.left,right:H.right-$.right+C.right},V=t.modifiersData.offset;if(y===u&&V){var K=V[l];Object.keys(z).forEach((function(t){var e=[s,n].indexOf(t)>=0?1:-1,o=[i,n].indexOf(t)>=0?"y":"x";z[t]+=K[o]*e}))}return z}const _t={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,c=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var d=c.mainAxis,u=void 0===d||d,f=c.altAxis,g=void 0===f||f,_=c.fallbackPlacements,b=c.padding,v=c.boundary,y=c.rootBoundary,w=c.altBoundary,E=c.flipVariations,A=void 0===E||E,T=c.allowedAutoPlacements,C=e.options.placement,O=$(C),x=_||(O!==C&&A?function(t){if($(t)===r)return[];var e=ot(t);return[at(t),e,at(e)]}(C):[ot(C)]),k=[C].concat(x).reduce((function(t,i){return t.concat($(i)===r?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,l=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?m:c,d=J(n),u=d?l?p:p.filter((function(t){return J(t)===d})):a,f=u.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=u);var g=f.reduce((function(e,i){return e[i]=gt(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[$(i)],e}),{});return Object.keys(g).sort((function(t,e){return g[t]-g[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,I=!0,N=k[0],P=0;P=0,B=H?"width":"height",W=gt(e,{placement:M,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=H?F?s:o:F?n:i;L[B]>S[B]&&(z=ot(z));var R=ot(z),q=[];if(u&&q.push(W[j]<=0),g&&q.push(W[z]<=0,W[R]<=0),q.every((function(t){return t}))){N=M,I=!1;break}D.set(M,q)}if(I)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 bt(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 vt(t){return[i,s,n,o].some((function(e){return t[e]>=0}))}const yt={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=gt(e,{elementContext:"reference"}),a=gt(e,{altBoundary:!0}),l=bt(r,n),c=bt(a,s,o),h=vt(l),d=vt(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})}},wt={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,n=t.options,r=t.name,a=n.offset,l=void 0===a?[0,0]:a,c=m.reduce((function(t,n){return t[n]=function(t,e,n){var r=$(t),a=[o,i].indexOf(r)>=0?-1:1,l="function"==typeof n?n(Object.assign({},e,{placement:t})):n,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[o,s].indexOf(r)>=0?{x:h,y:c}:{x:c,y:h}}(n,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[r]=c}},Et={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=mt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},At={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,r=t.options,a=t.name,c=r.mainAxis,h=void 0===c||c,d=r.altAxis,u=void 0!==d&&d,f=r.boundary,p=r.rootBoundary,m=r.altBoundary,g=r.padding,_=r.tether,b=void 0===_||_,v=r.tetherOffset,y=void 0===v?0:v,w=gt(e,{boundary:f,rootBoundary:p,padding:g,altBoundary:m}),E=$(e.placement),A=J(e.placement),T=!A,C=K(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),P=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,M={x:0,y:0};if(x){if(h){var j,F="y"===C?i:o,B="y"===C?n:s,W="y"===C?"height":"width",z=x[C],R=z+w[F],q=z-w[B],V=b?-L[W]/2:0,X=A===l?k[W]:L[W],U=A===l?-L[W]:-k[W],G=e.elements.arrow,Z=b&&G?H(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[B],nt=Q(0,k[W],Z[W]),st=T?k[W]/2-V-nt-et-D.mainAxis:X-nt-et-D.mainAxis,ot=T?-k[W]/2+V+nt+it+D.mainAxis:U+nt+it+D.mainAxis,rt=e.elements.arrow&&Y(e.elements.arrow),at=rt?"y"===C?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(j=null==P?void 0:P[C])?j:0,ct=z+ot-lt,ht=Q(b?N(R,z+st-lt-at):R,z,b?I(q,ct):q);x[C]=ht,M[C]=ht-z}if(u){var dt,ut="x"===C?i:o,ft="x"===C?n:s,pt=x[O],mt="y"===O?"height":"width",_t=pt+w[ut],bt=pt-w[ft],vt=-1!==[i,o].indexOf(E),yt=null!=(dt=null==P?void 0:P[O])?dt:0,wt=vt?_t: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=Q(t,e,i);return n>i?i:n}(wt,pt,Et):Q(b?wt:_t,pt,b?Et:bt);x[O]=At,M[O]=At-pt}e.modifiersData[a]=M}},requiresIfExists:["offset"]};function Tt(t,e,i){void 0===i&&(i=!1);var n,s,o=L(e),r=L(e)&&function(t){var e=t.getBoundingClientRect(),i=P(e.width)/t.offsetWidth||1,n=P(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=R(e),l=F(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==O(e)||ht(a))&&(c=(n=e)!==x(n)&&L(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:lt(n)),L(e)?((h=F(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ct(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Ct(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 Ot={placement:"bottom",modifiers:[],strategy:"absolute"};function xt(){for(var t=arguments.length,e=new Array(t),i=0;i$t.has(t)&&$t.get(t).get(e)||null,remove(t,e){if(!$t.has(t))return;const i=$t.get(t);i.delete(e),0===i.size&&$t.delete(t)}},Nt="transitionend",Pt=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),Mt=t=>{t.dispatchEvent(new Event(Nt))},jt=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ft=t=>jt(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(Pt(t)):null,Ht=t=>{if(!jt(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},Bt=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),Wt=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?Wt(t.parentNode):null},zt=()=>{},Rt=t=>{t.offsetHeight},qt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Vt=[],Yt=()=>"rtl"===document.documentElement.dir,Kt=t=>{var e;e=()=>{const e=qt();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?(Vt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Vt)t()})),Vt.push(e)):e()},Qt=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,Xt=(t,e,i=!0)=>{if(!i)return void Qt(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(Nt,o),Qt(t))};e.addEventListener(Nt,o),setTimeout((()=>{s||Mt(e)}),n)},Ut=(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))])},Gt=/[^.]*(?=\..*)\.|.*/,Jt=/\..*/,Zt=/::\d+$/,te={};let ee=1;const ie={mouseenter:"mouseover",mouseleave:"mouseout"},ne=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 se(t,e){return e&&`${e}::${ee++}`||t.uidEvent||ee++}function oe(t){const e=se(t);return t.uidEvent=e,te[e]=te[e]||{},te[e]}function re(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function ae(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=de(t);return ne.has(o)||(o=t),[n,s,o]}function le(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=ae(e,i,n);if(e in ie){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=oe(t),c=l[a]||(l[a]={}),h=re(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=se(r,e.replace(Gt,"")),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 fe(s,{delegateTarget:r}),n.oneOff&&ue.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return fe(n,{delegateTarget:t}),i.oneOff&&ue.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 ce(t,e,i,n,s){const o=re(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function he(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&ce(t,e,i,r.callable,r.delegationSelector)}function de(t){return t=t.replace(Jt,""),ie[t]||t}const ue={on(t,e,i,n){le(t,e,i,n,!1)},one(t,e,i,n){le(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=ae(e,i,n),a=r!==e,l=oe(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))he(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(Zt,"");a&&!e.includes(s)||ce(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;ce(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=qt();let s=null,o=!0,r=!0,a=!1;e!==de(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=fe(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function fe(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 pe(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 me(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const ge={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${me(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${me(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]=pe(t.dataset[n])}return e},getDataAttribute:(t,e)=>pe(t.getAttribute(`data-bs-${me(e)}`))};class _e{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=jt(e)?ge.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...jt(e)?ge.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=jt(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 be extends _e{constructor(t,e){super(),(t=Ft(t))&&(this._element=t,this._config=this._getConfig(e),It.set(this._element,this.constructor.DATA_KEY,this))}dispose(){It.remove(this._element,this.constructor.DATA_KEY),ue.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Xt(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return It.get(Ft(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.2"}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 ve=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?Pt(i.trim()):null}return e},ye={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=>!Bt(t)&&Ht(t)))},getSelectorFromElement(t){const e=ve(t);return e&&ye.findOne(e)?e:null},getElementFromSelector(t){const e=ve(t);return e?ye.findOne(e):null},getMultipleElementsFromSelector(t){const e=ve(t);return e?ye.find(e):[]}},we=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;ue.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Bt(this))return;const s=ye.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ee=".bs.alert",Ae=`close${Ee}`,Te=`closed${Ee}`;class Ce extends be{static get NAME(){return"alert"}close(){if(ue.trigger(this._element,Ae).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(),ue.trigger(this._element,Te),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Ce.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)}}))}}we(Ce,"close"),Kt(Ce);const Oe='[data-bs-toggle="button"]';class xe extends be{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=xe.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}ue.on(document,"click.bs.button.data-api",Oe,(t=>{t.preventDefault();const e=t.target.closest(Oe);xe.getOrCreateInstance(e).toggle()})),Kt(xe);const ke=".bs.swipe",Le=`touchstart${ke}`,Se=`touchmove${ke}`,De=`touchend${ke}`,$e=`pointerdown${ke}`,Ie=`pointerup${ke}`,Ne={endCallback:null,leftCallback:null,rightCallback:null},Pe={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Me extends _e{constructor(t,e){super(),this._element=t,t&&Me.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Ne}static get DefaultType(){return Pe}static get NAME(){return"swipe"}dispose(){ue.off(this._element,ke)}_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(),Qt(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&&Qt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(ue.on(this._element,$e,(t=>this._start(t))),ue.on(this._element,Ie,(t=>this._end(t))),this._element.classList.add("pointer-event")):(ue.on(this._element,Le,(t=>this._start(t))),ue.on(this._element,Se,(t=>this._move(t))),ue.on(this._element,De,(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 je=".bs.carousel",Fe=".data-api",He="next",Be="prev",We="left",ze="right",Re=`slide${je}`,qe=`slid${je}`,Ve=`keydown${je}`,Ye=`mouseenter${je}`,Ke=`mouseleave${je}`,Qe=`dragstart${je}`,Xe=`load${je}${Fe}`,Ue=`click${je}${Fe}`,Ge="carousel",Je="active",Ze=".active",ti=".carousel-item",ei=Ze+ti,ii={ArrowLeft:ze,ArrowRight:We},ni={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},si={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class oi extends be{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=ye.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===Ge&&this.cycle()}static get Default(){return ni}static get DefaultType(){return si}static get NAME(){return"carousel"}next(){this._slide(He)}nextWhenVisible(){!document.hidden&&Ht(this._element)&&this.next()}prev(){this._slide(Be)}pause(){this._isSliding&&Mt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?ue.one(this._element,qe,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void ue.one(this._element,qe,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?He:Be;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&&ue.on(this._element,Ve,(t=>this._keydown(t))),"hover"===this._config.pause&&(ue.on(this._element,Ye,(()=>this.pause())),ue.on(this._element,Ke,(()=>this._maybeEnableCycle()))),this._config.touch&&Me.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of ye.find(".carousel-item img",this._element))ue.on(t,Qe,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(We)),rightCallback:()=>this._slide(this._directionToOrder(ze)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new Me(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=ii[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=ye.findOne(Ze,this._indicatorsElement);e.classList.remove(Je),e.removeAttribute("aria-current");const i=ye.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(Je),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===He,s=e||Ut(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>ue.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Re).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),Rt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(Je),i.classList.remove(Je,c,l),this._isSliding=!1,r(qe)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return ye.findOne(ei,this._element)}_getItems(){return ye.find(ti,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Yt()?t===We?Be:He:t===We?He:Be}_orderToDirection(t){return Yt()?t===Be?We:ze:t===Be?ze:We}static jQueryInterface(t){return this.each((function(){const e=oi.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)}))}}ue.on(document,Ue,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=ye.getElementFromSelector(this);if(!e||!e.classList.contains(Ge))return;t.preventDefault();const i=oi.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===ge.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),ue.on(window,Xe,(()=>{const t=ye.find('[data-bs-ride="carousel"]');for(const e of t)oi.getOrCreateInstance(e)})),Kt(oi);const ri=".bs.collapse",ai=`show${ri}`,li=`shown${ri}`,ci=`hide${ri}`,hi=`hidden${ri}`,di=`click${ri}.data-api`,ui="show",fi="collapse",pi="collapsing",mi=`:scope .${fi} .${fi}`,gi='[data-bs-toggle="collapse"]',_i={parent:null,toggle:!0},bi={parent:"(null|element)",toggle:"boolean"};class vi extends be{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=ye.find(gi);for(const t of i){const e=ye.getSelectorFromElement(t),i=ye.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 _i}static get DefaultType(){return bi}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=>vi.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(ue.trigger(this._element,ai).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(fi),this._element.classList.add(pi),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(pi),this._element.classList.add(fi,ui),this._element.style[e]="",ue.trigger(this._element,li)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(ue.trigger(this._element,ci).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,Rt(this._element),this._element.classList.add(pi),this._element.classList.remove(fi,ui);for(const t of this._triggerArray){const e=ye.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(pi),this._element.classList.add(fi),ue.trigger(this._element,hi)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(ui)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ft(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(gi);for(const e of t){const t=ye.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=ye.find(mi,this._config.parent);return ye.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=vi.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}ue.on(document,di,gi,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of ye.getMultipleElementsFromSelector(this))vi.getOrCreateInstance(t,{toggle:!1}).toggle()})),Kt(vi);const yi="dropdown",wi=".bs.dropdown",Ei=".data-api",Ai="ArrowUp",Ti="ArrowDown",Ci=`hide${wi}`,Oi=`hidden${wi}`,xi=`show${wi}`,ki=`shown${wi}`,Li=`click${wi}${Ei}`,Si=`keydown${wi}${Ei}`,Di=`keyup${wi}${Ei}`,$i="show",Ii='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Ni=`${Ii}.${$i}`,Pi=".dropdown-menu",Mi=Yt()?"top-end":"top-start",ji=Yt()?"top-start":"top-end",Fi=Yt()?"bottom-end":"bottom-start",Hi=Yt()?"bottom-start":"bottom-end",Bi=Yt()?"left-start":"right-start",Wi=Yt()?"right-start":"left-start",zi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Ri={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class qi extends be{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=ye.next(this._element,Pi)[0]||ye.prev(this._element,Pi)[0]||ye.findOne(Pi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return zi}static get DefaultType(){return Ri}static get NAME(){return yi}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Bt(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!ue.trigger(this._element,xi,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))ue.on(t,"mouseover",zt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add($i),this._element.classList.add($i),ue.trigger(this._element,ki,t)}}hide(){if(Bt(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(!ue.trigger(this._element,Ci,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))ue.off(t,"mouseover",zt);this._popper&&this._popper.destroy(),this._menu.classList.remove($i),this._element.classList.remove($i),this._element.setAttribute("aria-expanded","false"),ge.removeDataAttribute(this._menu,"popper"),ue.trigger(this._element,Oi,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!jt(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${yi.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:jt(this._config.reference)?t=Ft(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=St(t,this._menu,i)}_isShown(){return this._menu.classList.contains($i)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Bi;if(t.classList.contains("dropstart"))return Wi;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?ji:Mi:e?Hi:Fi}_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)&&(ge.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...Qt(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=ye.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Ht(t)));i.length&&Ut(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.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=ye.find(Ni);for(const i of e){const e=qi.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=[Ai,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:ye.prev(this,Ii)[0]||ye.next(this,Ii)[0]||ye.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}ue.on(document,Si,Ii,qi.dataApiKeydownHandler),ue.on(document,Si,Pi,qi.dataApiKeydownHandler),ue.on(document,Li,qi.clearMenus),ue.on(document,Di,qi.clearMenus),ue.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),Kt(qi);const Vi="backdrop",Yi="show",Ki=`mousedown.bs.${Vi}`,Qi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Xi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends _e{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Qi}static get DefaultType(){return Xi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void Qt(t);this._append();const e=this._getElement();this._config.isAnimated&&Rt(e),e.classList.add(Yi),this._emulateAnimation((()=>{Qt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Yi),this._emulateAnimation((()=>{this.dispose(),Qt(t)}))):Qt(t)}dispose(){this._isAppended&&(ue.off(this._element,Ki),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=Ft(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),ue.on(t,Ki,(()=>{Qt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Xt(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends _e{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),ue.off(document,Gi),ue.on(document,Ji,(t=>this._handleFocusin(t))),ue.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,ue.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=ye.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{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,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}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&&ge.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=ge.getDataAttribute(t,e);null!==i?(ge.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(jt(t))e(t);else for(const i of ye.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",En="show",An="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends be{constructor(t,e){super(t,e),this._dialog=ye.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||ue.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(ue.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(En),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){ue.off(window,hn),ue.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({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=ye.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),Rt(this._element),this._element.classList.add(En),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,ue.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){ue.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),ue.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),ue.on(this._element,bn,(t=>{ue.one(this._element,_n,(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(wn),this._resetAdjustments(),this._scrollBar.reset(),ue.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(ue.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(An)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(An),this._queueCallback((()=>{this._element.classList.remove(An),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=Yt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Yt()?"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=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}ue.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=ye.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),ue.one(e,pn,(t=>{t.defaultPrevented||ue.one(e,fn,(()=>{Ht(this)&&this.focus()}))}));const i=ye.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),we(On),Kt(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Bn=`click${xn}${kn}`,Wn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends be{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||ue.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),ue.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(ue.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),ue.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():ue.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){ue.on(this._element,Wn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():ue.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.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)}}))}}ue.on(document,Bn,'[data-bs-toggle="offcanvas"]',(function(t){const e=ye.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Bt(this))return;ue.one(e,Fn,(()=>{Ht(this)&&this.focus()}));const i=ye.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),ue.on(window,Ln,(()=>{for(const t of ye.find(In))qn.getOrCreateInstance(t).show()})),ue.on(window,Hn,(()=>{for(const t of ye.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),we(qn),Kt(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],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:[]},Yn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Kn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Qn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Yn.has(i)||Boolean(Kn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Xn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
    "},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends _e{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Xn}static get DefaultType(){return Un}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},Gn)}_setContent(t,e,i){const n=ye.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?jt(e)?this._putElementInTemplate(Ft(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)Qn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return Qt(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:Yt()?"left":"right",BOTTOM:"bottom",LEFT:Yt()?"right":"left"},as={allowList:Vn,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"},ls={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 cs extends be{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 as}static get DefaultType(){return ls}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),ue.off(this._element.closest(is),ns,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=ue.trigger(this._element,this.constructor.eventName("show")),e=(Wt(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),ue.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))ue.on(t,"mouseover",zt);this._queueCallback((()=>{ue.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!ue.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))ue.off(t,"mouseover",zt);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),ue.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(ts,es),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(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":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(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=Qt(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return St(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 Qt(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,...Qt(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)ue.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");ue.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),ue.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},ue.on(this._element.closest(is),ns,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=ge.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.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:Ft(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=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Kt(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Kt(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Es={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class As extends be{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 ws}static get DefaultType(){return Es}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=Ft(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&&(ue.off(this._config.target,ms),ue.on(this._config.target,ms,bs,(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=ye.find(bs,this._config.target);for(const e of t){if(!e.hash||Bt(e))continue;const t=ye.findOne(decodeURI(e.hash),this._element);Ht(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(_s),this._activateParents(t),ue.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))ye.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of ye.parents(t,".nav, .list-group"))for(const t of ye.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=ye.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=As.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]()}}))}}ue.on(window,gs,(()=>{for(const t of ye.find('[data-bs-spy="scroll"]'))As.getOrCreateInstance(t)})),Kt(As);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Bs="show",Ws=".dropdown-toggle",zs=`:not(${Ws})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ys extends be{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),ue.on(this._element,Ss,(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?ue.trigger(e,Cs,{relatedTarget:t}):null;ue.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(ye.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),ue.trigger(t,ks,{relatedTarget:e})):t.classList.add(Bs)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(ye.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),ue.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Bs)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!Bt(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=Ut(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ys.getOrCreateInstance(i).show())}_getChildren(){return ye.find(qs,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=ye.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=ye.findOne(t,i);s&&s.classList.toggle(n,e)};n(Ws,Fs),n(".dropdown-menu",Bs),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(qs)?t:ye.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ys.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}ue.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Bt(this)||Ys.getOrCreateInstance(this).show()})),ue.on(window,Ds,(()=>{for(const t of ye.find(Vs))Ys.getOrCreateInstance(t)})),Kt(Ys);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Us=`focusin${Ks}`,Gs=`focusout${Ks}`,Js=`hide${Ks}`,Zs=`hidden${Ks}`,to=`show${Ks}`,eo=`shown${Ks}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends be{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){ue.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),Rt(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),ue.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(ue.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),ue.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_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(){ue.on(this._element,Qs,(t=>this._onInteraction(t,!0))),ue.on(this._element,Xs,(t=>this._onInteraction(t,!1))),ue.on(this._element,Us,(t=>this._onInteraction(t,!0))),ue.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}function lo(t){"loading"!=document.readyState?t():document.addEventListener("DOMContentLoaded",t)}we(ao),Kt(ao),lo((function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new cs(t,{delay:{show:500,hide:100}})}))})),lo((function(){document.getElementById("pst-back-to-top").addEventListener("click",(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0}))})),lo((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}))}))})(); +//# 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..10f979d078 --- /dev/null +++ b/spec/_static/scripts/bootstrap.js.LICENSE.txt @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 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..e5bc15752d --- /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.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 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};\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.2';\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 !== '#' ? parseSelector(hrefAttribute.trim()) : null;\n }\n return selector;\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};\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};\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 div: [],\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