mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-16 17:22:55 +00:00
Merge topic 'gitlab_ci_doxygen'
930c3d2fb reproduce_ci_env better detects which stage a job is for 71d9d4311 Doxygen is now generated by gitlab and done on each master merge a652f7fe1 Update vtk-m doxygen to generate less warnings 97a2408fc Correct warnings for using TBB 2020 deprecated functions Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !2117
This commit is contained in:
commit
14338a559c
@ -38,6 +38,11 @@
|
||||
# - tbb
|
||||
# - openmp
|
||||
# - mpich2
|
||||
# * .gitlab/ci/docker/ubuntu2004/doxygen/
|
||||
# - gcc 9.3
|
||||
# - tbb
|
||||
# - openmp
|
||||
# - mpich2
|
||||
|
||||
.docker_image: &docker_image
|
||||
variables:
|
||||
@ -78,6 +83,12 @@
|
||||
extends:
|
||||
- .docker_image
|
||||
|
||||
.ubuntu2004_doxygen: &ubuntu2004_doxygen
|
||||
image: "kitware/vtkm:ci-doxygen-20200601"
|
||||
extends:
|
||||
- .docker_image
|
||||
|
||||
|
||||
.only-default: &only-default
|
||||
only:
|
||||
- master
|
||||
@ -88,12 +99,9 @@
|
||||
only:
|
||||
- master
|
||||
|
||||
|
||||
# General Longer Term Tasks:
|
||||
# - setup asan, and ubsan as sub-pipeline
|
||||
# - setup clang tidy as sub-pipeline
|
||||
#
|
||||
# Current Tasks:
|
||||
# - Determine if we can get sccache to work with CUDA
|
||||
# - Setup clang tidy as sub-pipeline
|
||||
# - Setup a machine to replicate the issue in https://gitlab.kitware.com/vtk/vtk-m/-/issues/447
|
||||
# Note: Centos7 doesn't work as they ship separate standard library
|
||||
# headers for each version. We will have to figure out something else
|
||||
@ -165,6 +173,7 @@ stages:
|
||||
include:
|
||||
- local: '/.gitlab/ci/centos7.yml'
|
||||
- local: '/.gitlab/ci/centos8.yml'
|
||||
- local: '/.gitlab/ci/doxygen.yml'
|
||||
- local: '/.gitlab/ci/rhel8.yml'
|
||||
- local: '/.gitlab/ci/ubuntu1604.yml'
|
||||
- local: '/.gitlab/ci/ubuntu1804.yml'
|
||||
|
33
.gitlab/ci/docker/ubuntu2004/doxygen/Dockerfile
Normal file
33
.gitlab/ci/docker/ubuntu2004/doxygen/Dockerfile
Normal file
@ -0,0 +1,33 @@
|
||||
FROM ubuntu:20.04
|
||||
LABEL maintainer "Robert Maynard<robert.maynard@kitware.com>"
|
||||
|
||||
# Base dependencies for building VTK-m projects
|
||||
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||
cmake \
|
||||
curl \
|
||||
doxygen \
|
||||
g++ \
|
||||
git \
|
||||
git-lfs \
|
||||
libmpich-dev \
|
||||
libomp-dev \
|
||||
libtbb-dev \
|
||||
mpich \
|
||||
ninja-build \
|
||||
rsync \
|
||||
ssh \
|
||||
software-properties-common
|
||||
|
||||
# Need to run git-lfs install manually on ubuntu based images when using the
|
||||
# system packaged version
|
||||
RUN git-lfs install
|
||||
|
||||
# Provide CMake 3.17 so we can re-run tests easily
|
||||
# This will be used when we run just the tests
|
||||
RUN mkdir /opt/cmake/ && \
|
||||
curl -L https://github.com/Kitware/CMake/releases/download/v3.17.3/cmake-3.17.3-Linux-x86_64.sh > cmake-3.17.3-Linux-x86_64.sh && \
|
||||
sh cmake-3.17.3-Linux-x86_64.sh --prefix=/opt/cmake/ --exclude-subdir --skip-license && \
|
||||
rm cmake-3.17.3-Linux-x86_64.sh && \
|
||||
ln -s /opt/cmake/bin/ctest /opt/cmake/bin/ctest-latest
|
||||
|
||||
ENV PATH "${PATH}:/opt/cmake/bin"
|
@ -34,6 +34,10 @@ cd ubuntu1804/cuda10.1
|
||||
sudo docker build -t kitware/vtkm:ci-ubuntu1804_cuda10.1-$date .
|
||||
cd ../..
|
||||
|
||||
cd ubuntu2004/doxygen/
|
||||
sudo docker build -t kitware/vtkm:ci-doxygen-$date .
|
||||
cd ../..
|
||||
|
||||
# sudo docker login --username=<docker_hub_name>
|
||||
sudo docker push kitware/vtkm
|
||||
sudo docker system prune
|
||||
|
34
.gitlab/ci/doxygen.yml
Normal file
34
.gitlab/ci/doxygen.yml
Normal file
@ -0,0 +1,34 @@
|
||||
|
||||
# Build on documentation for VTK-m on ubuntu2004 with TBB and OpenMP
|
||||
# Uses gcc 9
|
||||
# Uses MPICH2
|
||||
doxygen:
|
||||
stage: build
|
||||
environment:
|
||||
#establish that we need doxygen related
|
||||
#env variables
|
||||
name: doxygen-upload
|
||||
only:
|
||||
#make sure we are only trigged on
|
||||
#the vtk-m primary project
|
||||
variables:
|
||||
- '$DOXYGEN_UPLOAD_ENABLE == "true"'
|
||||
timeout: 30 minutes
|
||||
interruptible: true
|
||||
tags:
|
||||
- vtkm
|
||||
- docker
|
||||
- linux
|
||||
extends:
|
||||
- .ubuntu2004_doxygen
|
||||
before_script:
|
||||
- "cmake -V -P .gitlab/ci/config/gitlab_ci_setup.cmake"
|
||||
- "ctest -VV -S .gitlab/ci/ctest_configure.cmake"
|
||||
script:
|
||||
- eval `ssh-agent -s`
|
||||
- ssh-add <(echo "$DOC_API_KEY_BASE64" | base64 --decode)
|
||||
- doxygen build/docs/doxyfile
|
||||
- rsync -tv --recursive --delete -e "ssh -o StrictHostKeyChecking=no" build/docs/doxygen/html/ vtkm.documentation
|
||||
variables:
|
||||
CMAKE_BUILD_TYPE: Release
|
||||
VTKM_SETTINGS: "tbb+openmp+mpi+shared+docs"
|
@ -357,8 +357,6 @@ ALLEXTERNALS = NO
|
||||
|
||||
EXTERNAL_GROUPS = YES
|
||||
|
||||
PERL_PATH = /usr/bin/perl
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the dot tool
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -10,10 +10,16 @@
|
||||
|
||||
list(APPEND CTEST_CUSTOM_WARNING_EXCEPTION
|
||||
".*warning: ignoring loop annotation.*"
|
||||
".*warning: Included by graph for.*not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES."
|
||||
".*warning: Included by graph for.*not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.*"
|
||||
|
||||
# disable doxygen warnings about no matching members caused by auto keyword
|
||||
".*warning: no matching file member found for.*"
|
||||
|
||||
# disable doxygen warning from VTKM_DEPRECATED usage
|
||||
".*warning: Found.*while parsing initializer list!.*"
|
||||
|
||||
# disable doxygen warning about potential recursion.
|
||||
".*warning: Detected potential recursive class relation between class vtkm::exec::internal::ArrayPortalTransform"
|
||||
".*warning: Detected potential recursive class relation between .*"
|
||||
|
||||
# disable doxygen warning about not generating graph
|
||||
".*warning: Included by graph for"
|
||||
|
@ -57,23 +57,9 @@ def load_ci_file(ci_file_path):
|
||||
ci_state.update(yaml.safe_load(open(include_path)))
|
||||
return ci_state
|
||||
|
||||
def ci_stages_and_jobs(ci_state):
|
||||
stages = ci_state['stages']
|
||||
jobs = dict((s,[]) for s in stages)
|
||||
for key in ci_state:
|
||||
maybe_stage = key.split(':')
|
||||
if maybe_stage[0] in stages:
|
||||
jobs[maybe_stage[0]].append(maybe_stage[1])
|
||||
return jobs
|
||||
|
||||
def subset_yml(ci_state, stage, name):
|
||||
#given a stage and name generate a new yaml
|
||||
#file that only contains information for stage and name.
|
||||
#Does basic extend merging so that recreating the env is easier
|
||||
runner_yml = {}
|
||||
yml_name = stage+":"+name
|
||||
runner_yml[yml_name] = ci_state[yml_name]
|
||||
entry = runner_yml[yml_name]
|
||||
def flattened_entry_copy(ci_state, name):
|
||||
import copy
|
||||
entry = copy.deepcopy(ci_state[name])
|
||||
|
||||
#Flatten 'extends' entries, only presume the first level of inheritance is
|
||||
#important
|
||||
@ -86,6 +72,41 @@ def subset_yml(ci_state, stage, name):
|
||||
for e in entry['extends']:
|
||||
entry.update(ci_state[e])
|
||||
del entry['extends']
|
||||
return entry
|
||||
|
||||
def ci_stages_and_jobs(ci_state):
|
||||
stages = ci_state['stages']
|
||||
jobs = dict((s,[]) for s in stages)
|
||||
for key in ci_state:
|
||||
entry = flattened_entry_copy(ci_state, key)
|
||||
|
||||
is_job = False
|
||||
if 'stage' in entry:
|
||||
stage = entry['stage']
|
||||
if stage in stages:
|
||||
is_job = True
|
||||
|
||||
# if we have a job ( that isn't private )
|
||||
if is_job and not key.startswith('.'):
|
||||
# clean up the name
|
||||
clean_name = key
|
||||
if ':' in key:
|
||||
clean_name = key.split(':')[1]
|
||||
jobs[stage].append(clean_name)
|
||||
|
||||
|
||||
return jobs
|
||||
|
||||
def subset_yml(ci_state, stage, name):
|
||||
#given a stage and name generate a new yaml
|
||||
#file that only contains information for stage and name.
|
||||
#Does basic extend merging so that recreating the env is easier
|
||||
runner_yml = {}
|
||||
|
||||
if stage+":"+name in ci_state:
|
||||
name = stage+":"+name
|
||||
|
||||
runner_yml[name] = flattened_entry_copy(ci_state, name)
|
||||
return runner_yml
|
||||
|
||||
class CallMode(enum.Enum):
|
||||
@ -147,8 +168,12 @@ def create_container(ci_file_path, *args):
|
||||
#fully expanded into a single definition
|
||||
subset = subset_yml(ci_state, stage, name)
|
||||
|
||||
job_name = name
|
||||
if stage+":"+name in subset:
|
||||
job_name = stage+":"+name
|
||||
runner_name = stage+":"+name
|
||||
runner = subset[runner_name]
|
||||
|
||||
runner = subset[job_name]
|
||||
src_dir = get_root_dir()
|
||||
gitlab_env = [ k + '="' + v + '"' for k,v in runner['variables'].items()]
|
||||
|
||||
|
@ -131,6 +131,7 @@ VTKM_EXEC_CONT auto make_tuple(Ts&&... args) -> decltype(vtkm::MakeTuple(std::fo
|
||||
return vtkm::MakeTuple(std::forward<Ts>(args)...);
|
||||
}
|
||||
|
||||
/// @cond NONE
|
||||
namespace detail
|
||||
{
|
||||
struct TupleTransformFunctor
|
||||
@ -171,6 +172,7 @@ VTKM_EXEC_CONT auto TupleForEach(TupleType&& tuple, Function&& f)
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
/// @endcond
|
||||
|
||||
template <>
|
||||
class Tuple<>
|
||||
|
@ -123,8 +123,8 @@ struct VTKM_NEVER_EXPORT VecTraits
|
||||
/// \brief Get a vector of the same type but with a different component.
|
||||
///
|
||||
/// This type resolves to another vector with a different component type. For example,
|
||||
/// vtkm::VecTraits<vtkm::Vec<T, N>>::ReplaceComponentType<T2> is vtkm::Vec<T2, N>.
|
||||
/// This replacement is not recursive. So VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2>
|
||||
/// @code vtkm::VecTraits<vtkm::Vec<T, N>>::ReplaceComponentType<T2> @endcode is vtkm::Vec<T2, N>.
|
||||
/// This replacement is not recursive. So @code VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2> @endcode
|
||||
/// is vtkm::Vec<T2, N>.
|
||||
///
|
||||
template <typename NewComponentType>
|
||||
@ -134,7 +134,7 @@ struct VTKM_NEVER_EXPORT VecTraits
|
||||
///
|
||||
/// This type resolves to another vector with a different base component type. The replacement
|
||||
/// is recursive for nested types. For example,
|
||||
/// VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2> is Vec<Vec<T2, M>, N>.
|
||||
/// @code VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2> @endcode is Vec<Vec<T2, M>, N>.
|
||||
///
|
||||
template <typename NewComponentType>
|
||||
using ReplaceBaseComponentType = VecTemplate<
|
||||
@ -270,8 +270,8 @@ struct VTKM_NEVER_EXPORT VecTraits<vtkm::Vec<T, Size>>
|
||||
/// \brief Get a vector of the same type but with a different component.
|
||||
///
|
||||
/// This type resolves to another vector with a different component type. For example,
|
||||
/// vtkm::VecTraits<vtkm::Vec<T, N>>::ReplaceComponentType<T2> is vtkm::Vec<T2, N>.
|
||||
/// This replacement is not recursive. So VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2>
|
||||
/// @code vtkm::VecTraits<vtkm::Vec<T, N>>::ReplaceComponentType<T2> @endcode is vtkm::Vec<T2, N>.
|
||||
/// This replacement is not recursive. So @code VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2> @endcode
|
||||
/// is vtkm::Vec<T2, N>.
|
||||
///@{
|
||||
#if defined(VTKM_GCC) && (__GNUC__ <= 5)
|
||||
@ -289,7 +289,7 @@ struct VTKM_NEVER_EXPORT VecTraits<vtkm::Vec<T, Size>>
|
||||
///
|
||||
/// This type resolves to another vector with a different base component type. The replacement
|
||||
/// is recursive for nested types. For example,
|
||||
/// VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2> is Vec<Vec<T2, M>, N>.
|
||||
/// @code VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2> @endcode is Vec<Vec<T2, M>, N>.
|
||||
///@{
|
||||
#if defined(VTKM_GCC) && (__GNUC__ <= 5)
|
||||
// Silly workaround for bug in GCC <= 5
|
||||
@ -381,8 +381,8 @@ struct VTKM_NEVER_EXPORT VecTraits<vtkm::VecC<T>>
|
||||
/// \brief Get a vector of the same type but with a different component.
|
||||
///
|
||||
/// This type resolves to another vector with a different component type. For example,
|
||||
/// vtkm::VecTraits<vtkm::Vec<T, N>>::ReplaceComponentType<T2> is vtkm::Vec<T2, N>.
|
||||
/// This replacement is not recursive. So VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2>
|
||||
/// @code vtkm::VecTraits<vtkm::Vec<T, N>>::ReplaceComponentType<T2> @endcode is vtkm::Vec<T2, N>.
|
||||
/// This replacement is not recursive. So @code VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2> @endcode
|
||||
/// is vtkm::Vec<T2, N>.
|
||||
///
|
||||
template <typename NewComponentType>
|
||||
@ -392,7 +392,7 @@ struct VTKM_NEVER_EXPORT VecTraits<vtkm::VecC<T>>
|
||||
///
|
||||
/// This type resolves to another vector with a different base component type. The replacement
|
||||
/// is recursive for nested types. For example,
|
||||
/// VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2> is Vec<Vec<T2, M>, N>.
|
||||
/// @code VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2> @endcode is Vec<Vec<T2, M>, N>.
|
||||
///
|
||||
template <typename NewComponentType>
|
||||
using ReplaceBaseComponentType = vtkm::VecC<
|
||||
@ -470,8 +470,8 @@ struct VTKM_NEVER_EXPORT VecTraits<vtkm::VecCConst<T>>
|
||||
/// \brief Get a vector of the same type but with a different component.
|
||||
///
|
||||
/// This type resolves to another vector with a different component type. For example,
|
||||
/// vtkm::VecTraits<vtkm::Vec<T, N>>::ReplaceComponentType<T2> is vtkm::Vec<T2, N>.
|
||||
/// This replacement is not recursive. So VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2>
|
||||
/// @code vtkm::VecTraits<vtkm::Vec<T, N>>::ReplaceComponentType<T2> @endcode is vtkm::Vec<T2, N>.
|
||||
/// This replacement is not recursive. So @code VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2> @endcode
|
||||
/// is vtkm::Vec<T2, N>.
|
||||
///
|
||||
template <typename NewComponentType>
|
||||
@ -481,7 +481,7 @@ struct VTKM_NEVER_EXPORT VecTraits<vtkm::VecCConst<T>>
|
||||
///
|
||||
/// This type resolves to another vector with a different base component type. The replacement
|
||||
/// is recursive for nested types. For example,
|
||||
/// VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2> is Vec<Vec<T2, M>, N>.
|
||||
/// @code VecTraits<Vec<Vec<T, M>, N>::ReplaceComponentType<T2> @endcode is Vec<Vec<T2, M>, N>.
|
||||
///
|
||||
template <typename NewComponentType>
|
||||
using ReplaceBaseComponentType = vtkm::VecCConst<
|
||||
|
@ -23,7 +23,7 @@ namespace vtkm
|
||||
{
|
||||
namespace cont
|
||||
{
|
||||
|
||||
/// @cond NONE
|
||||
namespace detail
|
||||
{
|
||||
template <typename Device, typename T>
|
||||
@ -365,6 +365,7 @@ struct UpperBoundsFunctor
|
||||
}
|
||||
};
|
||||
} // namespace detail
|
||||
/// @endcond
|
||||
|
||||
struct Algorithm
|
||||
{
|
||||
|
@ -83,7 +83,6 @@ using IsInValidArrayHandle =
|
||||
template <typename ArrayHandle>
|
||||
using IsWritableArrayHandle =
|
||||
vtkm::internal::PortalSupportsSets<typename std::decay<ArrayHandle>::type::WritePortalType>;
|
||||
/// @}
|
||||
|
||||
/// Checks to see if the given object is an array handle. This check is
|
||||
/// compatible with C++11 type_traits. It a typedef named \c type that is
|
||||
|
@ -175,7 +175,7 @@
|
||||
/// \def VTKM_LOG_CAST_FAIL(inObj, outType)
|
||||
/// \brief Convenience macro for logging a failed cast of dynamic object.
|
||||
/// \param inObj The dynamic object.
|
||||
/// \param outObj The candidate type (or typelist) that was unsuccessful.
|
||||
/// \param outType The candidate type (or typelist) that was unsuccessful.
|
||||
|
||||
/// \def VTKM_LOG_TRYEXECUTE_FAIL(errorMessage, functorName, deviceId)
|
||||
/// \brief Convenience macro for logging a TryExecute failure to the Error level.
|
||||
|
@ -290,9 +290,10 @@ struct VTKM_ALWAYS_EXPORT ArrayPortalExtrude
|
||||
vtkm::Int32 NumberOfPlanes;
|
||||
bool UseCylindrical;
|
||||
};
|
||||
|
||||
template <typename PortalType>
|
||||
typename ArrayPortalExtrude<PortalType>::ValueType
|
||||
ArrayPortalExtrude<PortalType>::ArrayPortalExtrude::Get(vtkm::Id index) const
|
||||
typename ArrayPortalExtrude<PortalType>::ValueType ArrayPortalExtrude<PortalType>::Get(
|
||||
vtkm::Id index) const
|
||||
{
|
||||
using CompType = typename ValueType::ComponentType;
|
||||
|
||||
@ -313,8 +314,8 @@ ArrayPortalExtrude<PortalType>::ArrayPortalExtrude::Get(vtkm::Id index) const
|
||||
}
|
||||
|
||||
template <typename PortalType>
|
||||
typename ArrayPortalExtrude<PortalType>::ValueType
|
||||
ArrayPortalExtrude<PortalType>::ArrayPortalExtrude::Get(vtkm::Id2 index) const
|
||||
typename ArrayPortalExtrude<PortalType>::ValueType ArrayPortalExtrude<PortalType>::Get(
|
||||
vtkm::Id2 index) const
|
||||
{
|
||||
using CompType = typename ValueType::ComponentType;
|
||||
|
||||
@ -336,7 +337,7 @@ ArrayPortalExtrude<PortalType>::ArrayPortalExtrude::Get(vtkm::Id2 index) const
|
||||
|
||||
template <typename PortalType>
|
||||
vtkm::Vec<typename ArrayPortalExtrude<PortalType>::ValueType, 6>
|
||||
ArrayPortalExtrude<PortalType>::ArrayPortalExtrude::GetWedge(const IndicesExtrude& index) const
|
||||
ArrayPortalExtrude<PortalType>::GetWedge(const IndicesExtrude& index) const
|
||||
{
|
||||
using CompType = typename ValueType::ComponentType;
|
||||
|
||||
|
@ -54,7 +54,7 @@
|
||||
#include <vtkm/internal/Windows.h>
|
||||
|
||||
#include <tbb/task.h>
|
||||
#include <tbb/tbb_thread.h>
|
||||
#include <thread>
|
||||
|
||||
#if defined(VTKM_MSVC)
|
||||
#pragma pop_macro("__TBB_NO_IMPLICITLINKAGE")
|
||||
@ -69,7 +69,7 @@ namespace tbb
|
||||
namespace sort
|
||||
{
|
||||
|
||||
const size_t MAX_CORES = ::tbb::tbb_thread::hardware_concurrency();
|
||||
const size_t MAX_CORES = std::thread::hardware_concurrency();
|
||||
|
||||
// Simple TBB task wrapper around a generic functor.
|
||||
template <typename FunctorType>
|
||||
|
@ -41,6 +41,7 @@ struct FetchTagArrayTopologyMapIn
|
||||
{
|
||||
};
|
||||
|
||||
/// @cond NONE
|
||||
namespace detail
|
||||
{
|
||||
|
||||
@ -188,6 +189,7 @@ struct FetchArrayTopologyMapInImplementation<
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
/// @endcond
|
||||
|
||||
template <typename ExecObjectType>
|
||||
struct Fetch<vtkm::exec::arg::FetchTagArrayTopologyMapIn,
|
||||
|
@ -197,7 +197,7 @@ struct GetRowsColsSlices
|
||||
/// Get the number of rows, cols, and slices of a vtkm::cont::CellSetStructured
|
||||
/// @param[in] cells The input vtkm::cont::CellSetStructured
|
||||
/// @param[out] nRows Number of rows (x) in the cell set
|
||||
/// @param[out[ nCols Number of columns (y) in the cell set
|
||||
/// @param[out] nCols Number of columns (y) in the cell set
|
||||
/// @param[out] nSlices Number of slices (z) in the cell set
|
||||
void operator()(const vtkm::cont::CellSetStructured<2>& cells,
|
||||
vtkm::Id& nRows,
|
||||
|
@ -51,7 +51,7 @@ public:
|
||||
/// \param nearestNeighborIds Nearest neighbor in the traning data set for each points in the
|
||||
/// testing set
|
||||
/// \param distances Distances between query points and their nearest neighbors.
|
||||
/// \param device Tag for selecting device adapter.
|
||||
/// \param deviceId Tag for selecting device adapter.
|
||||
template <typename CoordType,
|
||||
typename CoordStorageTag1,
|
||||
typename CoordStorageTag2,
|
||||
|
Loading…
Reference in New Issue
Block a user