From e1b6116095e8ffcb166cd8a38491c11895e2bcb0 Mon Sep 17 00:00:00 2001 From: SecretXV Date: Mon, 4 Nov 2024 22:06:41 +0800 Subject: [PATCH 01/19] [DOC] initial commit Signed-off-by: SecretXV --- README.md | 9 ++++++++- docs/_static/paddle_logo.png | Bin 0 -> 243974 bytes 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 docs/_static/paddle_logo.png diff --git a/README.md b/README.md index c024b8b1689..80767d4cb36 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,14 @@

-# Open3D: A Modern Library for 3D Data Processing +# Open3D: A Modern Library for 3D Data Processing (Paddle backend) + +![paddle_logo](docs/_static/paddle_logo.png) + +> [!IMPORTANT] +> This branch(paddle) experimentally integrates [Paddle backend](https://www.paddlepaddle.org.cn/en/install/quick?docurl=/documentation/docs/en/develop/install/pip/linux-pip_en.html) to Open3D meachine learning module. +> +> It has verified on version v0.18.0 of Open3D. It is recommended to install **nightly-build(develop)** Paddle before running any code in this branch.

Homepage | diff --git a/docs/_static/paddle_logo.png b/docs/_static/paddle_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed4cc8ec82ee3b843dea1644ac6ced246e8a6f6 GIT binary patch literal 243974 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 Date: Tue, 5 Nov 2024 14:27:25 +0800 Subject: [PATCH 02/19] [CodeStyle] Add pre-commit config --- .pre-commit-config.yaml | 13 +++++++++++++ util/check_style.sh | 3 +++ 2 files changed, 16 insertions(+) create mode 100644 .pre-commit-config.yaml create mode 100755 util/check_style.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000000..68a45c56d5b --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,13 @@ +exclude: | + (?x)^( + 3rdparty/.+ + )$ +repos: +# Others +- repo: local + hooks: + - id: open3d_code_style + name: open3d code style check + description: Open3D default code style checker + entry: util/check_style.sh + language: system \ No newline at end of file diff --git a/util/check_style.sh b/util/check_style.sh new file mode 100755 index 00000000000..ad63e7ad560 --- /dev/null +++ b/util/check_style.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +python util/check_style.py --apply \ No newline at end of file From 58b31058414fb8943be8e38d959411452eac3255 Mon Sep 17 00:00:00 2001 From: SecretXV <145354053+SecretXV@users.noreply.github.com> Date: Tue, 5 Nov 2024 17:00:13 +0800 Subject: [PATCH 03/19] [Feat] Integrate Paddle to ml module (#1) * [Feat] Integrate Paddle to ml module Signed-off-by: SecretXV * CI retrigger Signed-off-by: SecretXV --------- Signed-off-by: SecretXV --- .../unicode_data/12.1.0/charmap.json.gz | Bin 0 -> 20688 bytes 3rdparty/cmake/FindPaddle.cmake | 120 ++++++ CMakeLists.txt | 4 + cpp/open3d/ml/CMakeLists.txt | 9 + cpp/open3d/ml/paddle/CMakeLists.txt | 110 +++++ cpp/open3d/ml/paddle/PaddleHelper.cpp | 42 ++ cpp/open3d/ml/paddle/PaddleHelper.h | 284 +++++++++++++ .../misc/BuildSpatialHashTableOpKernel.cpp | 34 ++ .../misc/BuildSpatialHashTableOpKernel.cu | 59 +++ .../paddle/misc/BuildSpatialHashTableOps.cpp | 121 ++++++ .../paddle/misc/FixedRadiusSearchOpKernel.cpp | 67 ++++ .../paddle/misc/FixedRadiusSearchOpKernel.cu | 93 +++++ .../ml/paddle/misc/FixedRadiusSearchOps.cpp | 190 +++++++++ .../misc/InvertNeighborsListOpKernel.cpp | 67 ++++ .../misc/InvertNeighborsListOpKernel.cu | 91 +++++ .../paddle/misc/InvertNeighborsListOpKernel.h | 26 ++ .../ml/paddle/misc/InvertNeighborsListOps.cpp | 102 +++++ .../ml/paddle/misc/InvertNeighborsListOps.h | 18 + .../ml/paddle/misc/KnnSearchOpKernel.cpp | 120 ++++++ cpp/open3d/ml/paddle/misc/KnnSearchOps.cpp | 140 +++++++ .../ml/paddle/misc/NeighborSearchAllocator.h | 54 +++ .../ml/paddle/misc/RadiusSearchOpKernel.cpp | 125 ++++++ cpp/open3d/ml/paddle/misc/RadiusSearchOps.cpp | 141 +++++++ .../ml/paddle/misc/RaggedToDenseOpKernel.cpp | 45 +++ .../ml/paddle/misc/RaggedToDenseOpKernel.cu | 48 +++ .../ml/paddle/misc/RaggedToDenseOpKernel.h | 24 ++ .../ml/paddle/misc/RaggedToDenseOps.cpp | 111 ++++++ cpp/pybind/CMakeLists.txt | 20 + cpp/pybind/_build_config.py.in | 2 + cpp/pybind/generate_paddle_ops_wrapper.py | 197 +++++++++ cpp/pybind/make_python_package.cmake | 2 +- python/open3d/ml/paddle/__init__.py | 27 ++ python/open3d/ml/paddle/classes/__init__.py | 22 + .../open3d/ml/paddle/classes/ragged_tensor.py | 199 +++++++++ python/open3d/ml/paddle/layers/__init__.py | 12 + python/open3d/ml/paddle/ops/__init__.py | 62 +++ .../paddle/python/layers/neighbor_search.py | 376 ++++++++++++++++++ .../ml/paddle/python/return_types.py.in | 29 ++ python/test/ml_ops/mltest.py | 110 ++++- .../test/ml_ops/test_fixed_radius_search.py | 12 + python/test/ml_ops/test_knn_search.py | 7 + python/test/ml_ops/test_radius_search.py | 7 + .../test/ml_ops/test_ragged_tensor_paddle.py | 209 ++++++++++ python/test/ml_ops/test_ragged_to_dense.py | 37 +- 44 files changed, 3560 insertions(+), 15 deletions(-) create mode 100644 .hypothesis/unicode_data/12.1.0/charmap.json.gz create mode 100644 3rdparty/cmake/FindPaddle.cmake create mode 100644 cpp/open3d/ml/paddle/CMakeLists.txt create mode 100644 cpp/open3d/ml/paddle/PaddleHelper.cpp create mode 100644 cpp/open3d/ml/paddle/PaddleHelper.h create mode 100644 cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOps.cpp create mode 100644 cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/misc/FixedRadiusSearchOps.cpp create mode 100644 cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.h create mode 100644 cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp create mode 100644 cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h create mode 100644 cpp/open3d/ml/paddle/misc/KnnSearchOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/misc/KnnSearchOps.cpp create mode 100644 cpp/open3d/ml/paddle/misc/NeighborSearchAllocator.h create mode 100644 cpp/open3d/ml/paddle/misc/RadiusSearchOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/misc/RadiusSearchOps.cpp create mode 100644 cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.h create mode 100644 cpp/open3d/ml/paddle/misc/RaggedToDenseOps.cpp create mode 100644 cpp/pybind/generate_paddle_ops_wrapper.py create mode 100644 python/open3d/ml/paddle/__init__.py create mode 100644 python/open3d/ml/paddle/classes/__init__.py create mode 100644 python/open3d/ml/paddle/classes/ragged_tensor.py create mode 100644 python/open3d/ml/paddle/layers/__init__.py create mode 100644 python/open3d/ml/paddle/ops/__init__.py create mode 100644 python/open3d/ml/paddle/python/layers/neighbor_search.py create mode 100644 python/open3d/ml/paddle/python/return_types.py.in create mode 100644 python/test/ml_ops/test_ragged_tensor_paddle.py diff --git a/.hypothesis/unicode_data/12.1.0/charmap.json.gz b/.hypothesis/unicode_data/12.1.0/charmap.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..8f1c7eb66a7331d82f847f5b3b76c7d82b5707fe GIT binary patch literal 20688 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

J8XU}SKiLg1-;gm%k(^xuf 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 literal 0 HcmV?d00001 diff --git a/3rdparty/cmake/FindPaddle.cmake b/3rdparty/cmake/FindPaddle.cmake new file mode 100644 index 00000000000..a564e0061f9 --- /dev/null +++ b/3rdparty/cmake/FindPaddle.cmake @@ -0,0 +1,120 @@ +# Find the Paddle root and use the provided cmake module +# The following variables will be set: +# - Paddle_FOUND +# - Paddle_VERSION +# - Paddle_ROOT +# - Paddle_DEFINITIONS +# +# - PADDLE_FOUND +# - PADDLE_INCLUDE_DIRS +# - PADDLE_LIBRARY_DIRS +# - PADDLE_LIBRARIES +# - PADDLE_CXX_FLAGS +# +# and import the target 'paddle'. + +if(NOT Paddle_FOUND) + # Searching for Paddle requires the python executable + if (NOT Python3_EXECUTABLE) + message(FATAL_ERROR "Python 3 not found in top level file") + endif() + + if(BUILD_CUDA_MODULE) + find_package(CUDAToolkit REQUIRED) + string(SUBSTRING ${CUDAToolkit_VERSION} 0 4 CUDA_VERSION) + endif() + + message(STATUS "Getting Paddle properties ...") + + set(Paddle_FETCH_PROPERTIES + "import os" + "import paddle" + "import sysconfig" + "print(paddle.__version__, end=';')" + "print(os.path.dirname(paddle.__file__), end=';')" + "print(sysconfig.get_path('include', scheme='posix_prefix'), end=';')" + ) + execute_process( + COMMAND ${Python3_EXECUTABLE} "-c" "${Paddle_FETCH_PROPERTIES}" + OUTPUT_VARIABLE Paddle_PROPERTIES + ) + + + list(GET Paddle_PROPERTIES 0 Paddle_VERSION) + list(GET Paddle_PROPERTIES 1 Paddle_ROOT) + list(GET Paddle_PROPERTIES 2 Python_INCLUDE) + + set(Paddle_CXX11_ABI True) + + unset(Paddle_FETCH_PROPERTIES) + unset(Paddle_PROPERTIES) + + add_library(paddle STATIC IMPORTED) + + # handle include directories + set(PADDLE_INCLUDE_DIRS) + list(APPEND PADDLE_INCLUDE_DIRS "${Paddle_ROOT}/include") + list(APPEND PADDLE_INCLUDE_DIRS "${Paddle_ROOT}/include/third_party") + list(APPEND PADDLE_INCLUDE_DIRS "${Python_INCLUDE}") + + if(BUILD_CUDA_MODULE) + list(APPEND PADDLE_INCLUDE_DIRS "${CUDAToolkit_INCLUDE_DIRS}") + endif() + + # handle library directories + set(PADDLE_LIBRARY_DIRS) + list(APPEND PADDLE_LIBRARY_DIRS "${Paddle_ROOT}/libs") + list(APPEND PADDLE_LIBRARY_DIRS "${Paddle_ROOT}/base") + + if(BUILD_CUDA_MODULE) + list(APPEND PADDLE_LIBRARY_DIRS "${CUDAToolkit_LIBRARY_DIR}") + endif() + + # handle libraries + set(PADDLE_LIBRARIES) + find_library(PADDLE_LIB NAMES paddle PATHS "${Paddle_ROOT}/base") + list(APPEND PADDLE_LIBRARY_DIRS "${PADDLE_LIB}") + + if(BUILD_CUDA_MODULE) + find_library(CUDART_LIB NAMES cudart PATHS "${CUDAToolkit_LIBRARY_DIR}") + list(APPEND PADDLE_LIBRARY_DIRS "${CUDART_LIB}") + endif() + + # handle compile flags + set(PADDLE_CXX_FLAGS) + if(BUILD_CUDA_MODULE) + set(PADDLE_CXX_FLAGS "-DPADDLE_WITH_CUDA ${PADDLE_CXX_FLAGS}") + endif() + + set_target_properties(paddle PROPERTIES + IMPORTED_LOCATION "${PADDLE_LIB}" + ) + set_target_properties(paddle PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${PADDLE_INCLUDE_DIRS}" + ) + set_property(TARGET paddle PROPERTY INTERFACE_COMPILE_OPTIONS "${PADDLE_CXX_FLAGS}") + + set(PADDLE_FOUND True) +endif() + +if(PRINT_ONCE) + message(STATUS "Paddle version: ${Paddle_VERSION}") + message(STATUS " root dir: ${Paddle_ROOT}") + message(STATUS " compile flags: ${PADDLE_CXX_FLAGS}") + if (UNIX AND NOT APPLE) + message(STATUS " use cxx11 abi: ${Paddle_CXX11_ABI}") + endif() + foreach(idir ${PADDLE_INCLUDE_DIRS}) + message(STATUS " include dirs: ${idir}") + endforeach(idir) + foreach(ldir ${PADDLE_LIBRARY_DIRS}) + message(STATUS " library dirs: ${ldir}") + endforeach(ldir) + foreach(lib ${PADDLE_LIBRARIES}) + message(STATUS " libraries: ${lib}") + endforeach(lib) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Paddle DEFAULT_MSG Paddle_VERSION + Paddle_ROOT) diff --git a/CMakeLists.txt b/CMakeLists.txt index a87d542b553..a710f075412 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,6 +134,7 @@ option(BUILD_AZURE_KINECT "Build support for Azure Kinect sensor" OFF # ML library options option(BUILD_TENSORFLOW_OPS "Build ops for TensorFlow" OFF) option(BUILD_PYTORCH_OPS "Build ops for PyTorch" OFF) +option(BUILD_PADDLE_OPS "Build ops for Paddle" OFF) option(BUNDLE_OPEN3D_ML "Includes the Open3D-ML repo in the wheel" OFF) # Release build options @@ -288,6 +289,9 @@ endif() if(BUILD_SYCL_MODULE AND BUILD_PYTORCH_OPS) message(FATAL_ERROR "BUILD_SYCL_MODULE=ON requires BUILD_PYTORCH_OPS=OFF") endif() +if(BUILD_SYCL_MODULE AND BUILD_PADDLE_OPS) + message(FATAL_ERROR "BUILD_SYCL_MODULE=ON requires BUILD_PADDLE_OPS=OFF") +endif() if(BUILD_SYCL_MODULE AND BUILD_CUDA_MODULE) message(FATAL_ERROR "BUILD_SYCL_MODULE and BUILD_SYCL_MODULE cannot be on at the same time for now.") endif() diff --git a/cpp/open3d/ml/CMakeLists.txt b/cpp/open3d/ml/CMakeLists.txt index 35f0b65112a..be445a9f238 100644 --- a/cpp/open3d/ml/CMakeLists.txt +++ b/cpp/open3d/ml/CMakeLists.txt @@ -3,6 +3,10 @@ if (BUILD_TENSORFLOW_OPS AND WIN32) # see https://github.com/tensorflow/custom-op/issues/24 endif() +if (BUILD_PADDLE_OPS AND (WIN32 OR APPLE)) + message(FATAL_ERROR "Building Paddle ops on Windows or MacOS is currently not supported.") +endif() + if (BUILD_TENSORFLOW_OPS) add_subdirectory(tensorflow) endif() @@ -11,4 +15,9 @@ if (BUILD_PYTORCH_OPS) add_subdirectory(pytorch) endif() +if (BUILD_PADDLE_OPS) + add_subdirectory(paddle) +endif() + + add_subdirectory(contrib) diff --git a/cpp/open3d/ml/paddle/CMakeLists.txt b/cpp/open3d/ml/paddle/CMakeLists.txt new file mode 100644 index 00000000000..73d1864210c --- /dev/null +++ b/cpp/open3d/ml/paddle/CMakeLists.txt @@ -0,0 +1,110 @@ +if(BUILD_CUDA_MODULE) + message(STATUS "Building Paddle ops with CUDA") +else() + message(STATUS "Building Paddle ops") +endif() + +set(PRINT_ONCE ON) +find_package(Paddle REQUIRED) + +if (Paddle_VERSION VERSION_LESS 3.0.0) + message(FATAL_ERROR "Please update to Paddle 3.0.0+ to build Paddle Ops.") +endif() + +add_library(open3d_paddle_ops SHARED) + +target_sources(open3d_paddle_ops PRIVATE + PaddleHelper.cpp + misc/BuildSpatialHashTableOpKernel.cpp + misc/BuildSpatialHashTableOps.cpp + misc/FixedRadiusSearchOps.cpp + misc/FixedRadiusSearchOpKernel.cpp + misc/RadiusSearchOps.cpp + misc/RadiusSearchOpKernel.cpp + misc/InvertNeighborsListOps.cpp + misc/InvertNeighborsListOpKernel.cpp + misc/KnnSearchOps.cpp + misc/KnnSearchOpKernel.cpp + misc/RaggedToDenseOpKernel.cpp + misc/RaggedToDenseOps.cpp +) + +if (BUILD_CUDA_MODULE) + target_sources(open3d_paddle_ops PRIVATE + misc/BuildSpatialHashTableOpKernel.cu + misc/FixedRadiusSearchOpKernel.cu + misc/InvertNeighborsListOpKernel.cu + misc/RaggedToDenseOpKernel.cu + ) + +endif() + +open3d_show_and_abort_on_warning(open3d_paddle_ops) +open3d_set_global_properties(open3d_paddle_ops) + +# Set output directory according to architecture (cpu/cuda) +get_target_property(PADDLE_OPS_DIR open3d_paddle_ops LIBRARY_OUTPUT_DIRECTORY) +set(PADDLE_OPS_ARCH_DIR + "${PADDLE_OPS_DIR}/$,cuda,cpu>") +set_target_properties(open3d_paddle_ops PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${PADDLE_OPS_ARCH_DIR}" + ARCHIVE_OUTPUT_DIRECTORY "${PADDLE_OPS_ARCH_DIR}") + +# Do not add "lib" prefix +set_target_properties(open3d_paddle_ops PROPERTIES PREFIX "") +set_target_properties(open3d_paddle_ops PROPERTIES DEBUG_POSTFIX "_debug") + +target_include_directories(open3d_paddle_ops SYSTEM PRIVATE + ${PROJECT_SOURCE_DIR}/cpp + ${PADDLE_INCLUDE_DIRS} +) + +target_link_libraries(open3d_paddle_ops PRIVATE + paddle + Open3D::Open3D + Open3D::3rdparty_eigen3 + Open3D::3rdparty_fmt + Open3D::3rdparty_nanoflann + Open3D::3rdparty_parallelstl + Open3D::3rdparty_tbb +) + +if (BUILD_CUDA_MODULE) + target_link_libraries(open3d_paddle_ops PRIVATE + Open3D::3rdparty_cutlass + ${PADDLE_LIBRARIES} + CUDA::cuda_driver + ) + + if (TARGET Open3D::3rdparty_cub) + target_link_libraries(open3d_paddle_ops PRIVATE + Open3D::3rdparty_cub + ) + endif() +endif() + +install(TARGETS open3d_paddle_ops EXPORT Open3DPaddleOps + LIBRARY DESTINATION ${Open3D_INSTALL_LIB_DIR} +) +install(EXPORT Open3DPaddleOps NAMESPACE ${PROJECT_NAME}:: DESTINATION ${Open3D_INSTALL_CMAKE_DIR}) + +if (BUILD_SHARED_LIBS AND UNIX) +file(CONFIGURE OUTPUT open3d_paddle_ops.pc.in + CONTENT [=[ +prefix=${pcfiledir}/../.. +libdir=${prefix}/lib +includedir=${prefix}/include/ + +Name: Open3D Paddle Ops +Description: @PROJECT_DESCRIPTION@ This library contains 3D ML Ops for use with Paddle. +URL: @PROJECT_HOMEPAGE_URL@ +Version: @PROJECT_VERSION@ +Requires: Open3D = @PROJECT_VERSION@ +Cflags: +Libs: -lopen3d_paddle_ops]=] @ONLY NEWLINE_STYLE LF) + file(GENERATE OUTPUT open3d_paddle_ops.pc INPUT + "${CMAKE_CURRENT_BINARY_DIR}/open3d_paddle_ops.pc.in" + TARGET open3d_paddle_ops) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/open3d_paddle_ops.pc" + DESTINATION "${Open3D_INSTALL_LIB_DIR}/pkgconfig") +endif() diff --git a/cpp/open3d/ml/paddle/PaddleHelper.cpp b/cpp/open3d/ml/paddle/PaddleHelper.cpp new file mode 100644 index 00000000000..9a0c00065cd --- /dev/null +++ b/cpp/open3d/ml/paddle/PaddleHelper.cpp @@ -0,0 +1,42 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- + +#include "PaddleHelper.h" + +paddle::Tensor InitializedEmptyTensor(const phi::DataType dtype, + const phi::IntArray& shape, + const phi::Place& place) { + switch (dtype) { + case phi::DataType::INT8: + return InitializedEmptyTensor(shape, place); + break; + case phi::DataType::UINT8: + return InitializedEmptyTensor(shape, place); + break; + case phi::DataType::INT16: + return InitializedEmptyTensor(shape, place); + break; + case phi::DataType::FLOAT32: + return InitializedEmptyTensor(shape, place); + break; + case phi::DataType::INT32: + return InitializedEmptyTensor(shape, place); + break; + case phi::DataType::FLOAT64: + return InitializedEmptyTensor(shape, place); + break; + case phi::DataType::INT64: + return InitializedEmptyTensor(shape, place); + break; + default: + PD_CHECK(false, + "Only support phi::DataType as `INT8`, `UINT8`, `INT16`, " + "`FLOAT32`, `FLOAT64`, " + "`INT32` and `INT64` but got %s.", + phi::DataTypeToString(dtype)); + } +} diff --git a/cpp/open3d/ml/paddle/PaddleHelper.h b/cpp/open3d/ml/paddle/PaddleHelper.h new file mode 100644 index 00000000000..5ef6c6dd917 --- /dev/null +++ b/cpp/open3d/ml/paddle/PaddleHelper.h @@ -0,0 +1,284 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include + +#include +#include + +#include "open3d/ml/ShapeChecking.h" + +// Macros for checking tensor properties +#define CHECK_CUDA(x) \ + do { \ + PD_CHECK(x.is_gpu(), #x " must be a CUDA tensor"); \ + } while (0) + +// NOTE: The input Tensor will be preprocessed into a contiguous Tensor within +// the execution function of the custom operator, so CHECK_CONTIGUOUS will be +// always True as there is no need for an explicit conversion in Open3D. For +// reference, please see: +// https://github.com/PaddlePaddle/Paddle/blob/65126f558a5c0fbb0cd1aa0a42844a73632ff9e9/paddle/fluid/eager/custom_operator/custom_operator_utils.cc#L803-L810 +#define CHECK_CONTIGUOUS(x) \ + do { \ + } while (0) + +#define CHECK_TYPE(x, type) \ + do { \ + PD_CHECK(x.dtype() == type, #x " must have type " #type); \ + } while (0) + +#define CHECK_SAME_DEVICE_TYPE(...) \ + do { \ + if (!SameDeviceType({__VA_ARGS__})) { \ + PD_CHECK(false, \ + #__VA_ARGS__ \ + " must all have the same device type but got " + \ + TensorInfoStr({__VA_ARGS__})); \ + } \ + } while (0) + +#define CHECK_SAME_DTYPE(...) \ + do { \ + if (!SameDtype({__VA_ARGS__})) { \ + PD_CHECK(false, #__VA_ARGS__ \ + " must all have the same dtype but got " + \ + TensorInfoStr({__VA_ARGS__})); \ + } \ + } while (0) +// Conversion from standard types to paddle types +typedef std::remove_const::type + PaddleDtype_t; +template +inline PaddleDtype_t ToPaddleDtype() { + PD_CHECK(false, "Unsupported type"); +} +template <> +inline PaddleDtype_t ToPaddleDtype() { + return paddle::DataType::UINT8; +} +template <> +inline PaddleDtype_t ToPaddleDtype() { + return paddle::DataType::INT8; +} +template <> +inline PaddleDtype_t ToPaddleDtype() { + return paddle::DataType::INT16; +} +template <> +inline PaddleDtype_t ToPaddleDtype() { + return paddle::DataType::INT32; +} +template <> +inline PaddleDtype_t ToPaddleDtype() { + return paddle::DataType::INT64; +} +template <> +inline PaddleDtype_t ToPaddleDtype() { + return paddle::DataType::FLOAT32; +} +template <> +inline PaddleDtype_t ToPaddleDtype() { + return paddle::DataType::FLOAT64; +} + +// convenience function for comparing standard types with paddle types +template +inline bool ComparePaddleDtype(const TDtype& t) { + return ToPaddleDtype() == t; +} + +// convenience function to check if all tensors have the same device type +inline bool SameDeviceType(std::initializer_list tensors) { + if (tensors.size()) { + auto device_type = tensors.begin()->place().GetDeviceType(); + for (const auto& t : tensors) { + if (device_type != t.place().GetDeviceType()) { + return false; + } + } + } + return true; +} + +// convenience function to check if all tensors have the same dtype +inline bool SameDtype(std::initializer_list tensors) { + if (tensors.size()) { + auto dtype = tensors.begin()->dtype(); + for (const auto& t : tensors) { + if (dtype != t.dtype()) { + return false; + } + } + } + return true; +} + +inline std::string TensorInfoStr( + std::initializer_list tensors) { + std::stringstream sstr; + size_t count = 0; + for (const auto& t : tensors) { + sstr << "Tensor(" << t.size() << ", " << t.place() << ")"; + ++count; + if (count < tensors.size()) sstr << ", "; + } + return sstr.str(); +} + +// convenience function for creating a tensor for temp memory +inline paddle::Tensor CreateTempTensor(const int64_t size, + const paddle::Place& device, + void** ptr = nullptr) { + paddle::Tensor tensor = + paddle::empty({size}, ToPaddleDtype(), device); + if (ptr) { + *ptr = tensor.data(); + } + return tensor; +} + +inline std::vector GetShapeVector( + paddle::Tensor tensor) { + using namespace open3d::ml::op_util; + const auto old_shape = tensor.shape(); + std::vector shape; + for (auto i = 0u; i < old_shape.size(); ++i) { + shape.push_back(old_shape[i]); + } + return shape; +} + +template +std::tuple CheckShape(paddle::Tensor tensor, + TDimX&& dimex, + TArgs&&... args) { + return open3d::ml::op_util::CheckShape(GetShapeVector(tensor), + std::forward(dimex), + std::forward(args)...); +} + +// +// Macros for checking the shape of Tensors. +// Usage: +// { +// using namespace open3d::ml::op_util; +// Dim w("w"); +// Dim h("h"); +// CHECK_SHAPE(tensor1, 10, w, h); // checks if the first dim is 10 +// // and assigns w and h based on +// // the shape of tensor1 +// +// CHECK_SHAPE(tensor2, 10, 20, h); // this checks if the the last dim +// // of tensor2 matches the last dim +// // of tensor1. The first two dims +// // must match 10, 20. +// } +// +// +// See "../ShapeChecking.h" for more info and limitations. +// +#define CHECK_SHAPE(tensor, ...) \ + do { \ + bool cs_success_; \ + std::string cs_errstr_; \ + std::tie(cs_success_, cs_errstr_) = CheckShape(tensor, __VA_ARGS__); \ + PD_CHECK(cs_success_, \ + "invalid shape for '" #tensor "', " + cs_errstr_); \ + } while (0) + +#define CHECK_SHAPE_COMBINE_FIRST_DIMS(tensor, ...) \ + do { \ + bool cs_success_; \ + std::string cs_errstr_; \ + std::tie(cs_success_, cs_errstr_) = \ + CheckShape(tensor, __VA_ARGS__); \ + PD_CHECK(cs_success_, \ + "invalid shape for '" #tensor "', " + cs_errstr_); \ + } while (0) + +#define CHECK_SHAPE_IGNORE_FIRST_DIMS(tensor, ...) \ + do { \ + bool cs_success_; \ + std::string cs_errstr_; \ + std::tie(cs_success_, cs_errstr_) = \ + CheckShape(tensor, __VA_ARGS__); \ + PD_CHECK(cs_success_, \ + "invalid shape for '" #tensor "', " + cs_errstr_); \ + } while (0) + +#define CHECK_SHAPE_COMBINE_LAST_DIMS(tensor, ...) \ + do { \ + bool cs_success_; \ + std::string cs_errstr_; \ + std::tie(cs_success_, cs_errstr_) = \ + CheckShape(tensor, __VA_ARGS__); \ + PD_CHECK(cs_success_, \ + "invalid shape for '" #tensor "', " + cs_errstr_); \ + } while (0) + +#define CHECK_SHAPE_IGNORE_LAST_DIMS(tensor, ...) \ + do { \ + bool cs_success_; \ + std::string cs_errstr_; \ + std::tie(cs_success_, cs_errstr_) = \ + CheckShape(tensor, __VA_ARGS__); \ + PD_CHECK(cs_success_, \ + "invalid shape for '" #tensor "', " + cs_errstr_); \ + } while (0) + +#ifdef BUILD_CUDA_MODULE +static void cudaFreeWrapper(void* ptr) { + phi::gpuError_t result = cudaFree(ptr); + PADDLE_ENFORCE_GPU_SUCCESS(result); +} +#endif + +// NOTE: Hack to support empty tensor, like Tensor(shape=[0], []) +template +paddle::Tensor InitializedEmptyTensor(const phi::IntArray& shape, + const phi::Place& place) { + int64_t size = 1; + for (auto v : shape.GetData()) { + size *= v; + } + PD_CHECK(size == 0, "The numel of empty tensor is not equal to 0."); + + paddle::Deleter deleter; + T* ptr = nullptr; + if (phi::is_gpu_place(place)) { +#ifdef BUILD_CUDA_MODULE + phi::gpuError_t result = cudaMalloc(&ptr, sizeof(T) * 1); + PADDLE_ENFORCE_GPU_SUCCESS(result); + deleter = std::function(cudaFreeWrapper); +#else + PD_CHECK(false, + "InitializedEmptyTensor was not compiled with CUDA support"); +#endif + } else if (phi::is_cpu_place(place)) { + ptr = (T*)malloc(sizeof(T) * 1); + deleter = std::function(free); + } else { + PD_CHECK(false, "Not supported backend!"); + } + + // NOTE: In Paddle, the stride of an empty (0-size) tensor can be the same + // as its shape. + return paddle::from_blob(static_cast(ptr), shape, shape, + paddle::DataType(ToPaddleDtype()), + phi::DataLayout::NCHW, place, deleter); +} + +paddle::Tensor InitializedEmptyTensor(const phi::DataType dtype, + const phi::IntArray& shape, + const phi::Place& place); diff --git a/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cpp b/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cpp new file mode 100644 index 00000000000..2bce9fed246 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cpp @@ -0,0 +1,34 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/core/nns/FixedRadiusSearchImpl.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +template +void BuildSpatialHashTableCPU(const paddle::Tensor& points, + double radius, + const paddle::Tensor& points_row_splits, + const std::vector& hash_table_splits, + paddle::Tensor& hash_table_index, + paddle::Tensor& hash_table_cell_splits) { + open3d::core::nns::impl::BuildSpatialHashTableCPU( + points.shape()[0], points.data(), T(radius), + points_row_splits.shape()[0], points_row_splits.data(), + hash_table_splits.data(), hash_table_cell_splits.shape()[0], + reinterpret_cast(const_cast( + hash_table_cell_splits.data())), + reinterpret_cast( + const_cast(hash_table_index.data()))); +} +#define INSTANTIATE(T) \ + template void BuildSpatialHashTableCPU( \ + const paddle::Tensor&, double, const paddle::Tensor&, \ + const std::vector&, paddle::Tensor&, paddle::Tensor&); + +INSTANTIATE(float) +INSTANTIATE(double) diff --git a/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cu b/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cu new file mode 100644 index 00000000000..daab5ad386a --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cu @@ -0,0 +1,59 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/core/nns/FixedRadiusSearchImpl.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::core::nns; + +template +void BuildSpatialHashTableCUDA(const paddle::Tensor& points, + double radius, + const paddle::Tensor& points_row_splits, + const std::vector& hash_table_splits, + paddle::Tensor& hash_table_index, + paddle::Tensor& hash_table_cell_splits) { + auto stream = points.stream(); + // -1 means current global place + auto cuda_place_props = phi::backends::gpu::GetDeviceProperties(-1); + const int texture_alignment = cuda_place_props.textureAlignment; + + void* temp_ptr = nullptr; + size_t temp_size = 0; + + // determine temp_size + impl::BuildSpatialHashTableCUDA( + stream, temp_ptr, temp_size, texture_alignment, points.shape()[0], + points.data(), T(radius), points_row_splits.shape()[0], + points_row_splits.data(), hash_table_splits.data(), + hash_table_cell_splits.shape()[0], + reinterpret_cast(const_cast( + hash_table_cell_splits.data())), + reinterpret_cast( + const_cast(hash_table_index.data()))); + auto place = points.place(); + auto temp_tensor = CreateTempTensor(temp_size, place, &temp_ptr); + + // actually build the table + impl::BuildSpatialHashTableCUDA( + stream, temp_ptr, temp_size, texture_alignment, points.shape()[0], + points.data(), T(radius), points_row_splits.shape()[0], + points_row_splits.data(), hash_table_splits.data(), + hash_table_cell_splits.shape()[0], + reinterpret_cast(const_cast( + hash_table_cell_splits.data())), + reinterpret_cast( + const_cast(hash_table_index.data()))); +} + +#define INSTANTIATE(T) \ + template void BuildSpatialHashTableCUDA( \ + const paddle::Tensor&, double, const paddle::Tensor&, \ + const std::vector&, paddle::Tensor&, paddle::Tensor&); + +INSTANTIATE(float) diff --git a/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOps.cpp b/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOps.cpp new file mode 100644 index 00000000000..1c23450c992 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOps.cpp @@ -0,0 +1,121 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include +#include + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" + +template +void BuildSpatialHashTableCPU(const paddle::Tensor& points, + double radius, + const paddle::Tensor& points_row_splits, + const std::vector& hash_table_splits, + paddle::Tensor& hash_table_index, + paddle::Tensor& hash_table_cell_splits); +#ifdef BUILD_CUDA_MODULE +template +void BuildSpatialHashTableCUDA(const paddle::Tensor& points, + double radius, + const paddle::Tensor& points_row_splits, + const std::vector& hash_table_splits, + paddle::Tensor& hash_table_index, + paddle::Tensor& hash_table_cell_splits); +#endif + +std::vector BuildSpatialHashTable( + paddle::Tensor& points, + paddle::Tensor& points_row_splits, + double radius, + double hash_table_size_factor, + int64_t max_hash_table_size) { + points_row_splits = points_row_splits.copy_to(phi::CPUPlace(), false); + CHECK_TYPE(points_row_splits, paddle::DataType::INT64); + + // check input shapes + using namespace open3d::ml::op_util; + Dim num_points("num_points"); + Dim batch_size("batch_size"); + + CHECK_SHAPE(points, num_points, 3); + CHECK_SHAPE(points_row_splits, batch_size + 1); + + const auto& point_type = points.dtype(); + + std::vector hash_table_splits(batch_size.value() + 1, 0); + for (int i = 0; i < batch_size.value(); ++i) { + int64_t num_points_i = points_row_splits.data()[i + 1] - + points_row_splits.data()[i]; + int64_t hash_table_size = std::min( + std::max(hash_table_size_factor * num_points_i, 1), + max_hash_table_size); + hash_table_splits[i + 1] = hash_table_splits[i] + hash_table_size; + } + + auto place = points.place(); + paddle::Tensor hash_table_index; + if (points.shape()[0] != 0) { + hash_table_index = + paddle::empty({points.shape()[0]}, + paddle::DataType(ToPaddleDtype()), place); + } else { + hash_table_index = InitializedEmptyTensor({0}, place); + } + paddle::Tensor hash_table_cell_splits = + paddle::empty({hash_table_splits.back() + 1}, + paddle::DataType(ToPaddleDtype()), place); + paddle::Tensor out_hash_table_splits = paddle::empty( + {batch_size.value() + 1}, + paddle::DataType(ToPaddleDtype()), phi::CPUPlace()); + for (size_t i = 0; i < hash_table_splits.size(); ++i) { + out_hash_table_splits.data()[i] = hash_table_splits[i]; + } +#define FN_PARAMETERS \ + points, radius, points_row_splits, hash_table_splits, hash_table_index, \ + hash_table_cell_splits +#define CALL(type, fn) \ + if (ComparePaddleDtype(point_type)) { \ + fn(FN_PARAMETERS); \ + return {hash_table_index, hash_table_cell_splits, \ + out_hash_table_splits}; \ + } + if (points.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + // pass to cuda function + CALL(float, BuildSpatialHashTableCUDA) +#else + PD_CHECK(false, + "BuildSpatialHashTable was not compiled with CUDA support"); +#endif + } else { + CALL(float, BuildSpatialHashTableCPU) + CALL(double, BuildSpatialHashTableCPU) + } + PD_CHECK(false, "BuildSpatialHashTable does not support " + + phi::DataTypeToString(points.dtype()) + + " as input for " + "points"); + + return std::vector(); +} + +std::vector BuildSpatialHashTableInferDtype() { + auto dtype = paddle::DataType::INT32; + return {dtype, dtype, dtype}; +} + +PD_BUILD_OP(open3d_build_spatial_hash_table) + .Inputs({"points", "points_row_splits"}) + .Outputs({"hash_table_index", "hash_table_cell_splits", + "hash_table_splits"}) + .Attrs({"radius: double", "hash_table_size_factor: double", + "max_hash_table_size: int64_t"}) + .SetKernelFn(PD_KERNEL(BuildSpatialHashTable)) + .SetInferDtypeFn(PD_INFER_DTYPE(BuildSpatialHashTableInferDtype)); diff --git a/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cpp b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cpp new file mode 100644 index 00000000000..bcff66b795f --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cpp @@ -0,0 +1,67 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/core/nns/FixedRadiusSearchImpl.h" +#include "open3d/core/nns/NeighborSearchCommon.h" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/NeighborSearchAllocator.h" + +using namespace open3d::core::nns; + +template +void FixedRadiusSearchCPU(const paddle::Tensor& points, + const paddle::Tensor& queries, + double radius, + const paddle::Tensor& points_row_splits, + const paddle::Tensor& queries_row_splits, + const paddle::Tensor& hash_table_splits, + const paddle::Tensor& hash_table_index, + const paddle::Tensor& hash_table_cell_splits, + const Metric metric, + const bool ignore_query_point, + const bool return_distances, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_row_splits, + paddle::Tensor& neighbors_distance) { + NeighborSearchAllocator output_allocator(points.place()); + + impl::FixedRadiusSearchCPU( + neighbors_row_splits.data(), points.shape()[0], + points.data(), queries.shape()[0], queries.data(), T(radius), + points_row_splits.shape()[0], points_row_splits.data(), + queries_row_splits.shape()[0], queries_row_splits.data(), + reinterpret_cast( + const_cast(hash_table_splits.data())), + hash_table_cell_splits.shape()[0], + reinterpret_cast(const_cast( + hash_table_cell_splits.data())), + reinterpret_cast( + const_cast(hash_table_index.data())), + metric, ignore_query_point, return_distances, output_allocator); + + neighbors_index = output_allocator.NeighborsIndex(); + neighbors_distance = output_allocator.NeighborsDistance(); +} + +#define INSTANTIATE(T, TIndex) \ + template void FixedRadiusSearchCPU( \ + const paddle::Tensor& points, const paddle::Tensor& queries, \ + double radius, const paddle::Tensor& points_row_splits, \ + const paddle::Tensor& queries_row_splits, \ + const paddle::Tensor& hash_table_splits, \ + const paddle::Tensor& hash_table_index, \ + const paddle::Tensor& hash_table_cell_splits, const Metric metric, \ + const bool ignore_query_point, const bool return_distances, \ + paddle::Tensor& neighbors_index, \ + paddle::Tensor& neighbors_row_splits, \ + paddle::Tensor& neighbors_distance); + +INSTANTIATE(float, int32_t) +INSTANTIATE(float, int64_t) +INSTANTIATE(double, int32_t) +INSTANTIATE(double, int64_t) diff --git a/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu new file mode 100644 index 00000000000..d5fc9a099d1 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu @@ -0,0 +1,93 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/core/nns/FixedRadiusSearchImpl.cuh" +#include "open3d/core/nns/NeighborSearchCommon.h" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/NeighborSearchAllocator.h" + +using namespace open3d::core::nns; + +template +void FixedRadiusSearchCUDA(const paddle::Tensor& points, + const paddle::Tensor& queries, + double radius, + const paddle::Tensor& points_row_splits, + const paddle::Tensor& queries_row_splits, + const paddle::Tensor& hash_table_splits, + const paddle::Tensor& hash_table_index, + const paddle::Tensor& hash_table_cell_splits, + const Metric metric, + const bool ignore_query_point, + const bool return_distances, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_row_splits, + paddle::Tensor& neighbors_distance) { + auto stream = points.stream(); + auto cuda_place_props = phi::backends::gpu::GetDeviceProperties(-1); + const int texture_alignment = cuda_place_props.textureAlignment; + + auto place = points.place(); + + NeighborSearchAllocator output_allocator(place); + void* temp_ptr = nullptr; + size_t temp_size = 0; + + // determine temp_size + impl::FixedRadiusSearchCUDA( + stream, temp_ptr, temp_size, texture_alignment, + neighbors_row_splits.data(), points.shape()[0], + points.data(), queries.shape()[0], queries.data(), T(radius), + points_row_splits.shape()[0], points_row_splits.data(), + queries_row_splits.shape()[0], queries_row_splits.data(), + reinterpret_cast( + const_cast(hash_table_splits.data())), + hash_table_cell_splits.shape()[0], + reinterpret_cast(const_cast( + hash_table_cell_splits.data())), + reinterpret_cast( + const_cast(hash_table_index.data())), + metric, ignore_query_point, return_distances, output_allocator); + + auto temp_tensor = CreateTempTensor(temp_size, points.place(), &temp_ptr); + + // actually run the search + impl::FixedRadiusSearchCUDA( + stream, temp_ptr, temp_size, texture_alignment, + neighbors_row_splits.data(), points.shape()[0], + points.data(), queries.shape()[0], queries.data(), T(radius), + points_row_splits.shape()[0], points_row_splits.data(), + queries_row_splits.shape()[0], queries_row_splits.data(), + reinterpret_cast( + const_cast(hash_table_splits.data())), + hash_table_cell_splits.shape()[0], + reinterpret_cast(const_cast( + hash_table_cell_splits.data())), + reinterpret_cast( + const_cast(hash_table_index.data())), + metric, ignore_query_point, return_distances, output_allocator); + + neighbors_index = output_allocator.NeighborsIndex(); + neighbors_distance = output_allocator.NeighborsDistance(); +} + +#define INSTANTIATE(T, TIndex) \ + template void FixedRadiusSearchCUDA( \ + const paddle::Tensor& points, const paddle::Tensor& queries, \ + double radius, const paddle::Tensor& points_row_splits, \ + const paddle::Tensor& queries_row_splits, \ + const paddle::Tensor& hash_table_splits, \ + const paddle::Tensor& hash_table_index, \ + const paddle::Tensor& hash_table_cell_splits, const Metric metric, \ + const bool ignore_query_point, const bool return_distances, \ + paddle::Tensor& neighbors_index, \ + paddle::Tensor& neighbors_row_splits, \ + paddle::Tensor& neighbors_distance); + +INSTANTIATE(float, int32_t) +INSTANTIATE(float, int64_t) diff --git a/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOps.cpp b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOps.cpp new file mode 100644 index 00000000000..af368fdbc40 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOps.cpp @@ -0,0 +1,190 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/core/Dtype.h" +#include "open3d/core/nns/NeighborSearchCommon.h" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/utility/Helper.h" + +using namespace open3d::core::nns; + +template +void FixedRadiusSearchCPU(const paddle::Tensor& points, + const paddle::Tensor& queries, + double radius, + const paddle::Tensor& points_row_splits, + const paddle::Tensor& queries_row_splits, + const paddle::Tensor& hash_table_splits, + const paddle::Tensor& hash_table_index, + const paddle::Tensor& hash_table_cell_splits, + const Metric metric, + const bool ignore_query_point, + const bool return_distances, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_row_splits, + paddle::Tensor& neighbors_distance); +#ifdef BUILD_CUDA_MODULE +template +void FixedRadiusSearchCUDA(const paddle::Tensor& points, + const paddle::Tensor& queries, + double radius, + const paddle::Tensor& points_row_splits, + const paddle::Tensor& queries_row_splits, + const paddle::Tensor& hash_table_splits, + const paddle::Tensor& hash_table_index, + const paddle::Tensor& hash_table_cell_splits, + const Metric metric, + const bool ignore_query_point, + const bool return_distances, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_row_splits, + paddle::Tensor& neighbors_distance); +#endif + +std::vector FixedRadiusSearch( + paddle::Tensor& points, + paddle::Tensor& queries, + paddle::Tensor& points_row_splits, + paddle::Tensor& queries_row_splits, + paddle::Tensor& hash_table_splits, + paddle::Tensor& hash_table_index, + paddle::Tensor& hash_table_cell_splits, + double radius, + const std::string& index_dtype, + const std::string& metric_str, + const bool ignore_query_point, + const bool return_distances) { + Metric metric = L2; + if (metric_str == "L1") { + metric = L1; + } else if (metric_str == "L2") { + metric = L2; + } else if (metric_str == "Linf") { + metric = Linf; + } else { + PD_CHECK(false, + "metric must be one of (L1, L2, Linf) but got " + metric_str); + } + CHECK_TYPE(points_row_splits, paddle::DataType::INT64); + CHECK_TYPE(queries_row_splits, paddle::DataType::INT64); + CHECK_TYPE(hash_table_splits, paddle::DataType::INT32); + CHECK_TYPE(hash_table_index, paddle::DataType::INT32); + CHECK_TYPE(hash_table_cell_splits, paddle::DataType::INT32); + CHECK_SAME_DTYPE(points, queries); + CHECK_SAME_DEVICE_TYPE(points, queries); + // PD_CHECK(index_dtype == paddle::DataType::INT32 || index_dtype == + // paddle::DataType::INT64, + PD_CHECK(index_dtype == "int32" || index_dtype == "int64", + "index_dtype must be int32 or int64"); + // ensure that these are on the cpu + points_row_splits = points_row_splits.copy_to(paddle::CPUPlace(), false); + queries_row_splits = queries_row_splits.copy_to(paddle::CPUPlace(), false); + hash_table_splits = hash_table_splits.copy_to(paddle::CPUPlace(), false); + + // check input shapes + using namespace open3d::ml::op_util; + Dim num_points("num_points"); + Dim num_queries("num_queries"); + Dim batch_size("batch_size"); + Dim num_cells("num_cells"); + CHECK_SHAPE(points, num_points, 3); + CHECK_SHAPE(hash_table_index, num_points); + CHECK_SHAPE(queries, num_queries, 3); + CHECK_SHAPE(points_row_splits, batch_size + 1); + CHECK_SHAPE(queries_row_splits, batch_size + 1); + CHECK_SHAPE(hash_table_splits, batch_size + 1); + CHECK_SHAPE(hash_table_cell_splits, num_cells + 1); + + const auto& point_type = points.dtype(); + + auto place = points.place(); + + paddle::Tensor neighbors_index; + paddle::Tensor neighbors_row_splits = + paddle::empty({queries.shape()[0] + 1}, + paddle::DataType(ToPaddleDtype()), place); + paddle::Tensor neighbors_distance; + +#define FN_PARAMETERS \ + points, queries, radius, points_row_splits, queries_row_splits, \ + hash_table_splits, hash_table_index, hash_table_cell_splits, \ + metric, ignore_query_point, return_distances, neighbors_index, \ + neighbors_row_splits, neighbors_distance + + if (points.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + // pass to cuda function + if (ComparePaddleDtype(point_type)) { + if (index_dtype == "int32") { + FixedRadiusSearchCUDA(FN_PARAMETERS); + } else { + FixedRadiusSearchCUDA(FN_PARAMETERS); + } + return {neighbors_index, neighbors_row_splits, neighbors_distance}; + } +#else + PD_CHECK(false, "FixedRadiusSearch was not compiled with CUDA support"); +#endif + } else { + if (ComparePaddleDtype(point_type)) { + if (index_dtype == "int32") { + FixedRadiusSearchCPU(FN_PARAMETERS); + } else { + FixedRadiusSearchCPU(FN_PARAMETERS); + } + } else { + if (index_dtype == "int32") { + FixedRadiusSearchCPU(FN_PARAMETERS); + } else { + FixedRadiusSearchCPU(FN_PARAMETERS); + } + } + return {neighbors_index, neighbors_row_splits, neighbors_distance}; + } + + // in torch the name is ToString, but paddle not have this function + PD_CHECK(false, "FixedRadiusSearch does not support " + + phi::DataTypeToString(points.dtype()) + + " as input for points"); + return std::vector(); +} + +std::vector FixedRadiusSearchInferDtype( + const std::string& index_dtype) { + paddle::DataType dtype = index_dtype == "int32" ? paddle::DataType::INT32 + : paddle::DataType::INT64; + return {dtype, paddle::DataType::INT64, dtype}; +} + +std::vector> FixedRadiusSearchInferShape( + std::vector queries_shape, const bool return_distances) { + // this just a temp impl , all return is fake data + // TODO(woodman3): impl real data + int64_t neighbors_row_splits_shape = queries_shape[0] + 1; + int64_t neighbors_distance_shape = return_distances ? 1 : 0; + return {{neighbors_row_splits_shape}, + {neighbors_row_splits_shape}, + {neighbors_distance_shape}}; +} + +PD_BUILD_OP(open3d_fixed_radius_search) + .Inputs({"points", "queries", "points_row_splits", "queries_row_splits", + "hash_table_splits", "hash_table_index", + "hash_table_cell_splits"}) + .Outputs({"neighbors_index", "neighbors_row_splits", + "neighbors_distance"}) + .Attrs({ + "radius: double", + "index_dtype:std::string", + "metric_str: std::string", + "ignore_query_point: bool", + "return_distances: bool", + }) + .SetKernelFn(PD_KERNEL(FixedRadiusSearch)) + .SetInferShapeFn(PD_INFER_SHAPE(FixedRadiusSearchInferShape)) + .SetInferDtypeFn(PD_INFER_DTYPE(FixedRadiusSearchInferDtype)); diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cpp b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cpp new file mode 100644 index 00000000000..a9c4087e77d --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cpp @@ -0,0 +1,67 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/ml/paddle/misc/InvertNeighborsListOpKernel.h" + +#include "open3d/ml/impl/misc/InvertNeighborsList.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +template +std::vector InvertNeighborsListCPU( + int64_t num_points, + const paddle::Tensor& inp_neighbors_index, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& inp_neighbors_attributes) { + paddle::Tensor neighbors_index = + paddle::empty(inp_neighbors_index.shape(), + paddle::DataType(ToPaddleDtype())); + paddle::Tensor neighbors_row_splits = paddle::empty( + {num_points + 1}, paddle::DataType(paddle::DataType::INT64)); + + paddle::Tensor neighbors_attributes = + paddle::empty_like(inp_neighbors_attributes); + + int num_attributes; + if (inp_neighbors_attributes.shape()[0] == 0) { + num_attributes = 0; + neighbors_attributes = + InitializedEmptyTensor(inp_neighbors_attributes.dtype(), + inp_neighbors_attributes.shape(), + inp_neighbors_attributes.place()); + + } else { + num_attributes = 1; + for (size_t i = 1; i < inp_neighbors_attributes.shape().size(); ++i) + num_attributes *= inp_neighbors_attributes.shape()[i]; + } + + open3d::ml::impl::InvertNeighborsListCPU( + inp_neighbors_index.data(), + num_attributes ? inp_neighbors_attributes.data() : nullptr, + num_attributes, inp_neighbors_row_splits.data(), + inp_neighbors_row_splits.shape()[0] - 1, + neighbors_index.data(), + num_attributes ? neighbors_attributes.data() : nullptr, + neighbors_index.shape()[0], neighbors_row_splits.data(), + neighbors_row_splits.shape()[0] - 1); + + return {neighbors_index, neighbors_row_splits, neighbors_attributes}; +} +#define INSTANTIATE(TIndex, TAttr) \ + template std::vector \ + InvertNeighborsListCPU(int64_t, const paddle::Tensor&, \ + const paddle::Tensor&, \ + const paddle::Tensor&); + +INSTANTIATE(int32_t, uint8_t) +INSTANTIATE(int32_t, int8_t) +INSTANTIATE(int32_t, int16_t) +INSTANTIATE(int32_t, int32_t) +INSTANTIATE(int32_t, int64_t) +INSTANTIATE(int32_t, float) +INSTANTIATE(int32_t, double) diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu new file mode 100644 index 00000000000..5e87c438815 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu @@ -0,0 +1,91 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/ml/impl/misc/InvertNeighborsList.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" + +template +std::vector InvertNeighborsListCUDA( + int64_t num_points, + const paddle::Tensor& inp_neighbors_index, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& inp_neighbors_attributes) { + auto place = inp_neighbors_index.place(); + paddle::Tensor neighbors_index = + paddle::empty(inp_neighbors_index.shape(), + paddle::DataType(ToPaddleDtype()), place); + paddle::Tensor neighbors_row_splits = paddle::empty( + {num_points + 1}, paddle::DataType(paddle::DataType::INT64), place); + paddle::Tensor neighbors_attributes = + paddle::empty_like(inp_neighbors_attributes); + + // maybe this can use torch's impl way ? + auto stream = inp_neighbors_index.stream(); + auto cuda_place_props = phi::backends::gpu::GetDeviceProperties(-1); + const int texture_alignment = cuda_place_props.textureAlignment; + + int num_attributes; + if (inp_neighbors_attributes.shape()[0] == 0) { + std::cout << inp_neighbors_attributes.dtype() << std::endl; + num_attributes = 0; + neighbors_attributes = + InitializedEmptyTensor(inp_neighbors_attributes.dtype(), + inp_neighbors_attributes.shape(), + inp_neighbors_attributes.place()); + } else { + num_attributes = 1; + for (int i = 1; i < inp_neighbors_attributes.dims().size(); ++i) + num_attributes *= inp_neighbors_attributes.shape()[i]; + } + + void* temp_ptr = nullptr; + size_t temp_size = 0; + + // determine temp_size + open3d::ml::impl::InvertNeighborsListCUDA( + stream, temp_ptr, temp_size, texture_alignment, + inp_neighbors_index.data(), + num_attributes ? inp_neighbors_attributes.data() : nullptr, + num_attributes, inp_neighbors_row_splits.data(), + inp_neighbors_row_splits.shape()[0] - 1, + neighbors_index.data(), + num_attributes ? neighbors_attributes.data() : nullptr, + neighbors_index.shape()[0], + neighbors_row_splits.data(), // NOLINT + neighbors_row_splits.shape()[0] - 1); + + auto temp_tensor = CreateTempTensor(temp_size, place, &temp_ptr); + + // actually invert the list + open3d::ml::impl::InvertNeighborsListCUDA( + stream, temp_ptr, temp_size, texture_alignment, + inp_neighbors_index.data(), + num_attributes ? inp_neighbors_attributes.data() : nullptr, + num_attributes, inp_neighbors_row_splits.data(), + inp_neighbors_row_splits.shape()[0] - 1, + neighbors_index.data(), + num_attributes ? neighbors_attributes.data() : nullptr, + neighbors_index.shape()[0], + neighbors_row_splits.data(), // NOLINT + neighbors_row_splits.shape()[0] - 1); + + return {neighbors_index, neighbors_row_splits, neighbors_attributes}; +} +#define INSTANTIATE(TIndex, TAttr) \ + template std::vector \ + InvertNeighborsListCUDA(int64_t, const paddle::Tensor&, \ + const paddle::Tensor&, \ + const paddle::Tensor&); + +INSTANTIATE(int32_t, uint8_t) +INSTANTIATE(int32_t, int8_t) +INSTANTIATE(int32_t, int16_t) +INSTANTIATE(int32_t, int32_t) +INSTANTIATE(int32_t, int64_t) +INSTANTIATE(int32_t, float) +INSTANTIATE(int32_t, double) diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.h b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.h new file mode 100644 index 00000000000..bf984eb2778 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.h @@ -0,0 +1,26 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include "open3d/ml/paddle/PaddleHelper.h" + +template +std::vector InvertNeighborsListCPU( + int64_t num_points, + const paddle::Tensor& inp_neighbors_index, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& inp_neighbors_attributes); + +#ifdef BUILD_CUDA_MODULE +template +std::vector InvertNeighborsListCUDA( + int64_t num_points, + const paddle::Tensor& inp_neighbors_index, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& inp_neighbors_attributes); +#endif diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp new file mode 100644 index 00000000000..0c415474138 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp @@ -0,0 +1,102 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/InvertNeighborsListOpKernel.h" + +std::vector InvertNeighborsList( + paddle::Tensor& inp_neighbors_index, + paddle::Tensor& inp_neighbors_row_splits, + paddle::Tensor& inp_neighbors_attributes, + int64_t num_points) { + CHECK_TYPE(inp_neighbors_row_splits, paddle::DataType::INT64); + + // check input shapes + { + using namespace open3d::ml::op_util; + Dim num_neighbors("num_neighbors"); + + CHECK_SHAPE(inp_neighbors_index, num_neighbors); + CHECK_SHAPE_IGNORE_LAST_DIMS(inp_neighbors_attributes, + num_neighbors || 0); + CHECK_SHAPE(inp_neighbors_row_splits, Dim()); + } + + const auto& index_type = inp_neighbors_index.dtype(); + const auto& attr_type = inp_neighbors_attributes.dtype(); + +#define FN_PARAMETERS \ + num_points, inp_neighbors_index, inp_neighbors_row_splits, \ + inp_neighbors_attributes + +#define CALL(idx_t, attr_t, fn) \ + if (ComparePaddleDtype(index_type) && \ + ComparePaddleDtype(attr_type)) { \ + return fn(FN_PARAMETERS); \ + } + + CHECK_SAME_DEVICE_TYPE(inp_neighbors_index, inp_neighbors_row_splits, + inp_neighbors_attributes); + if (inp_neighbors_index.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + // pass to cuda function + CALL(int32_t, uint8_t, InvertNeighborsListCUDA) + CALL(int32_t, int8_t, InvertNeighborsListCUDA) + CALL(int32_t, int16_t, InvertNeighborsListCUDA) + CALL(int32_t, int32_t, InvertNeighborsListCUDA) + CALL(int32_t, int64_t, InvertNeighborsListCUDA) + CALL(int32_t, float, InvertNeighborsListCUDA) + CALL(int32_t, double, InvertNeighborsListCUDA) +#else + PD_CHECK(false, + "InvertNeighborsList was not compiled with CUDA support"); +#endif + } else { + CALL(int32_t, uint8_t, InvertNeighborsListCPU) + CALL(int32_t, int8_t, InvertNeighborsListCPU) + CALL(int32_t, int16_t, InvertNeighborsListCPU) + CALL(int32_t, int32_t, InvertNeighborsListCPU) + CALL(int32_t, int64_t, InvertNeighborsListCPU) + CALL(int32_t, float, InvertNeighborsListCPU) + CALL(int32_t, double, InvertNeighborsListCPU) + } + + PD_CHECK(false, + "InvertNeighborsList does not support " + + phi::DataTypeToString(inp_neighbors_index.dtype()) + + " as input for inp_neighbors_index and " + + phi::DataTypeToString(inp_neighbors_attributes.dtype()) + + " as input for inp_neighbors_attributes"); + return {}; +} + +std::vector InvertNeighborsListInferDtype( + const paddle::DataType inp_neighbors_attributes_dtype) { + return {paddle::DataType::INT32, paddle::DataType::INT64, + inp_neighbors_attributes_dtype}; +} + +std::vector> InvertNeighborsListInferShape( + int64_t num_points, + std::vector inp_neighbors_index_shape, + std::vector inp_neighbors_attributes_shape) { + return {inp_neighbors_index_shape, + {num_points + 1}, + inp_neighbors_attributes_shape}; +} +PD_BUILD_OP(open3d_invert_neighbors_list) + .Inputs({"inp_neighbors_index", "inp_neighbors_row_splits", + "inp_neighbors_attributes"}) + .Outputs({"neighbors_index", "neighbors_row_splits", + "neighbors_attributes"}) + .Attrs({"num_points: int64_t"}) + .SetKernelFn(PD_KERNEL(InvertNeighborsList)) + .SetInferShapeFn(PD_INFER_SHAPE(InvertNeighborsListInferShape)) + .SetInferDtypeFn(PD_INFER_DTYPE(InvertNeighborsListInferDtype)); diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h new file mode 100644 index 00000000000..24116862242 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h @@ -0,0 +1,18 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +// this file seem not use +#pragma once + +#include "open3d/ml/paddle/PaddleHelper.h" + +std::vector InvertNeighborsList( + int64_t num_points, + const paddle::Tensor& inp_neighbors_index, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& inp_neighbors_attributes); diff --git a/cpp/open3d/ml/paddle/misc/KnnSearchOpKernel.cpp b/cpp/open3d/ml/paddle/misc/KnnSearchOpKernel.cpp new file mode 100644 index 00000000000..8ba33b6a57b --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/KnnSearchOpKernel.cpp @@ -0,0 +1,120 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/core/nns/NanoFlannImpl.h" +#include "open3d/core/nns/NeighborSearchCommon.h" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/NeighborSearchAllocator.h" + +using namespace open3d::core::nns; + +template +void KnnSearchCPU(const paddle::Tensor& points, + const paddle::Tensor& queries, + const int64_t k, + const paddle::Tensor& points_row_splits, + const paddle::Tensor& queries_row_splits, + const Metric metric, + const bool ignore_query_point, + const bool return_distances, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_row_splits, + paddle::Tensor& neighbors_distance) { + const int batch_size = points_row_splits.shape()[0] - 1; + + // run radius search for each batch item + std::vector> batch_output_allocators( + batch_size, NeighborSearchAllocator(points.place()) + + ); + int64_t last_neighbors_count = 0; + for (int i = 0; i < batch_size; ++i) { + const T* const points_i = + points.data() + 3 * points_row_splits.data()[i]; + const T* const queries_i = + queries.data() + 3 * queries_row_splits.data()[i]; + size_t num_points_i = points_row_splits.data()[i + 1] - + points_row_splits.data()[i]; + size_t num_queries_i = queries_row_splits.data()[i + 1] - + queries_row_splits.data()[i]; + + int64_t* neighbors_row_splits_i = neighbors_row_splits.data() + + queries_row_splits.data()[i]; + + std::unique_ptr holder = + impl::BuildKdTree(num_points_i, points_i, 3, metric); + + impl::KnnSearchCPU( + holder.get(), neighbors_row_splits_i, num_points_i, points_i, + num_queries_i, queries_i, 3, k, metric, ignore_query_point, + return_distances, batch_output_allocators[i]); + + if (i > 0) { + for (size_t j = 0; j <= num_queries_i; ++j) + neighbors_row_splits_i[j] += last_neighbors_count; + } + last_neighbors_count = neighbors_row_splits_i[num_queries_i]; + } + + if (batch_size == 1) { + // no need to combine just return the results from the first batch item + neighbors_index = batch_output_allocators[0].NeighborsIndex(); + neighbors_distance = batch_output_allocators[0].NeighborsDistance(); + return; + } + + NeighborSearchAllocator output_allocator(points.place()); + + // combine results + int64_t neighbors_index_size = 0; + int64_t neighbors_distance_size = 0; + for (const auto& a : batch_output_allocators) { + neighbors_index_size += a.NeighborsIndex().shape()[0]; + neighbors_distance_size += a.NeighborsDistance().shape()[0]; + } + TIndex* neighbors_index_data_ptr; + T* neighbors_distance_data_ptr; + output_allocator.AllocIndices(&neighbors_index_data_ptr, + neighbors_index_size); + output_allocator.AllocDistances(&neighbors_distance_data_ptr, + neighbors_distance_size); + + for (int i = 0; i < batch_size; ++i) { + auto& a = batch_output_allocators[i]; + if (a.NeighborsIndex().shape()[0]) { + for (int64_t j = 0; j < a.NeighborsIndex().shape()[0]; ++j) { + neighbors_index_data_ptr[0] = + a.IndicesPtr()[j] + + points_row_splits.data()[i]; + ++neighbors_index_data_ptr; + } + } + if (a.NeighborsDistance().shape()[0]) { + memcpy(neighbors_distance_data_ptr, a.DistancesPtr(), + a.NeighborsDistance().shape()[0] * sizeof(T)); + neighbors_distance_data_ptr += a.NeighborsDistance().shape()[0]; + } + } + neighbors_index = output_allocator.NeighborsIndex(); + neighbors_distance = output_allocator.NeighborsDistance(); +} + +#define INSTANTIATE(T, TIndex) \ + template void KnnSearchCPU( \ + const paddle::Tensor& points, const paddle::Tensor& queries, \ + const int64_t k, const paddle::Tensor& points_row_splits, \ + const paddle::Tensor& queries_row_splits, const Metric metric, \ + const bool ignore_query_point, const bool return_distances, \ + paddle::Tensor& neighbors_index, \ + paddle::Tensor& neighbors_row_splits, \ + paddle::Tensor& neighbors_distance); + +INSTANTIATE(float, int32_t) +INSTANTIATE(float, int64_t) +INSTANTIATE(double, int32_t) +INSTANTIATE(double, int64_t) diff --git a/cpp/open3d/ml/paddle/misc/KnnSearchOps.cpp b/cpp/open3d/ml/paddle/misc/KnnSearchOps.cpp new file mode 100644 index 00000000000..99d0065a273 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/KnnSearchOps.cpp @@ -0,0 +1,140 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/core/Dtype.h" +#include "open3d/core/nns/NeighborSearchCommon.h" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/utility/Helper.h" +#include "paddle/extension.h" + +using namespace open3d::core::nns; + +template +void KnnSearchCPU(const paddle::Tensor& points, + const paddle::Tensor& queries, + const int64_t k, + const paddle::Tensor& points_row_splits, + const paddle::Tensor& queries_row_splits, + const Metric metric, + const bool ignore_query_point, + const bool return_distances, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_row_splits, + paddle::Tensor& neighbors_distance); + +std::vector KnnSearch(paddle::Tensor& points, + paddle::Tensor& queries, + paddle::Tensor& points_row_splits, + paddle::Tensor& queries_row_splits, + const int64_t k, + const std::string& index_dtype, + const std::string& metric_str, + const bool ignore_query_point, + const bool return_distances) { + Metric metric = L2; + if (metric_str == "L1") { + metric = L1; + } else if (metric_str == "L2") { + metric = L2; + } else { + PD_CHECK(false, "metric must be one of (L1, L2) but got " + metric_str); + } + PD_CHECK(k > 0, "k must be greater than zero"); + CHECK_TYPE(points_row_splits, phi::DataType::INT64); + CHECK_TYPE(queries_row_splits, phi::DataType::INT64); + CHECK_SAME_DTYPE(points, queries); + CHECK_SAME_DEVICE_TYPE(points, queries); + PD_CHECK(index_dtype == "int32" || index_dtype == "int64", + "index_dtype must be int32 or int64"); + // ensure that these are on the cpu + points_row_splits = points_row_splits.copy_to(paddle::CPUPlace(), false); + queries_row_splits = queries_row_splits.copy_to(paddle::CPUPlace(), false); + + // check input shapes + using namespace open3d::ml::op_util; + Dim num_points("num_points"); + Dim num_queries("num_queries"); + Dim batch_size("batch_size"); + Dim num_cells("num_cells"); + CHECK_SHAPE(points, num_points, 3); + CHECK_SHAPE(queries, num_queries, 3); + CHECK_SHAPE(points_row_splits, batch_size + 1); + CHECK_SHAPE(queries_row_splits, batch_size + 1); + + const auto& point_type = points.dtype(); + + auto place = points.place(); + + paddle::Tensor neighbors_index; + paddle::Tensor neighbors_row_splits = + paddle::empty({queries.shape()[0] + 1}, + paddle::DataType(ToPaddleDtype()), place); + paddle::Tensor neighbors_distance; + +#define FN_PARAMETERS \ + points, queries, k, points_row_splits, queries_row_splits, metric, \ + ignore_query_point, return_distances, neighbors_index, \ + neighbors_row_splits, neighbors_distance + + if (points.is_gpu()) { + PD_CHECK(false, "KnnSearch does not support CUDA"); + } else { + if (ComparePaddleDtype(point_type)) { + if (index_dtype == "int32") { + KnnSearchCPU(FN_PARAMETERS); + } else { + KnnSearchCPU(FN_PARAMETERS); + } + } else { + if (index_dtype == "int32") { + KnnSearchCPU(FN_PARAMETERS); + } else { + KnnSearchCPU(FN_PARAMETERS); + } + } + return {neighbors_index, neighbors_row_splits, neighbors_distance}; + } + PD_CHECK(false, "KnnSearch does not support " + + phi::DataTypeToString(points.dtype()) + + " as input for points"); + return std::vector(); +} + +std::vector KnnSearchInferDtype( + const std::string& index_dtype) { + paddle::DataType dtype = index_dtype == "int32" ? paddle::DataType::INT32 + : paddle::DataType::INT64; + return {dtype, paddle::DataType::INT64, dtype}; +} + +std::vector> KnnSearchInferShape( + std::vector queries_shape, const bool return_distances) { + int64_t neighbors_row_splits_shape = queries_shape[0] + 1; + int64_t neighbors_distance_shape = return_distances ? 1 : 0; + return {{neighbors_row_splits_shape}, + {neighbors_row_splits_shape}, + {neighbors_distance_shape}}; +} + +PD_BUILD_OP(open3d_knn_search) + .Inputs({"points", "queries", "points_row_splits", + "queries_row_splits"}) + .Outputs({"neighbors_index", "neighbors_row_splits", + "neighbors_distance"}) + .Attrs({ + "k: int64_t", + "index_dtype:std::string", + "metric_str: std::string", + "ignore_query_point: bool", + "return_distances: bool", + }) + .SetKernelFn(PD_KERNEL(KnnSearch)) + .SetInferShapeFn(PD_INFER_SHAPE(KnnSearchInferShape)) + .SetInferDtypeFn(PD_INFER_DTYPE(KnnSearchInferDtype)); diff --git a/cpp/open3d/ml/paddle/misc/NeighborSearchAllocator.h b/cpp/open3d/ml/paddle/misc/NeighborSearchAllocator.h new file mode 100644 index 00000000000..a308fb2770c --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/NeighborSearchAllocator.h @@ -0,0 +1,54 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/ml/paddle/PaddleHelper.h" + +// These classes implement functors that can be passed to the neighbor search +// functions. + +template +class NeighborSearchAllocator { +public: + NeighborSearchAllocator(paddle::Place place) : place(place) {} + + void AllocIndices(TIndex** ptr, size_t num) { + if (num == 0) { + neighbors_index = InitializedEmptyTensor({0}, place); + } else { + neighbors_index = paddle::empty( + {int64_t(num)}, paddle::DataType(ToPaddleDtype()), + place); + } + *ptr = neighbors_index.data(); + } + + void AllocDistances(T** ptr, size_t num) { + if (num == 0) { + neighbors_distance = InitializedEmptyTensor({0}, place); + } else { + neighbors_distance = + paddle::empty({int64_t(num)}, + paddle::DataType(ToPaddleDtype()), place); + } + *ptr = neighbors_distance.data(); + } + + const TIndex* IndicesPtr() const { return neighbors_index.data(); } + + const T* DistancesPtr() const { return neighbors_distance.data(); } + + const paddle::Tensor& NeighborsIndex() const { return neighbors_index; } + const paddle::Tensor& NeighborsDistance() const { + return neighbors_distance; + } + +private: + paddle::Tensor neighbors_index; + paddle::Tensor neighbors_distance; + paddle::Place place; +}; diff --git a/cpp/open3d/ml/paddle/misc/RadiusSearchOpKernel.cpp b/cpp/open3d/ml/paddle/misc/RadiusSearchOpKernel.cpp new file mode 100644 index 00000000000..559f0efd8e6 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/RadiusSearchOpKernel.cpp @@ -0,0 +1,125 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/core/nns/NanoFlannImpl.h" +#include "open3d/core/nns/NeighborSearchCommon.h" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/NeighborSearchAllocator.h" + +using namespace open3d::core::nns; + +template +void RadiusSearchCPU(const paddle::Tensor& points, + const paddle::Tensor& queries, + const paddle::Tensor& radii, + const paddle::Tensor& points_row_splits, + const paddle::Tensor& queries_row_splits, + const Metric metric, + const bool ignore_query_point, + const bool return_distances, + const bool normalize_distances, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_row_splits, + paddle::Tensor& neighbors_distance) { + const int batch_size = points_row_splits.shape()[0] - 1; + // run radius search for each batch item + std::vector> batch_output_allocators( + batch_size, NeighborSearchAllocator(points.place()) + + ); + int64_t last_neighbors_count = 0; + for (int i = 0; i < batch_size; ++i) { + const T* const points_i = + points.data() + 3 * points_row_splits.data()[i]; + const T* const queries_i = + queries.data() + 3 * queries_row_splits.data()[i]; + const T* const radius_i = + radii.data() + queries_row_splits.data()[i]; + size_t num_points_i = points_row_splits.data()[i + 1] - + points_row_splits.data()[i]; + size_t num_queries_i = queries_row_splits.data()[i + 1] - + queries_row_splits.data()[i]; + + int64_t* neighbors_row_splits_i = neighbors_row_splits.data() + + queries_row_splits.data()[i]; + + std::unique_ptr holder = + impl::BuildKdTree(num_points_i, points_i, 3, metric); + + impl::RadiusSearchCPU( + holder.get(), neighbors_row_splits_i, num_points_i, points_i, + num_queries_i, queries_i, 3, radius_i, metric, + ignore_query_point, return_distances, normalize_distances, + /* sort */ false, batch_output_allocators[i]); + + if (i > 0) { + for (size_t j = 0; j <= num_queries_i; ++j) + neighbors_row_splits_i[j] += last_neighbors_count; + } + last_neighbors_count = neighbors_row_splits_i[num_queries_i]; + } + + if (batch_size == 1) { + // no need to combine just return the results from the first batch + // item + neighbors_index = batch_output_allocators[0].NeighborsIndex(); + neighbors_distance = batch_output_allocators[0].NeighborsDistance(); + return; + } + + NeighborSearchAllocator output_allocator(points.place()); + + // combine results + int64_t neighbors_index_size = 0; + int64_t neighbors_distance_size = 0; + for (const auto& a : batch_output_allocators) { + neighbors_index_size += a.NeighborsIndex().shape()[0]; + neighbors_distance_size += a.NeighborsDistance().shape()[0]; + } + TIndex* neighbors_index_data_ptr; + T* neighbors_distance_data_ptr; + output_allocator.AllocIndices(&neighbors_index_data_ptr, + neighbors_index_size); + output_allocator.AllocDistances(&neighbors_distance_data_ptr, + neighbors_distance_size); + + for (int i = 0; i < batch_size; ++i) { + const auto& a = batch_output_allocators[i]; + if (a.NeighborsIndex().shape()[0]) { + for (int64_t j = 0; j < a.NeighborsIndex().shape()[0]; ++j) { + neighbors_index_data_ptr[0] = + a.IndicesPtr()[j] + + points_row_splits.data()[i]; + ++neighbors_index_data_ptr; + } + } + if (a.NeighborsDistance().shape()[0]) { + memcpy(neighbors_distance_data_ptr, a.DistancesPtr(), + a.NeighborsDistance().shape()[0] * sizeof(T)); + neighbors_distance_data_ptr += a.NeighborsDistance().shape()[0]; + } + } + neighbors_index = output_allocator.NeighborsIndex(); + neighbors_distance = output_allocator.NeighborsDistance(); +} + +#define INSTANTIATE(T, TIndex) \ + template void RadiusSearchCPU( \ + const paddle::Tensor& points, const paddle::Tensor& queries, \ + const paddle::Tensor& radii, \ + const paddle::Tensor& points_row_splits, \ + const paddle::Tensor& queries_row_splits, const Metric metric, \ + const bool ignore_query_point, const bool return_distances, \ + const bool normalize_distances, paddle::Tensor& neighbors_index, \ + paddle::Tensor& neighbors_row_splits, \ + paddle::Tensor& neighbors_distance); + +INSTANTIATE(float, int32_t) +INSTANTIATE(float, int64_t) +INSTANTIATE(double, int32_t) +INSTANTIATE(double, int64_t) diff --git a/cpp/open3d/ml/paddle/misc/RadiusSearchOps.cpp b/cpp/open3d/ml/paddle/misc/RadiusSearchOps.cpp new file mode 100644 index 00000000000..72aa838f98f --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/RadiusSearchOps.cpp @@ -0,0 +1,141 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/core/Dtype.h" +#include "open3d/core/nns/NeighborSearchCommon.h" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/utility/Helper.h" + +using namespace open3d::core::nns; + +template +void RadiusSearchCPU(const paddle::Tensor& points, + const paddle::Tensor& queries, + const paddle::Tensor& radii, + const paddle::Tensor& points_row_splits, + const paddle::Tensor& queries_row_splits, + const Metric metric, + const bool ignore_query_point, + const bool return_distances, + const bool normalize_distances, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_row_splits, + paddle::Tensor& neighbors_distance); + +std::vector MultiRadiusSearch( + paddle::Tensor& points, + paddle::Tensor& queries, + paddle::Tensor& radii, + paddle::Tensor& points_row_splits, + paddle::Tensor& queries_row_splits, + const std::string& index_dtype, + const std::string& metric_str, + const bool ignore_query_point, + const bool return_distances, + const bool normalize_distances) { + Metric metric = L2; + if (metric_str == "L1") { + metric = L1; + } else if (metric_str == "L2") { + metric = L2; + } else { + PD_CHECK(false, "metric must be one of (L1, L2) but got " + metric_str); + } + CHECK_TYPE(points_row_splits, paddle::DataType::INT64); + CHECK_TYPE(queries_row_splits, paddle::DataType::INT64); + CHECK_SAME_DTYPE(points, queries, radii); + CHECK_SAME_DEVICE_TYPE(points, queries, radii); + PD_CHECK(index_dtype == "int32" || index_dtype == "int64", + "index_dtype must be int32 or int64"); + // ensure that these are on the cpu + points_row_splits = points_row_splits.copy_to(paddle::CPUPlace(), false); + queries_row_splits = queries_row_splits.copy_to(paddle::CPUPlace(), false); + + // check input shapes + using namespace open3d::ml::op_util; + Dim num_points("num_points"); + Dim num_queries("num_queries"); + Dim batch_size("batch_size"); + Dim num_cells("num_cells"); + CHECK_SHAPE(points, num_points, 3); + CHECK_SHAPE(queries, num_queries, 3); + CHECK_SHAPE(radii, num_queries); + CHECK_SHAPE(points_row_splits, batch_size + 1); + CHECK_SHAPE(queries_row_splits, batch_size + 1); + + const auto& point_type = points.dtype(); + + auto place = points.place(); + + paddle::Tensor neighbors_index; + paddle::Tensor neighbors_row_splits = + paddle::empty({queries.shape()[0] + 1}, + paddle::DataType(ToPaddleDtype()), place); + paddle::Tensor neighbors_distance; + +#define FN_PARAMETERS \ + points, queries, radii, points_row_splits, queries_row_splits, metric, \ + ignore_query_point, return_distances, normalize_distances, \ + neighbors_index, neighbors_row_splits, neighbors_distance + + if (points.is_gpu()) { + PD_CHECK(false, "MultiRadiusSearch does not support CUDA"); + } else { + if (ComparePaddleDtype(point_type)) { + if (index_dtype == "int32") { + RadiusSearchCPU(FN_PARAMETERS); + } else { + RadiusSearchCPU(FN_PARAMETERS); + } + } else { + if (index_dtype == "int32") { + RadiusSearchCPU(FN_PARAMETERS); + } else { + RadiusSearchCPU(FN_PARAMETERS); + } + } + return {neighbors_index, neighbors_row_splits, neighbors_distance}; + } + // same question of fixed_radius_search + PD_CHECK(false, "MultiRadiusSearch does not support " + + phi::DataTypeToString(points.dtype()) + + " as input for points"); + return {neighbors_index, neighbors_row_splits, neighbors_distance}; +} + +std::vector MultiRadiusSearchInferDtype( + const std::string& index_dtype) { + paddle::DataType dtype = index_dtype == "int32" ? paddle::DataType::INT32 + : paddle::DataType::INT64; + return {dtype, paddle::DataType::INT64, dtype}; +} + +std::vector> MultiRadiusSearchInferShape( + std::vector queries_shape, const bool return_distances) { + // this just a temp impl , all return is fake data + // TODO(woodman3): impl real data + int64_t neighbors_row_splits_shape = queries_shape[0] + 1; + int64_t neighbors_distance_shape = return_distances ? 1 : 0; + return {{neighbors_row_splits_shape}, + {neighbors_row_splits_shape}, + {neighbors_distance_shape}}; +} + +PD_BUILD_OP(open3d_radius_search) + .Inputs({"points", "queries", "radii", "points_row_splits", + "queries_row_splits"}) + .Outputs({"neighbors_index", "neighbors_row_splits", + "neighbors_distance"}) + .Attrs({"index_dtype: std::string", "metric_str: std::string", + "ignore_query_point: bool", "return_distances: bool", + "normalize_distances: bool"}) + .SetKernelFn(PD_KERNEL(MultiRadiusSearch)) + .SetInferShapeFn(PD_INFER_SHAPE(MultiRadiusSearchInferShape)) + .SetInferDtypeFn(PD_INFER_DTYPE(MultiRadiusSearchInferDtype)); diff --git a/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cpp b/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cpp new file mode 100644 index 00000000000..52ed6853d0c --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cpp @@ -0,0 +1,45 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/ml/paddle/misc/RaggedToDenseOpKernel.h" + +#include "open3d/ml/impl/misc/RaggedToDense.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +template +paddle::Tensor RaggedToDenseCPU(const paddle::Tensor& values, + const paddle::Tensor& row_splits, + const int64_t out_col_size, + const paddle::Tensor& default_value) { + auto out_shape = values.shape(); + out_shape.erase(out_shape.begin()); + out_shape.insert(out_shape.begin(), + {row_splits.shape()[0] - 1, out_col_size}); + paddle::Tensor out = + paddle::empty(out_shape, paddle::DataType(ToPaddleDtype())); + + open3d::ml::impl::RaggedToDenseCPU( + values.data(), row_splits.data(), row_splits.shape()[0], + out_col_size, default_value.data(), default_value.numel(), + out.data()); + + return out; +} + +#define INSTANTIATE(T) \ + template paddle::Tensor RaggedToDenseCPU( \ + const paddle::Tensor&, const paddle::Tensor&, const int64_t, \ + const paddle::Tensor&); + +INSTANTIATE(uint8_t) +INSTANTIATE(int8_t) +INSTANTIATE(int16_t) +INSTANTIATE(int32_t) +INSTANTIATE(int64_t) +INSTANTIATE(float) +INSTANTIATE(double) diff --git a/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cu b/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cu new file mode 100644 index 00000000000..e975fef2050 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cu @@ -0,0 +1,48 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/ml/impl/misc/RaggedToDense.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/RaggedToDenseOpKernel.h" +#include "paddle/extension.h" + +template +paddle::Tensor RaggedToDenseCUDA(const paddle::Tensor& values, + const paddle::Tensor& row_splits, + const int64_t out_col_size, + const paddle::Tensor& default_value) { + auto out_shape = values.shape(); + out_shape.erase(out_shape.begin()); + out_shape.insert(out_shape.begin(), + {row_splits.shape()[0] - 1, out_col_size}); + auto place = values.place(); + paddle::Tensor out = paddle::empty( + out_shape, paddle::DataType(ToPaddleDtype()), place); + + auto stream = values.stream(); + + open3d::ml::impl::RaggedToDenseCUDA( + stream, values.data(), row_splits.data(), + row_splits.shape()[0], out_col_size, default_value.data(), + default_value.numel(), out.data()); + + return out; +} + +#define INSTANTIATE(T) \ + template paddle::Tensor RaggedToDenseCUDA( \ + const paddle::Tensor&, const paddle::Tensor&, const int64_t, \ + const paddle::Tensor&); + +INSTANTIATE(uint8_t) +INSTANTIATE(int8_t) +INSTANTIATE(int16_t) +INSTANTIATE(int32_t) +INSTANTIATE(int64_t) +INSTANTIATE(float) +INSTANTIATE(double) diff --git a/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.h b/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.h new file mode 100644 index 00000000000..2ae3ff59cf9 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.h @@ -0,0 +1,24 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include "paddle/extension.h" + +template +paddle::Tensor RaggedToDenseCPU(const paddle::Tensor& values, + const paddle::Tensor& row_splits, + const int64_t out_col_size, + const paddle::Tensor& default_value); + +#ifdef BUILD_CUDA_MODULE +template +paddle::Tensor RaggedToDenseCUDA(const paddle::Tensor& values, + const paddle::Tensor& row_splits, + const int64_t out_col_size, + const paddle::Tensor& default_value); +#endif diff --git a/cpp/open3d/ml/paddle/misc/RaggedToDenseOps.cpp b/cpp/open3d/ml/paddle/misc/RaggedToDenseOps.cpp new file mode 100644 index 00000000000..d8cf6b46469 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/RaggedToDenseOps.cpp @@ -0,0 +1,111 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/RaggedToDenseOpKernel.h" +#include "paddle/extension.h" + +std::vector RaggedToDense(paddle::Tensor& values, + paddle::Tensor& row_splits, + paddle::Tensor& default_value, + const int64_t out_col_size) { + CHECK_TYPE(row_splits, phi::DataType::INT64); + CHECK_SAME_DTYPE(values, default_value); + + // check input shapes + { + using namespace open3d::ml::op_util; + Dim num_rows("num_rows"); + CHECK_SHAPE(row_splits, num_rows + 1); + if (default_value.shape().size()) { + Dim item_size("item_size"); + CHECK_SHAPE_COMBINE_LAST_DIMS(default_value, item_size); + CHECK_SHAPE_COMBINE_LAST_DIMS(values, Dim(), item_size); + auto value_shape = values.shape(); + + // check shape tail + std::vector item_shape(value_shape.begin() + 1, + value_shape.end()); + auto default_value_shape = default_value.shape(); + PD_CHECK(default_value_shape == item_shape, + "default_value " + + phi::DataTypeToString(default_value.dtype()) + + "has incompatible with the shape of items in " + "values" + + TensorInfoStr({values})); + } else // scalar default_value + { + Dim num_values("num_values"); + CHECK_SHAPE_COMBINE_LAST_DIMS(values, num_values); + } + } + + // make sure everything is on the same place as 'values' + auto place = values.place(); + row_splits = row_splits.copy_to(place, false); + default_value = default_value.copy_to(place, false); + + const auto& value_type = values.dtype(); + +#define CALL(value_t, fn) \ + if (ComparePaddleDtype(value_type)) { \ + return {fn(values, row_splits, out_col_size, default_value)}; \ + } + + if (values.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + // pass to cuda function + CALL(uint8_t, RaggedToDenseCUDA) + CALL(int8_t, RaggedToDenseCUDA) + CALL(int16_t, RaggedToDenseCUDA) + CALL(int32_t, RaggedToDenseCUDA) + CALL(int64_t, RaggedToDenseCUDA) + CALL(float, RaggedToDenseCUDA) + CALL(double, RaggedToDenseCUDA) +#else + PD_CHECK(false, "RaggedToDense was not compiled with CUDA support"); +#endif + } else { + CALL(uint8_t, RaggedToDenseCPU) + CALL(int8_t, RaggedToDenseCPU) + CALL(int16_t, RaggedToDenseCPU) + CALL(int32_t, RaggedToDenseCPU) + CALL(int64_t, RaggedToDenseCPU) + CALL(float, RaggedToDenseCPU) + CALL(double, RaggedToDenseCPU) + } + PD_CHECK(false, "RaggedToDense does not support " + + phi::DataTypeToString(values.dtype()) + + " as input for values"); +} + +std::vector RaggedToDenseInferDtype( + const paddle::DataType values_dtype) { + return {values_dtype}; +} + +std::vector> RaggedToDenseInferShape( + std::vector values_shape, + std::vector row_splits_shape, + const int64_t out_col_size) { + auto out_shape = values_shape; + out_shape.erase(out_shape.begin()); + out_shape.insert(out_shape.begin(), + {row_splits_shape[0] - 1, out_col_size}); + return {out_shape}; +} + +PD_BUILD_OP(open3d_ragged_to_dense) + .Inputs({"values", "row_splits", "default_value"}) + .Attrs({"out_col_size: int64_t"}) + .Outputs({"out"}) + .SetKernelFn(PD_KERNEL(RaggedToDense)) + .SetInferShapeFn(PD_INFER_SHAPE(RaggedToDenseInferShape)) + .SetInferDtypeFn(PD_INFER_DTYPE(RaggedToDenseInferDtype)); diff --git a/cpp/pybind/CMakeLists.txt b/cpp/pybind/CMakeLists.txt index 2072615e6c9..dafb8cf61d8 100644 --- a/cpp/pybind/CMakeLists.txt +++ b/cpp/pybind/CMakeLists.txt @@ -157,6 +157,25 @@ if (BUILD_PYTORCH_OPS) OUTPUT_VARIABLE Pytorch_VERSION) endif() +# add additional optional compiled modules +if (BUILD_PADDLE_OPS) + list( APPEND COMPILED_MODULE_PATH_LIST $ ) + add_custom_command( OUTPUT "${CMAKE_BINARY_DIR}/lib/ml/paddle/python/ops.py" "${CMAKE_BINARY_DIR}/lib/ml/paddle/python/return_types.py" + COMMAND ${Python3_EXECUTABLE} generate_paddle_ops_wrapper.py + --input_return_types_py_in "${PYTHON_PACKAGE_SRC_DIR}/open3d/ml/paddle/python/return_types.py.in" + --output_dir "${CMAKE_BINARY_DIR}/lib/ml/paddle/python/" + --lib $ + DEPENDS open3d_paddle_ops + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Generating python ops.py and return_types.py" ) + + list(APPEND GENERATED_OUTPUTS "${CMAKE_BINARY_DIR}/lib/ml/paddle/python/ops.py" "${CMAKE_BINARY_DIR}/lib/ml/paddle/python/return_types.py") + # find paddle to get some info for the _build_config.py + set(PRINT_ONCE OFF) + find_package(Paddle) +endif() + + if (BUNDLE_OPEN3D_ML) find_path( OPEN3D_ML_ROOT @@ -202,6 +221,7 @@ add_custom_target(python-package -DBUILD_JUPYTER_EXTENSION=${BUILD_JUPYTER_EXTENSION} -DBUILD_TENSORFLOW_OPS=${BUILD_TENSORFLOW_OPS} -DBUILD_PYTORCH_OPS=${BUILD_PYTORCH_OPS} + -DBUILD_PADDLE_OPS=${BUILD_PADDLE_OPS} -DBUNDLE_OPEN3D_ML=${BUNDLE_OPEN3D_ML} -DOPEN3D_ML_ROOT=${OPEN3D_ML_ROOT} -DBUILD_GUI=${BUILD_GUI} diff --git a/cpp/pybind/_build_config.py.in b/cpp/pybind/_build_config.py.in index 6c32224de02..7ea14135ff2 100644 --- a/cpp/pybind/_build_config.py.in +++ b/cpp/pybind/_build_config.py.in @@ -1,6 +1,7 @@ _build_config = { "BUILD_TENSORFLOW_OPS" : $,True,False>, "BUILD_PYTORCH_OPS" : $,True,False>, + "BUILD_PADDLE_OPS" : $,True,False>, "BUILD_CUDA_MODULE" : $,True,False>, "BUILD_SYCL_MODULE" : $,True,False>, "BUILD_AZURE_KINECT" : $,True,False>, @@ -16,5 +17,6 @@ _build_config = { "CUDA_GENCODES" : "@CUDA_GENCODES@", "Tensorflow_VERSION" : "@Tensorflow_VERSION@", "Pytorch_VERSION" : "@Pytorch_VERSION@", + "Paddle_VERSION" : "@Paddle_VERSION@", "WITH_OPENMP" : $,True,False> } diff --git a/cpp/pybind/generate_paddle_ops_wrapper.py b/cpp/pybind/generate_paddle_ops_wrapper.py new file mode 100644 index 00000000000..3f8c48fa2b7 --- /dev/null +++ b/cpp/pybind/generate_paddle_ops_wrapper.py @@ -0,0 +1,197 @@ +import argparse +import textwrap +import sys +import os +from yapf.yapflib.yapf_api import FormatFile + + +from paddle.utils.cpp_extension.extension_utils import ( + load_op_meta_info_and_register_op, + _get_api_inputs_str, + _gen_output_content +) + + +def remove_op_name_prefix(op_name): + PADDLE_OPS_PREFIX = "open3d_" + + assert op_name.startswith(PADDLE_OPS_PREFIX), "Paddle operators should be start with `open3d_`." + func_name = op_name[len(PADDLE_OPS_PREFIX):] + + return func_name + + +def custom_api_header(): + HEADER = textwrap.dedent( + """ + # ---------------------------------------------------------------------------- + # - Open3D: www.open3d.org - + # ---------------------------------------------------------------------------- + # The MIT License (MIT) + # + # Copyright (c) 2018-2023 www.open3d.org + # + # 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. + # ---------------------------------------------------------------------------- + + # This file is machine generated. Do not modify. + from paddle import _C_ops + from paddle.framework import in_dynamic_or_pir_mode + from paddle.base.layer_helper import LayerHelper + from . import return_types + """ + ).lstrip() + + return HEADER + + +def custom_api_footer(custom_ops): + FOOTER = textwrap.dedent( + """ + __all__ = [ + {export_func_name_strs} + ] + """ + ).lstrip() + + export_func_name_strs = "" + for op_name in custom_ops: + export_func_name_strs += f"'{remove_op_name_prefix(op_name)}', \n" + + return FOOTER.format( + export_func_name_strs = export_func_name_strs + ) + + +def custom_api_content(op_name): + ( + params_list, + ins_map, + attrs_map, + outs_list, + in_names, + _, + out_names, + inplace_reverse_idx, + ) = _get_api_inputs_str(op_name) + dynamic_content, static_content = _gen_output_content( + op_name, + in_names, + out_names, + ins_map, + attrs_map, + outs_list, + inplace_reverse_idx, + ) + API_TEMPLATE = textwrap.dedent( + """ + def {func_name}({params_list}): + # The output variable's dtype use default value 'float32', + # and the actual dtype of output variable will be inferred in runtime. + if in_dynamic_or_pir_mode(): + outs = _C_ops._run_custom_op("{op_name}", {params_list}) + {dynamic_content} + else: + {static_content} + """ + ).lstrip() + + # NOTE: Hack return express to wrapper multi return value by return_types + if len(out_names) > 1: + RETURN_NAMEDTUPLE_TEMPLATE = textwrap.dedent("""return return_types.{op_name}(*res)""").lstrip() + REPLACED_RETURN_TEMPLATE = textwrap.dedent("""return res[0] if len(res)==1 else res""").lstrip() + dynamic_content = dynamic_content.replace(REPLACED_RETURN_TEMPLATE, RETURN_NAMEDTUPLE_TEMPLATE.format(op_name=op_name)) + static_content = static_content.replace(REPLACED_RETURN_TEMPLATE, RETURN_NAMEDTUPLE_TEMPLATE.format(op_name=op_name)) + + func_name = remove_op_name_prefix(op_name) + + # generate python api file + api_content = API_TEMPLATE.format( + func_name=func_name, + op_name=op_name, + params_list=params_list, + dynamic_content=dynamic_content, + static_content=static_content, + ) + + NAMEDTUPLE_TEMPLATE= textwrap.dedent("""{op_name} = _namedtuple('{op_name}', '{out_names}')""").lstrip() + out_names = ' '.join([out_name for out_name in out_names]) + api_namedtuple = NAMEDTUPLE_TEMPLATE.format( + op_name=op_name, out_names=out_names) + + + return api_content, api_namedtuple + + +def main(): + parser = argparse.ArgumentParser( + description="Creates the ops.py and return_types.py files") + parser.add_argument("--input_return_types_py_in", + type=str, + required=True, + help="input file with header") + parser.add_argument("--lib", + type=str, + required=True, + help="path to open3d_paddle_ops.so") + parser.add_argument("--output_dir", + type=str, + required=True, + help="output directory") + args = parser.parse_args() + + generated_fuction_strs = "" + generated_namedtuple_strs = "" + custom_ops = load_op_meta_info_and_register_op(args.lib) + for _custom_op in custom_ops: + generated_fuction_str, generated_namedtuple_str = custom_api_content(_custom_op) + generated_fuction_strs += generated_fuction_str + "\n" + generated_namedtuple_strs += generated_namedtuple_str + "\n" + + CUSTOM_API_TEMPLATE = textwrap.dedent(""" + {custom_api_header} + + {custom_api_content} + + {custom_api_footer} + """).lstrip() + generated_ops_strs = CUSTOM_API_TEMPLATE.format( + custom_api_header = custom_api_header(), + custom_api_content = generated_fuction_strs, + custom_api_footer = custom_api_footer(custom_ops) + ) + + os.makedirs(args.output_dir, exist_ok=True) + output_ops_py_path = os.path.join(args.output_dir, 'ops.py') + with open(output_ops_py_path,'w') as f: + f.write(generated_ops_strs) + FormatFile(output_ops_py_path, in_place=True) + + output_return_types_py_path = os.path.join(args.output_dir, + 'return_types.py') + with open(args.input_return_types_py_in, 'r') as f: + input_header = f.read() + with open(output_return_types_py_path, 'w') as f: + f.write(input_header + generated_namedtuple_strs) + + return 0 + + +if __name__ == '__main__': + sys.exit(main()) \ No newline at end of file diff --git a/cpp/pybind/make_python_package.cmake b/cpp/pybind/make_python_package.cmake index dee6e394d36..cc6016f2da2 100644 --- a/cpp/pybind/make_python_package.cmake +++ b/cpp/pybind/make_python_package.cmake @@ -61,7 +61,7 @@ configure_file("${PYTHON_PACKAGE_SRC_DIR}/../cpp/open3d/visualization/webrtc_ser file(COPY "${PYTHON_COMPILED_MODULE_DIR}/_build_config.py" DESTINATION "${PYTHON_PACKAGE_DST_DIR}/open3d/") -if (BUILD_TENSORFLOW_OPS OR BUILD_PYTORCH_OPS) +if (BUILD_TENSORFLOW_OPS OR BUILD_PYTORCH_OPS OR BUILD_PADDLE_OPS) # copy generated files file(COPY "${PYTHON_PACKAGE_DST_DIR}/../ml" DESTINATION "${PYTHON_PACKAGE_DST_DIR}/open3d/" ) diff --git a/python/open3d/ml/paddle/__init__.py b/python/open3d/ml/paddle/__init__.py new file mode 100644 index 00000000000..431d7f04004 --- /dev/null +++ b/python/open3d/ml/paddle/__init__.py @@ -0,0 +1,27 @@ +# ---------------------------------------------------------------------------- +# - Open3D: www.open3d.org - +# ---------------------------------------------------------------------------- +# Copyright (c) 2018-2023 www.open3d.org +# SPDX-License-Identifier: MIT +# ---------------------------------------------------------------------------- +from packaging.version import parse as _verp +import paddle as _paddle +from open3d import _build_config + +if not _build_config["Paddle_VERSION"]: + raise Exception('Open3D was not built with Paddle support!') +_o3d_paddle_version = _verp(_build_config["Paddle_VERSION"]) +# Check match with Paddle version, any patch level is OK +if _verp(_paddle.__version__).release[:2] != _o3d_paddle_version.release[:2]: + match_paddle_ver = '.'.join( + str(v) for v in _o3d_paddle_version.release[:2] + ('*',)) + raise Exception('Version mismatch: Open3D needs Paddle version {}, but ' + 'version {} is installed!'.format(match_paddle_ver, + _paddle.__version__)) + +from . import layers +from . import ops +from . import classes + +# put contrib at the same level +from open3d.ml import contrib diff --git a/python/open3d/ml/paddle/classes/__init__.py b/python/open3d/ml/paddle/classes/__init__.py new file mode 100644 index 00000000000..bac0fc47804 --- /dev/null +++ b/python/open3d/ml/paddle/classes/__init__.py @@ -0,0 +1,22 @@ +# ---------------------------------------------------------------------------- +# - Open3D: www.open3d.org - +# ---------------------------------------------------------------------------- +# Copyright (c) 2018-2023 www.open3d.org +# SPDX-License-Identifier: MIT +# ---------------------------------------------------------------------------- +"""Paddle specific machine learning classes.""" +import paddle + +from .ragged_tensor import RaggedTensor + +DTYPE_MAP = { + paddle.bool: 'bool', + paddle.float16: 'float16', + paddle.float32: 'float32', + paddle.float64: 'float64', + paddle.int8: 'int8', + paddle.int16: 'int16', + paddle.int32: 'int32', + paddle.int64: 'int64', + paddle.bfloat16: 'uint16', +} diff --git a/python/open3d/ml/paddle/classes/ragged_tensor.py b/python/open3d/ml/paddle/classes/ragged_tensor.py new file mode 100644 index 00000000000..0ee22464be5 --- /dev/null +++ b/python/open3d/ml/paddle/classes/ragged_tensor.py @@ -0,0 +1,199 @@ +# ---------------------------------------------------------------------------- +# - Open3D: www.open3d.org - +# ---------------------------------------------------------------------------- +# Copyright (c) 2018-2023 www.open3d.org +# SPDX-License-Identifier: MIT +# ---------------------------------------------------------------------------- + +import paddle +import numpy as np + +__all__ = ['RaggedTensor'] + + +class RaggedTensor: + + def __init__(self, values, row_splits, internal=False): + if not internal: + raise ValueError( + "RaggedTensor constructor is private, please use one of the factory method instead(e.g. RaggedTensor.from_row_splits())" + ) + self._values = values + self._row_splits = row_splits + + @classmethod + def _from_row_splits(cls, values, row_splits, validate=True): + if row_splits.dtype != paddle.int64: + raise ValueError("row_splits must have type paddle.int64") + + values = values.contiguous() + row_splits = row_splits.contiguous() + + if validate: + if len(row_splits.shape) != 1: + raise ValueError("row_splits must be of rank 1") + if row_splits[0] != 0: + raise ValueError( + f"Arguments to from_row_splits do not form a valid RaggedTensor. Expect row_splits[0] == 0 but received row_splits[0] == {row_splits[0]}." + ) + for i in range(0, row_splits.shape[0] - 1): + if row_splits[i] > row_splits[i + 1]: + raise ValueError( + "row_splits must be monotonically increasing") + + row_splits = row_splits.to(values.place) + + return values, row_splits + + @classmethod + def from_row_splits(cls, values, row_splits, validate=True, copy=True): + + if isinstance(values, list): + values = paddle.to_tensor(values, dtype=paddle.float64) + elif isinstance(values, np.ndarray): + values = paddle.to_tensor(values) + elif isinstance(values, paddle.Tensor) and copy: + values = values.clone() + + if isinstance(row_splits, list): + row_splits = paddle.to_tensor(row_splits, dtype=paddle.int64) + elif isinstance(row_splits, np.ndarray): + row_splits = paddle.to_tensor(row_splits) + elif isinstance(row_splits, paddle.Tensor) and copy: + row_splits = row_splits.clone() + + values, row_splits = cls._from_row_splits(values, row_splits, validate) + + return cls(values, row_splits, internal=True) + + @property + def values(self): + """The concatenated rows for this ragged tensor.""" + return self._values + + @property + def row_splits(self): + """The row-split indices for this ragged tensor's `values`.""" + return self._row_splits + + @property + def dtype(self): + """The `DType` of values in this ragged tensor.""" + return self._values.dtype + + @property + def device(self): + """The device of values in this ragged tensor.""" + return self._values.place + + @property + def shape(self): + """The statically known shape of this ragged tensor.""" + return [ + len(self._row_splits.shape[0] - 1), None, *self._values.shape[1:] + ] + + @property + def requires_grad(self): + """Read/writeble `requires_grad` for values.""" + return not self._values.stop_gradient + + @requires_grad.setter + def requires_grad(self, value): + # NOTE: stop_gradient=True means not requires grad + self._values.stop_gradient = not value + + def clone(self): + """Returns a clone of object.""" + return self.__class__(self._values.clone(), self._row_splits.clone(), + True) + + def to_list(self): + """Returns a list of tensors""" + return [tensor for tensor in self._values] + + def __getitem__(self, idx): + return self._values.slice([ + 0, + ], [ + self._row_splits[idx], + ], [ + self._row_splits[idx + 1], + ]) + + def __repr__(self): + return f"RaggedTensor(values={self._values}, row_splits={self._row_splits})" + + def __len__(self): + return len(self._row_splits.shape[0] - 1) + + def __add__(self, other): + values, row_splits = self.__class__._from_row_splits( + self._values + self.__convert_to_tensor(other), self._row_splits, + False) + return RaggedTensor(values, row_splits, True) + + def __iadd__(self, other): + paddle.assign(self._values + self.__convert_to_tensor(other), + self._values) + return self + + def __sub__(self, other): + values, row_splits = self.__class__._from_row_splits( + self._values - self.__convert_to_tensor(other), self._row_splits, + False) + return RaggedTensor(values.clone(), row_splits.clone(), True) + + def __isub__(self, other): + paddle.assign(self._values - self.__convert_to_tensor(other), + self._values) + return self + + def __mul__(self, other): + values, row_splits = self.__class__._from_row_splits( + self._values * self.__convert_to_tensor(other), self._row_splits, + False) + return RaggedTensor(values.clone(), row_splits.clone(), True) + + def __imul__(self, other): + paddle.assign(self._values * self.__convert_to_tensor(other), + self._values) + return self + + def __truediv__(self, other): + values, row_splits = self.__class__._from_row_splits( + self._values / self.__convert_to_tensor(other), self._row_splits, + False) + return RaggedTensor(values.clone(), row_splits.clone(), True) + + def __itruediv__(self, other): + paddle.assign(self._values / self.__convert_to_tensor(other), + self._values) + return self + + def __floordiv__(self, other): + values, row_splits = self.__class__._from_row_splits( + self._values // self.__convert_to_tensor(other), self._row_splits, + False) + return RaggedTensor(values.clone(), row_splits.clone(), True) + + def __ifloordiv__(self, other): + paddle.assign(self._values // self.__convert_to_tensor(other), + self._values) + return self + + def __convert_to_tensor(self, value): + """Converts scalar/tensor/RaggedTensor to paddle.Tensor""" + if isinstance(value, RaggedTensor): + if self._row_splits.shape != value.row_splits.shape or paddle.any( + self._row_splits != value.row_splits).item(): + raise ValueError( + f"Incompatible shape : {self._row_splits} and {value.row_splits}" + ) + return value.values + elif isinstance(value, paddle.Tensor): + return value + elif isinstance(value, (int, float, bool)): + return paddle.to_tensor([value], dtype=type(value)) + else: + raise ValueError(f"Unknown type : {type(value)}") diff --git a/python/open3d/ml/paddle/layers/__init__.py b/python/open3d/ml/paddle/layers/__init__.py new file mode 100644 index 00000000000..8390a9bec51 --- /dev/null +++ b/python/open3d/ml/paddle/layers/__init__.py @@ -0,0 +1,12 @@ +# ---------------------------------------------------------------------------- +# - Open3D: www.open3d.org - +# ---------------------------------------------------------------------------- +# Copyright (c) 2018-2023 www.open3d.org +# SPDX-License-Identifier: MIT +# ---------------------------------------------------------------------------- +"""High level layer API for building networks. + +This module contains layers for processing 3D data. +All layers subclass paddle.nn.Layer +""" +from ..python.layers.neighbor_search import * diff --git a/python/open3d/ml/paddle/ops/__init__.py b/python/open3d/ml/paddle/ops/__init__.py new file mode 100644 index 00000000000..7598d17a876 --- /dev/null +++ b/python/open3d/ml/paddle/ops/__init__.py @@ -0,0 +1,62 @@ +# ---------------------------------------------------------------------------- +# - Open3D: www.open3d.org - +# ---------------------------------------------------------------------------- +# Copyright (c) 2018-2023 www.open3d.org +# SPDX-License-Identifier: MIT +# ---------------------------------------------------------------------------- +"""Functional API with operators. + +These are the building blocks for the layers. See The layer API for an easy to +use high level interface. +""" +import os as _os +import sys as _sys +import types as _types +import importlib as _importlib +import importlib.abc as _importlib_abc +import importlib.util as _importlib_util +import paddle as _paddle +from open3d import _build_config + +from ..python.ops import * + +_lib_path = [] +# allow overriding the path to the op library with an env var. +if 'OPEN3D_PADDLE_OP_LIB' in _os.environ: + _lib_path.append(_os.environ['OPEN3D_PADDLE_OP_LIB']) + +_this_dir = _os.path.dirname(__file__) +_package_root = _os.path.join(_this_dir, '..', '..', '..') +_lib_ext = {'linux': '.so', 'darwin': '.dylib', 'win32': '.dll'}[_sys.platform] +_lib_suffix = '_debug' if _build_config['CMAKE_BUILD_TYPE'] == 'Debug' else '' +_lib_arch = ('cpu',) +if _build_config["BUILD_CUDA_MODULE"] and _paddle.device.cuda.device_count( +) >= 1: + if _paddle.version.cuda() == _build_config["CUDA_VERSION"]: + _lib_arch = ('cuda', 'cpu') + else: + print("Warning: Open3D was built with CUDA {} but" + "Paddle was built with CUDA {}. Falling back to CPU for now." + "Otherwise, install Paddle with CUDA {}.".format( + _build_config["CUDA_VERSION"], _paddle.version.cuda(), + _build_config["CUDA_VERSION"])) +_lib_path.extend([ + _os.path.join(_package_root, la, + 'open3d_paddle_ops' + _lib_suffix + _lib_ext) + for la in _lib_arch +]) + +# only load first lib +_load_lib_path = _lib_path[0] +# load custom op shared library with abs path +_custom_ops = _paddle.utils.cpp_extension.load_op_meta_info_and_register_op( + _load_lib_path) + +try: + _spec = _importlib_util.spec_from_file_location(__name__, _load_lib_path) + assert _spec is not None + _mod = _importlib_util.module_from_spec(_spec) + assert isinstance(_spec.loader, _importlib_abc.Loader) + _spec.loader.exec_module(_mod) +except ImportError: + _mod = _types.ModuleType(__name__) diff --git a/python/open3d/ml/paddle/python/layers/neighbor_search.py b/python/open3d/ml/paddle/python/layers/neighbor_search.py new file mode 100644 index 00000000000..29b1e68b3b1 --- /dev/null +++ b/python/open3d/ml/paddle/python/layers/neighbor_search.py @@ -0,0 +1,376 @@ +# ---------------------------------------------------------------------------- +# - Open3D: www.open3d.org - +# ---------------------------------------------------------------------------- +# Copyright (c) 2018-2023 www.open3d.org +# SPDX-License-Identifier: MIT +# ---------------------------------------------------------------------------- + +from ...python import ops +from ....paddle import classes +from ...classes import DTYPE_MAP +import paddle + +__all__ = ['FixedRadiusSearch', 'RadiusSearch', 'KNNSearch'] + + +class FixedRadiusSearch(paddle.nn.Layer): + """Fixed radius search for 3D point clouds. + + This layer computes the neighbors for a fixed radius on a point cloud. + + Example: + This example shows a neighbor search that returns the indices to the + found neighbors and the distances.:: + + import paddle + import open3d.ml.paddle as ml3d + + points = paddle.randn([20, 3]) + queries = paddle.randn([10, 3]) + radius = 0.8 + + nsearch = ml3d.layers.FixedRadiusSearch(return_distances=True) + ans = nsearch(points, queries, radius) + # returns a tuple of neighbors_index, neighbors_row_splits, and neighbors_distance + + + Arguments: + metric: Either L1, L2 or Linf. Default is L2. + + ignore_query_point: If True the points that coincide with the center of + the search window will be ignored. This excludes the query point if + 'queries' and 'points' are the same point cloud. + + return_distances: If True the distances for each neighbor will be returned. + If False a zero length Tensor will be returned instead. + """ + + def __init__(self, + metric='L2', + ignore_query_point=False, + return_distances=False, + max_hash_table_size=32 * 2**20, + index_dtype=paddle.int32, + **kwargs): + super().__init__() + self.metric = metric + self.ignore_query_point = ignore_query_point + self.return_distances = return_distances + self.max_hash_table_size = max_hash_table_size + assert index_dtype in [paddle.int32, paddle.int64] + self.index_dtype = DTYPE_MAP[index_dtype] + + def forward(self, + points, + queries, + radius, + points_row_splits=None, + queries_row_splits=None, + hash_table_size_factor=1 / 64, + hash_table=None): + """This function computes the neighbors within a fixed radius for each query point. + + Arguments: + + points: The 3D positions of the input points. It can be a RaggedTensor. + + queries: The 3D positions of the query points. It can be a RaggedTensor. + + radius: A scalar with the neighborhood radius + + points_row_splits: Optional 1D vector with the row splits information + if points is batched. This vector is [0, num_points] if there is + only 1 batch item. + + queries_row_splits: Optional 1D vector with the row splits information + if queries is batched. This vector is [0, num_queries] if there is + only 1 batch item. + + hash_table_size_factor: Scalar. The size of the hash table as fraction + of points. + + hash_table: A precomputed hash table generated with build_spatial_hash_table(). + This input can be used to explicitly force the reuse of a hash table in special + cases and is usually not needed. + Note that the hash table must have been generated with the same 'points' array. + + Returns: + 3 Tensors in the following order + + neighbors_index + The compact list of indices of the neighbors. The corresponding query point + can be inferred from the 'neighbor_count_row_splits' vector. + + neighbors_row_splits + The exclusive prefix sum of the neighbor count for the query points including + the total neighbor count as the last element. The size of this array is the + number of queries + 1. + + neighbors_distance + Stores the distance to each neighbor if 'return_distances' is True. + Note that the distances are squared if metric is L2. + This is a zero length Tensor if 'return_distances' is False. + """ + + if isinstance(points, classes.RaggedTensor): + points_row_splits = points.row_splits + points = points.values + if isinstance(queries, classes.RaggedTensor): + queries_row_splits = queries.row_splits + queries = queries.values + + if points_row_splits is None: + points_row_splits = paddle.to_tensor([0, points.shape[0]], + dtype="int64") + if queries_row_splits is None: + queries_row_splits = paddle.to_tensor([0, queries.shape[0]], + dtype="int64") + + if hash_table is None: + table = ops.build_spatial_hash_table( + max_hash_table_size=self.max_hash_table_size, + points=points, + radius=radius, + points_row_splits=points_row_splits, + hash_table_size_factor=hash_table_size_factor) + else: + table = hash_table + + result = ops.fixed_radius_search( + ignore_query_point=self.ignore_query_point, + return_distances=self.return_distances, + metric_str=self.metric, + points=points, + queries=queries, + radius=radius, + points_row_splits=points_row_splits, + queries_row_splits=queries_row_splits, + hash_table_splits=table.hash_table_splits, + hash_table_index=table.hash_table_index, + hash_table_cell_splits=table.hash_table_cell_splits, + index_dtype=self.index_dtype) + + return result + + +class RadiusSearch(paddle.nn.Layer): + """Radius search for 3D point clouds. + + This layer computes the neighbors for each query point with each query + having an individual radius. + + Example: + This example shows a neighbor search that returns the indices to the + found neighbors and the distances.:: + + import paddle + import open3d.ml.paddle as ml3d + + points = paddle.randn([20, 3]) + queries = paddle.randn([10, 3]) + radii = paddle.randn([10]) + 1.0 + + nsearch = ml3d.layers.RadiusSearch(return_distances=True) + ans = nsearch(points, queries, radii) + # returns a tuple of neighbors_index, neighbors_row_splits, and neighbors_distance + + + Arguments: + metric: Either L1, L2 or Linf. Default is L2. + + ignore_query_point: If True the points that coincide with the center of the + search window will be ignored. This excludes the query point if 'queries' + and 'points' are the same point cloud. + + return_distances: If True the distances for each neighbor will be returned. + If False a zero length Tensor will be returned instead. + + normalize_distances: If True the returned distances will be normalized with + the radii. + """ + + def __init__(self, + metric='L2', + ignore_query_point=False, + return_distances=False, + normalize_distances=False, + index_dtype=paddle.int32, + **kwargs): + super().__init__() + self.metric = metric + self.ignore_query_point = ignore_query_point + self.return_distances = return_distances + self.normalize_distances = normalize_distances + assert index_dtype in [paddle.int32, paddle.int64] + self.index_dtype = DTYPE_MAP[index_dtype] + + def forward(self, + points, + queries, + radii, + points_row_splits=None, + queries_row_splits=None): + """This function computes the neighbors within a radius for each query point. + + Arguments: + + points: The 3D positions of the input points. + + queries: The 3D positions of the query points. + + radii: A radius for each query point. + + points_row_splits: Optional 1D vector with the row splits information + if points is batched. This vector is [0, num_points] if there is + only 1 batch item. + + queries_row_splits: Optional 1D vector with the row splits information + if queries is batched. This vector is [0, num_queries] if there is + only 1 batch item. + + Returns: + 3 Tensors in the following order + + neighbors_index + The compact list of indices of the neighbors. The corresponding query point + can be inferred from the 'neighbor_count_row_splits' vector. + + neighbors_row_splits + The exclusive prefix sum of the neighbor count for the query points including + the total neighbor count as the last element. The size of this array is the + number of queries + 1. + + neighbors_distance + Stores the distance to each neighbor if 'return_distances' is True. + Note that the distances are squared if metric is L2. + This is a zero length Tensor if 'return_distances' is False. + """ + if points_row_splits is None: + points_row_splits = paddle.to_tensor([0, points.shape[0]], + dtype="int64") + if queries_row_splits is None: + queries_row_splits = paddle.to_tensor([0, queries.shape[0]], + dtype="int64") + + result = ops.radius_search(ignore_query_point=self.ignore_query_point, + return_distances=self.return_distances, + normalize_distances=self.normalize_distances, + metric_str=self.metric, + points=points, + queries=queries, + radii=radii, + points_row_splits=points_row_splits, + queries_row_splits=queries_row_splits, + index_dtype=self.index_dtype) + + return result + + +class KNNSearch(paddle.nn.Layer): + """KNN search for 3D point clouds. + + This layer computes the k nearest neighbors for each query point. + + Example: + This example shows a neighbor search that returns the indices to the + found neighbors and the distances.:: + + import paddle + import open3d.ml.paddle as ml3d + + points = paddle.randn([20, 3]) + queries = paddle.randn([10, 3]) + k = 8 + + nsearch = ml3d.layers.KNNSearch(return_distances=True) + ans = nsearch(points, queries, k) + # returns a tuple of neighbors_index, neighbors_row_splits, and neighbors_distance + # Since there are more than k points and we do not ignore any points we can + # reshape the output to [num_queries, k] with + neighbors_index = ans.neighbors_index.reshape(10,k) + neighbors_distance = ans.neighbors_distance.reshape(10,k) + + + Arguments: + metric: Either L1, L2 or Linf. Default is L2. + + ignore_query_point: If True the points that coincide with the center of the + search window will be ignored. This excludes the query point if 'queries' + and 'points' are the same point cloud. + + return_distances: If True the distances for each neighbor will be returned. + If False a zero length Tensor will be returned instead. + """ + + def __init__(self, + metric='L2', + ignore_query_point=False, + return_distances=False, + index_dtype=paddle.int32, + **kwargs): + super().__init__() + self.metric = metric + self.ignore_query_point = ignore_query_point + self.return_distances = return_distances + assert index_dtype in [paddle.int32, paddle.int64] + self.index_dtype = DTYPE_MAP[index_dtype] + + def forward(self, + points, + queries, + k, + points_row_splits=None, + queries_row_splits=None): + """This function computes the k nearest neighbors for each query point. + + Arguments: + points: The 3D positions of the input points. *This argument must be + given as a positional argument!* + + queries: The 3D positions of the query points. + + k: The number of nearest neighbors to search. + + points_row_splits: Optional 1D vector with the row splits information + if points is batched. + This vector is [0, num_points] if there is only 1 batch item. + + queries_row_splits: Optional 1D vector with the row splits information + if queries is batched. + This vector is [0, num_queries] if there is only 1 batch item. + + Returns: 3 Tensors in the following order + + neighbors_index + The compact list of indices of the neighbors. The corresponding query point + can be inferred from the 'neighbor_count_row_splits' vector. + + neighbors_row_splits + The exclusive prefix sum of the neighbor count for the query points including + the total neighbor count as the last element. The size of this array is the + number of queries + 1. + + neighbors_distance + Stores the distance to each neighbor if 'return_distances' is True. + Note that the distances are squared if metric is L2. + This is a zero length Tensor if 'return_distances' is False. + """ + + if points_row_splits is None: + points_row_splits = paddle.to_tensor([0, points.shape[0]], + dtype=paddle.int64) + if queries_row_splits is None: + queries_row_splits = paddle.to_tensor([0, queries.shape[0]], + dtype=paddle.int64) + + result = ops.knn_search(ignore_query_point=self.ignore_query_point, + return_distances=self.return_distances, + metric_str=self.metric, + points=points, + queries=queries, + k=k, + points_row_splits=points_row_splits, + queries_row_splits=queries_row_splits, + index_dtype=self.index_dtype) + + return result diff --git a/python/open3d/ml/paddle/python/return_types.py.in b/python/open3d/ml/paddle/python/return_types.py.in new file mode 100644 index 00000000000..9af42040ab2 --- /dev/null +++ b/python/open3d/ml/paddle/python/return_types.py.in @@ -0,0 +1,29 @@ +# ---------------------------------------------------------------------------- +# - Open3D: www.open3d.org - +# ---------------------------------------------------------------------------- +# The MIT License (MIT) +# +# Copyright (c) 2018-2023 www.open3d.org +# +# 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. +# ---------------------------------------------------------------------------- + +# This file is machine generated. Do not modify. +from collections import namedtuple as _namedtuple + diff --git a/python/test/ml_ops/mltest.py b/python/test/ml_ops/mltest.py index c4761466e1e..2cce40716be 100644 --- a/python/test/ml_ops/mltest.py +++ b/python/test/ml_ops/mltest.py @@ -17,7 +17,8 @@ # skip all tests if the ml ops were not built default_marks = [ pytest.mark.skipif(not (o3d._build_config['BUILD_TENSORFLOW_OPS'] or - o3d._build_config['BUILD_PYTORCH_OPS']), + o3d._build_config['BUILD_PYTORCH_OPS'] or + o3d._build_config['BUILD_PADDLE_OPS']), reason='ml ops not built'), ] @@ -62,9 +63,24 @@ except ImportError: pass +try: + paddle = importlib.import_module('paddle') + ml3d_ops = importlib.import_module('open3d.ml.paddle.ops') + ml3d_layers = importlib.import_module('open3d.ml.paddle.layers') + ml3d_classes = importlib.import_module('open3d.ml.paddle.classes') + _ml_modules['paddle'] = MLModules(paddle, ml3d_ops, ml3d_layers, + ml3d_classes, 'cpu', 'cpu', False) + if paddle.device.is_compiled_with_cuda( + ) and o3d._build_config['BUILD_CUDA_MODULE']: + _ml_modules['paddle_cuda'] = MLModules(paddle, ml3d_ops, ml3d_layers, + ml3d_classes, 'cuda', 'cpu', + True) +except ImportError: + pass + def is_gpu_device_name(name): - return name in ('GPU:0', 'cuda') + return name in ('GPU:0', 'cuda', 'gpu:0', 'gpu') def to_numpy(tensor): @@ -75,6 +91,8 @@ def to_numpy(tensor): if tensor.device.type == 'cuda': tensor = tensor.cpu() + return tensor.numpy() + elif 'paddle' in _ml_modules and isinstance(tensor, paddle.Tensor): return tensor.numpy() else: return tensor.numpy() @@ -88,6 +106,25 @@ def to_torch(x, device): return x +def to_paddle(x, device): + """Converts x such that it can be used as input to a paddle op.""" + if isinstance(x, np.ndarray): + return paddle.to_tensor( + x, place='gpu') if device == 'cuda' else paddle.to_tensor( + x, place='cpu') + else: + return x + + +def paddle_cmp_device(x, device): + if device == 'cuda' and x.place.is_gpu_place(): + return True + elif device == 'cpu' and x.place.is_cpu_place(): + return True + else: + return False + + def run_op(ml, device_name, check_device, fn, *args, **kwargs): """Runs an op using an ml framework""" if ml.module.__name__ == 'tensorflow': @@ -126,7 +163,25 @@ def run_op(ml, device_name, check_device, fn, *args, **kwargs): x, torch.Tensor) and device_name == x.device.type: tensor_on_device = True assert tensor_on_device + elif ml.module.__name__ == 'paddle': + _args = [to_paddle(x, device_name) for x in args] + _kwargs = {k: to_paddle(v, device_name) for k, v in kwargs.items()} + + ans = fn(*_args, **_kwargs) + if check_device: + # not all returned tensor have to use the device. + # check if there is at least one tensor using device memory + tensor_on_device = False + if isinstance(ans, paddle.Tensor): + if paddle_cmp_device(ans, device_name): + tensor_on_device = True + else: + for x in ans: + if isinstance(x, paddle.Tensor) and paddle_cmp_device( + x, device_name): + tensor_on_device = True + assert tensor_on_device else: raise ValueError('unsupported ml framework {}'.format(ml.module)) @@ -189,6 +244,30 @@ def run_op_grad(ml, device_name, check_device, fn, x, y_attr_name, torch.Tensor) and device_name == dy_dx.device.type: tensor_on_device = True assert tensor_on_device + elif ml.module.__name__ == 'paddle': + x_var = to_paddle(x, device_name) + x_var.stop_gradient = False + _args = [x_var if a is x else to_paddle(a, device_name) for a in args] + _kwargs = { + k: x_var if a is x else to_paddle(a, device_name) + for k, a in kwargs.items() + } + + ans = fn(*_args, **_kwargs) + if y_attr_name: + y = getattr(ans, y_attr_name) + else: + y = ans + y.backward(to_paddle(backprop_values, device_name)) + dy_dx = x_var.grad + + if check_device: + # check if the gradient is using device memory + tensor_on_device = False + if isinstance(dy_dx, paddle.Tensor) and paddle_cmp_device( + dy_dx, device_name): + tensor_on_device = True + assert tensor_on_device else: raise ValueError('unsupported ml framework {}'.format(ml.module)) @@ -213,6 +292,8 @@ def set_seed(self, seed): self.module.random.set_seed(seed) elif self.module.__name__ == 'torch': self.module.manual_seed(seed) + elif self.module.__name__ == 'paddle': + self.module.seed(seed) else: raise Exception('Unsupported ml framework') @@ -221,19 +302,27 @@ def set_deterministic(self, deterministic): pass elif self.module.__name__ == 'torch': self.module.set_deterministic(deterministic) + elif self.module.__name__ == 'paddle': + paddle.set_flags({ + "FLAGS_cudnn_deterministic": "1", + "FLAGS_cpu_deterministic": "1" + }) else: raise Exception('Unsupported ml framework') - def random_uniform(self, size, dtype, minval=0, maxval=1): + def random_uniform(self, shape, dtype, minval=0, maxval=1): if isinstance(dtype, str): dtype = self.get_dtype(dtype) if self.module.__name__ == 'tensorflow': - return self.module.random.uniform(shape=size, + return self.module.random.uniform(shape=shape, dtype=dtype, minval=minval, maxval=maxval) elif self.module.__name__ == 'torch': - ans = self.module.empty(size=size, dtype=dtype) + ans = self.module.empty(size=shape, dtype=dtype) + return ans.uniform_(minval, maxval) + elif self.module.__name__ == 'paddle': + ans = self.module.empty(shape=shape, dtype=dtype) return ans.uniform_(minval, maxval) else: raise Exception('Unsupported ml framework') @@ -245,6 +334,8 @@ def empty(self, shape, dtype): return self.module.zeros(shape=shape, dtype=dtype) elif self.module.__name__ == 'torch': return self.module.empty(size=shape, dtype=dtype) + elif self.module.__name__ == 'paddle': + return self.module.empty(shape=shape, dtype=dtype) else: raise Exception('Unsupported ml framework') @@ -255,6 +346,8 @@ def zeros(self, shape, dtype): return self.module.zeros(shape=shape, dtype=dtype) elif self.module.__name__ == 'torch': return self.module.zeros(size=shape, dtype=dtype) + elif self.module.__name__ == 'paddle': + return self.module.zeros(shape=shape, dtype=dtype) else: raise Exception('Unsupported ml framework') @@ -272,6 +365,13 @@ def zeros(self, shape, dtype): ml_tf_only=pytest.mark.parametrize('ml', [ v for k, v in _ml_modules.items() if v.module.__name__ == 'tensorflow' ]), + ml_paddle_only=pytest.mark.parametrize( + 'ml', + [v for k, v in _ml_modules.items() if v.module.__name__ == 'paddle']), + ml_torch_and_paddle_only=pytest.mark.parametrize('ml', [ + v for k, v in _ml_modules.items() + if v.module.__name__ == 'paddle' or v.module.__name__ == 'torch' + ]), ) diff --git a/python/test/ml_ops/test_fixed_radius_search.py b/python/test/ml_ops/test_fixed_radius_search.py index f0ccf87eada..99c123a9b76 100644 --- a/python/test/ml_ops/test_fixed_radius_search.py +++ b/python/test/ml_ops/test_fixed_radius_search.py @@ -14,6 +14,8 @@ import torch if o3d._build_config['BUILD_TENSORFLOW_OPS']: import tensorflow as tf +if o3d._build_config['BUILD_PADDLE_OPS']: + import paddle # skip all tests if the ml ops were not built pytestmark = mltest.default_marks @@ -62,6 +64,11 @@ def test_fixed_radius_search(dtype, ml, num_points_queries, radius, index_dtype_ = {'int32': tf.int32, 'int64': tf.int64}[index_dtype] elif ml.module.__name__ == 'torch': index_dtype_ = {'int32': torch.int32, 'int64': torch.int64}[index_dtype] + elif ml.module.__name__ == 'paddle': + index_dtype_ = { + 'int32': paddle.int32, + 'int64': paddle.int64 + }[index_dtype] else: raise Exception('Unsupported ml framework') @@ -209,6 +216,11 @@ def test_fixed_radius_search_batches(dtype, ml, batch_size, radius, index_dtype_ = {'int32': tf.int32, 'int64': tf.int64}[index_dtype] elif ml.module.__name__ == 'torch': index_dtype_ = {'int32': torch.int32, 'int64': torch.int64}[index_dtype] + elif ml.module.__name__ == 'paddle': + index_dtype_ = { + 'int32': paddle.int32, + 'int64': paddle.int64 + }[index_dtype] else: raise Exception('Unsupported ml framework') diff --git a/python/test/ml_ops/test_knn_search.py b/python/test/ml_ops/test_knn_search.py index 175835f6593..f61f6e407d2 100644 --- a/python/test/ml_ops/test_knn_search.py +++ b/python/test/ml_ops/test_knn_search.py @@ -14,6 +14,8 @@ import torch if o3d._build_config['BUILD_TENSORFLOW_OPS']: import tensorflow as tf +if o3d._build_config['BUILD_PADDLE_OPS']: + import paddle # skip all tests if the ml ops were not built pytestmark = mltest.default_marks @@ -59,6 +61,11 @@ def test_knn_search(dtype, ml, num_points_queries, metric, ignore_query_point, index_dtype_ = {'int32': tf.int32, 'int64': tf.int64}[index_dtype] elif ml.module.__name__ == 'torch': index_dtype_ = {'int32': torch.int32, 'int64': torch.int64}[index_dtype] + elif ml.module.__name__ == 'paddle': + index_dtype_ = { + 'int32': paddle.int32, + 'int64': paddle.int64 + }[index_dtype] else: raise Exception('Unsupported ml framework') diff --git a/python/test/ml_ops/test_radius_search.py b/python/test/ml_ops/test_radius_search.py index 85b2af0ad0d..1f75206bc77 100644 --- a/python/test/ml_ops/test_radius_search.py +++ b/python/test/ml_ops/test_radius_search.py @@ -14,6 +14,8 @@ import torch if o3d._build_config['BUILD_TENSORFLOW_OPS']: import tensorflow as tf +if o3d._build_config['BUILD_PADDLE_OPS']: + import paddle # skip all tests if the tf ops were not built and disable warnings caused by # tensorflow @@ -58,6 +60,11 @@ def test_radius_search(dtype, ml, num_points_queries, metric, index_dtype_ = {'int32': tf.int32, 'int64': tf.int64}[index_dtype] elif ml.module.__name__ == 'torch': index_dtype_ = {'int32': torch.int32, 'int64': torch.int64}[index_dtype] + elif ml.module.__name__ == 'paddle': + index_dtype_ = { + 'int32': paddle.int32, + 'int64': paddle.int64 + }[index_dtype] else: raise Exception('Unsupported ml framework') diff --git a/python/test/ml_ops/test_ragged_tensor_paddle.py b/python/test/ml_ops/test_ragged_tensor_paddle.py new file mode 100644 index 00000000000..f1b4b02d8a4 --- /dev/null +++ b/python/test/ml_ops/test_ragged_tensor_paddle.py @@ -0,0 +1,209 @@ +# ---------------------------------------------------------------------------- +# - Open3D: www.open3d.org - +# ---------------------------------------------------------------------------- +# Copyright (c) 2018-2023 www.open3d.org +# SPDX-License-Identifier: MIT +# ---------------------------------------------------------------------------- + +# noqa # pylint: disable=unused-import +import open3d as o3d +import numpy as np +import pytest +import mltest +import paddle + +# skip all tests if the tf ops were not built and disable warnings caused by +# tensorflow +pytestmark = mltest.default_marks + +# the supported dtypes for the values +dtypes = pytest.mark.parametrize('dtype', + [np.int32, np.int64, np.float32, np.float64]) + +# this class is only available for torch + + +@dtypes +@mltest.parametrize.ml_paddle_only +def test_creation(dtype, ml): + values = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], dtype=dtype) + row_splits = np.array([0, 2, 4, 4, 5, 12, 13], dtype=np.int64) + + # From numpy arrays + r_tensor = ml.classes.RaggedTensor.from_row_splits(values, row_splits) + for i, tensor in enumerate(r_tensor): + np.testing.assert_equal(mltest.to_numpy(tensor), + values[row_splits[i]:row_splits[i + 1]]) + + # From List + r_tensor = ml.classes.RaggedTensor.from_row_splits(list(values), + list(row_splits)) + for i, tensor in enumerate(r_tensor): + np.testing.assert_equal(mltest.to_numpy(tensor), + values[row_splits[i]:row_splits[i + 1]]) + + # Incompatible tensors. + # Non zero first element. + row_splits = np.array([1, 2, 4, 4, 5, 12, 13], dtype=np.int64) + + context = np.testing.assert_raises(ValueError) + + with context: + ml.classes.RaggedTensor.from_row_splits(values, row_splits) + + # Rank > 1. + row_splits = np.array([[0, 2, 4, 4, 5, 12, 13]], dtype=np.int64) + with context: + ml.classes.RaggedTensor.from_row_splits(values, row_splits) + + # Not increasing monotonically. + row_splits = np.array([[0, 2, 4, 6, 5, 12, 13]], dtype=np.int64) + with context: + ml.classes.RaggedTensor.from_row_splits(values, row_splits) + + # Wrong dtype. + row_splits = np.array([0, 2, 4, 4, 5, 12, 13], dtype=np.float32) + with context: + ml.classes.RaggedTensor.from_row_splits(values, row_splits) + + +# test with more dimensions +@dtypes +@mltest.parametrize.ml_paddle_only +def test_creation_more_dims(dtype, ml): + values = np.array([[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], + [7, 7], [8, 8], [9, 9], [10, 10], [11, 11], [12, 12]], + dtype=dtype) + row_splits = np.array([0, 2, 4, 4, 5, 12, 13], dtype=np.int64) + + # From numpy arrays + r_tensor = ml.classes.RaggedTensor.from_row_splits(values, row_splits) + for i, tensor in enumerate(r_tensor): + np.testing.assert_equal(mltest.to_numpy(tensor), + values[row_splits[i]:row_splits[i + 1]]) + + # From List + r_tensor = ml.classes.RaggedTensor.from_row_splits(list(values), + list(row_splits)) + for i, tensor in enumerate(r_tensor): + np.testing.assert_equal(mltest.to_numpy(tensor), + values[row_splits[i]:row_splits[i + 1]]) + + +@mltest.parametrize.ml_paddle_only +def test_backprop(ml): + # Create 3 different RaggedTensors and torch.tensor + t_1 = paddle.randn([10, 3]) + t_1.stop_gradient = False + + t_2 = paddle.randn([10, 3]) + t_2.stop_gradient = False + + t_3 = paddle.randn([10, 3]) + t_3.stop_gradient = False + + row_splits = paddle.to_tensor([0, 4, 6, 6, 8, 10]) + + r_1 = ml.classes.RaggedTensor.from_row_splits(t_1.detach().numpy(), + row_splits) + r_1.requires_grad = True + r_2 = ml.classes.RaggedTensor.from_row_splits(t_2.detach().numpy(), + row_splits) + r_2.requires_grad = True + r_3 = ml.classes.RaggedTensor.from_row_splits(t_3.detach().numpy(), + row_splits) + r_3.requires_grad = True + + r_ans = (r_1 + r_2) * r_3 + t_ans = (t_1 + t_2) * t_3 + + np.testing.assert_equal(mltest.to_numpy(t_ans), + mltest.to_numpy(r_ans.values)) + + # Compute gradients + t_ans.sum().backward() + r_ans.values.sum().backward() + + np.testing.assert_equal(mltest.to_numpy(t_1.grad), + mltest.to_numpy(r_1.values.grad)) + + +@dtypes +@mltest.parametrize.ml_paddle_only +def test_binary_ew_ops(dtype, ml): + # Binary Ops. + device = 'gpu' if ml.device == 'cuda' else 'cpu' + + t_1 = paddle.to_tensor( + np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], + dtype=dtype)).to(device) + t_2 = paddle.to_tensor( + np.array([2, 3, 6, 3, 11, 3, 43, 12, 8, 15, 12, 87, 45], + dtype=dtype)).to(device) + + row_splits = paddle.to_tensor( + np.array([0, 2, 4, 4, 5, 12, 13], dtype=np.int64)).to(device) + + a = ml.classes.RaggedTensor.from_row_splits(t_1, row_splits) + b = ml.classes.RaggedTensor.from_row_splits(t_2, row_splits) + + np.testing.assert_equal( + (a + b).values.cpu().numpy(), + np.array([2, 4, 8, 6, 15, 8, 49, 19, 16, 24, 22, 98, 57])) + np.testing.assert_equal( + (a - b).values.cpu().numpy(), + np.array([-2, -2, -4, 0, -7, 2, -37, -5, 0, -6, -2, -76, -33])) + np.testing.assert_equal( + (a * b).values.cpu().numpy(), + np.array([0, 3, 12, 9, 44, 15, 258, 84, 64, 135, 120, 957, 540])) + np.testing.assert_equal((a / b).values.cpu().numpy(), + (t_1 / t_2).cpu().numpy()) + np.testing.assert_equal((a // b).values.cpu().numpy(), + np.array([0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0])) + + # Assignment Ops. + a = ml.classes.RaggedTensor.from_row_splits(t_1, row_splits) + a += b + np.testing.assert_equal( + a.values.cpu().numpy(), + np.array([2, 4, 8, 6, 15, 8, 49, 19, 16, 24, 22, 98, 57])) + + a = ml.classes.RaggedTensor.from_row_splits(t_1, row_splits) + a -= b + np.testing.assert_equal( + a.values.cpu().numpy(), + np.array([-2, -2, -4, 0, -7, 2, -37, -5, 0, -6, -2, -76, -33])) + + a = ml.classes.RaggedTensor.from_row_splits(t_1, row_splits) + a *= b + np.testing.assert_equal( + a.values.cpu().numpy(), + np.array([0, 3, 12, 9, 44, 15, 258, 84, 64, 135, 120, 957, 540])) + + a = ml.classes.RaggedTensor.from_row_splits(t_1, row_splits) + a //= b + np.testing.assert_equal(a.values.cpu().numpy(), + np.array([0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0])) + + # Failure cases with incompatible shape. + # Different row_splits. + row_splits = [0, 4, 5, 13] + a = ml.classes.RaggedTensor.from_row_splits(t_1, row_splits) + row_splits = [0, 4, 6, 13] + b = ml.classes.RaggedTensor.from_row_splits(t_2, row_splits) + + with np.testing.assert_raises(ValueError): + a + b # noqa # pylint: disable=pointless-statement + with np.testing.assert_raises(ValueError): + a += b # noqa # pylint: disable=pointless-statement + + # Different length + row_splits = [0, 4, 5, 13] + a = ml.classes.RaggedTensor.from_row_splits(t_1, row_splits) + row_splits = [0, 4, 13] + b = ml.classes.RaggedTensor.from_row_splits(t_2, row_splits) + + with np.testing.assert_raises(ValueError): + a + b # noqa # pylint: disable=pointless-statement + with np.testing.assert_raises(ValueError): + a += b diff --git a/python/test/ml_ops/test_ragged_to_dense.py b/python/test/ml_ops/test_ragged_to_dense.py index cae16e98f1b..430824a0621 100644 --- a/python/test/ml_ops/test_ragged_to_dense.py +++ b/python/test/ml_ops/test_ragged_to_dense.py @@ -5,6 +5,7 @@ # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- +# noqa # pylint: disable=unused-import import open3d as o3d import numpy as np import pytest @@ -22,7 +23,7 @@ @dtypes -@mltest.parametrize.ml_torch_only +@mltest.parametrize.ml_torch_and_paddle_only def test_ragged_to_dense(dtype, ml): values = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], dtype=dtype) @@ -30,8 +31,14 @@ def test_ragged_to_dense(dtype, ml): out_col_size = 4 default_value = np.array(-1, dtype=dtype) - ans = mltest.run_op(ml, ml.device, True, ml.ops.ragged_to_dense, values, - row_splits, out_col_size, default_value) + ans = mltest.run_op(ml, + ml.device, + True, + ml.ops.ragged_to_dense, + values=values, + row_splits=row_splits, + out_col_size=out_col_size, + default_value=default_value) expected = np.full((row_splits.shape[0] - 1, out_col_size), default_value) for i in range(row_splits.shape[0] - 1): @@ -44,7 +51,7 @@ def test_ragged_to_dense(dtype, ml): # test with more dimensions @dtypes -@mltest.parametrize.ml_torch_only +@mltest.parametrize.ml_torch_and_paddle_only def test_ragged_to_dense_more_dims(dtype, ml): values = np.array([[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], @@ -54,8 +61,14 @@ def test_ragged_to_dense_more_dims(dtype, ml): out_col_size = 4 default_value = np.array([-1, -1], dtype=dtype) - ans = mltest.run_op(ml, ml.device, True, ml.ops.ragged_to_dense, values, - row_splits, out_col_size, default_value) + ans = mltest.run_op(ml, + ml.device, + True, + ml.ops.ragged_to_dense, + values=values, + row_splits=row_splits, + out_col_size=out_col_size, + default_value=default_value) expected = np.full(( row_splits.shape[0] - 1, @@ -71,7 +84,7 @@ def test_ragged_to_dense_more_dims(dtype, ml): # test with larger random data @dtypes -@mltest.parametrize.ml_torch_only +@mltest.parametrize.ml_torch_and_paddle_only @pytest.mark.parametrize('seed', [123, 456]) def test_ragged_to_dense_random(dtype, ml, seed): @@ -87,8 +100,14 @@ def test_ragged_to_dense_random(dtype, ml, seed): default_value = np.array(-1, dtype=dtype) - ans = mltest.run_op(ml, ml.device, True, ml.ops.ragged_to_dense, values, - row_splits, out_col_size, default_value) + ans = mltest.run_op(ml, + ml.device, + True, + ml.ops.ragged_to_dense, + values=values, + row_splits=row_splits, + out_col_size=out_col_size, + default_value=default_value) expected = np.full((row_splits.shape[0] - 1, out_col_size), default_value) for i in range(row_splits.shape[0] - 1): From 86848ab52719ac3805aba58fb09a3dd8f19faf5f Mon Sep 17 00:00:00 2001 From: SecretXV Date: Tue, 5 Nov 2024 17:12:49 +0800 Subject: [PATCH 04/19] [Fix] remove useless files Signed-off-by: SecretXV --- .gitignore | 1 + .hypothesis/unicode_data/12.1.0/charmap.json.gz | Bin 20688 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 .hypothesis/unicode_data/12.1.0/charmap.json.gz diff --git a/.gitignore b/.gitignore index 8a041878cc6..3dfdd3e3b87 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ _vimrc_local.vim .vscode/ .clangd/ .ccls-cache/ +.hypothesis/ # Build artifacts **/package-lock.json diff --git a/.hypothesis/unicode_data/12.1.0/charmap.json.gz b/.hypothesis/unicode_data/12.1.0/charmap.json.gz deleted file mode 100644 index 8f1c7eb66a7331d82f847f5b3b76c7d82b5707fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20688 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

J8XU}SKiLg1-;gm%k(^xuf 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 From cd5510be3bdbca1f59bb7f4d7a104b4f0b42b630 Mon Sep 17 00:00:00 2001 From: SecretXV <145354053+SecretXV@users.noreply.github.com> Date: Thu, 7 Nov 2024 14:28:57 +0800 Subject: [PATCH 05/19] [Fix] fix compile on gcc 8.2.0 (#4) Signed-off-by: SecretXV --- cpp/open3d/t/geometry/kernel/VoxelBlockGridImpl.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/open3d/t/geometry/kernel/VoxelBlockGridImpl.h b/cpp/open3d/t/geometry/kernel/VoxelBlockGridImpl.h index dd0fb9dc148..f306436323e 100644 --- a/cpp/open3d/t/geometry/kernel/VoxelBlockGridImpl.h +++ b/cpp/open3d/t/geometry/kernel/VoxelBlockGridImpl.h @@ -703,7 +703,7 @@ void RayCastCPU index_t block_buf_idx = cache.Check(key[0], key[1], key[2]); if (block_buf_idx < 0) { auto iter = hashmap_impl.find(key); - if (iter == hashmap_impl.end()) return -1; + if (iter == hashmap_impl.cend()) return -1; block_buf_idx = iter->second; cache.Update(key[0], key[1], key[2], block_buf_idx); } @@ -730,7 +730,7 @@ void RayCastCPU index_t block_buf_idx = cache.Check(x_b, y_b, z_b); if (block_buf_idx < 0) { auto iter = hashmap_impl.find(key); - if (iter == hashmap_impl.end()) return -1; + if (iter == hashmap_impl.cend()) return -1; block_buf_idx = iter->second; cache.Update(x_b, y_b, z_b, block_buf_idx); } @@ -929,7 +929,7 @@ void RayCastCPU index_t block_buf_idx = cache.Check(x_b, y_b, z_b); if (block_buf_idx < 0) { auto iter = hashmap_impl.find(key); - if (iter == hashmap_impl.end()) return; + if (iter == hashmap_impl.cend()) return; block_buf_idx = iter->second; cache.Update(x_b, y_b, z_b, block_buf_idx); } From 501af0e0b26db720f6cca3b635065f2e23a31e0f Mon Sep 17 00:00:00 2001 From: RDIO <35186529+Woodman3@users.noreply.github.com> Date: Fri, 8 Nov 2024 12:51:01 +0800 Subject: [PATCH 06/19] [Feat] Add all misc operators (#3) * [Feat] Add all misc operators * add comment to cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cu * [CodeStyle] device to place --------- Signed-off-by: Woodman3 <1025760745@qq.com> Signed-off-by: RDIO <35186529+Woodman3@users.noreply.github.com> Co-authored-by: SecretXV <145354053+SecretXV@users.noreply.github.com> --- cpp/open3d/ml/paddle/CMakeLists.txt | 23 +- .../paddle/misc/FixedRadiusSearchOpKernel.cu | 1 + .../misc/InvertNeighborsListOpKernel.cu | 1 + .../ml/paddle/misc/InvertNeighborsListOps.cpp | 2 + .../ml/paddle/misc/InvertNeighborsListOps.h | 8 +- cpp/open3d/ml/paddle/misc/NmsOps.cpp | 67 ++++++ .../misc/ReduceSubarraysSumOpKernel.cpp | 33 +++ .../paddle/misc/ReduceSubarraysSumOpKernel.cu | 36 +++ .../paddle/misc/ReduceSubarraysSumOpKernel.h | 20 ++ .../ml/paddle/misc/ReduceSubarraysSumOps.cpp | 71 ++++++ .../ml/paddle/misc/ReduceSubarraysSumOps.h | 13 ++ cpp/open3d/ml/paddle/misc/RoiPoolOps.cpp | 96 ++++++++ .../ml/paddle/misc/VoxelPoolingOpKernel.cpp | 118 ++++++++++ cpp/open3d/ml/paddle/misc/VoxelPoolingOps.cpp | 211 ++++++++++++++++++ .../ml/paddle/misc/VoxelizeOpKernel.cpp | 73 ++++++ cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cu | 91 ++++++++ cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.h | 98 ++++++++ cpp/open3d/ml/paddle/misc/VoxelizeOps.cpp | 96 ++++++++ python/open3d/ml/paddle/layers/__init__.py | 2 + .../ml/paddle/python/layers/voxel_pooling.py | 101 +++++++++ 20 files changed, 1156 insertions(+), 5 deletions(-) create mode 100644 cpp/open3d/ml/paddle/misc/NmsOps.cpp create mode 100644 cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.h create mode 100644 cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.cpp create mode 100644 cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.h create mode 100644 cpp/open3d/ml/paddle/misc/RoiPoolOps.cpp create mode 100644 cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/misc/VoxelPoolingOps.cpp create mode 100644 cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.h create mode 100644 cpp/open3d/ml/paddle/misc/VoxelizeOps.cpp create mode 100644 python/open3d/ml/paddle/python/layers/voxel_pooling.py diff --git a/cpp/open3d/ml/paddle/CMakeLists.txt b/cpp/open3d/ml/paddle/CMakeLists.txt index 73d1864210c..e0af855ea9c 100644 --- a/cpp/open3d/ml/paddle/CMakeLists.txt +++ b/cpp/open3d/ml/paddle/CMakeLists.txt @@ -27,6 +27,18 @@ target_sources(open3d_paddle_ops PRIVATE misc/KnnSearchOpKernel.cpp misc/RaggedToDenseOpKernel.cpp misc/RaggedToDenseOps.cpp + misc/NmsOps.cpp + misc/VoxelizeOpKernel.cpp + misc/VoxelizeOps.cpp + misc/ReduceSubarraysSumOpKernel.cpp + misc/ReduceSubarraysSumOps.cpp + misc/VoxelPoolingOps.cpp + misc/VoxelPoolingOpKernel.cpp + misc/RoiPoolOps.cpp +) + +target_sources(open3d_paddle_ops PRIVATE + ../contrib/Nms.cpp ) if (BUILD_CUDA_MODULE) @@ -35,6 +47,15 @@ if (BUILD_CUDA_MODULE) misc/FixedRadiusSearchOpKernel.cu misc/InvertNeighborsListOpKernel.cu misc/RaggedToDenseOpKernel.cu + misc/ReduceSubarraysSumOpKernel.cu + misc/VoxelizeOpKernel.cu + ) + + target_sources(open3d_paddle_ops PRIVATE + ../contrib/BallQuery.cu + ../contrib/InterpolatePoints.cu + ../contrib/Nms.cu + ../contrib/RoiPoolKernel.cu ) endif() @@ -60,7 +81,7 @@ target_include_directories(open3d_paddle_ops SYSTEM PRIVATE ) target_link_libraries(open3d_paddle_ops PRIVATE - paddle + paddle Open3D::Open3D Open3D::3rdparty_eigen3 Open3D::3rdparty_fmt diff --git a/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu index d5fc9a099d1..59c4d497363 100644 --- a/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu +++ b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu @@ -29,6 +29,7 @@ void FixedRadiusSearchCUDA(const paddle::Tensor& points, paddle::Tensor& neighbors_row_splits, paddle::Tensor& neighbors_distance) { auto stream = points.stream(); + // -1 means current global place auto cuda_place_props = phi::backends::gpu::GetDeviceProperties(-1); const int texture_alignment = cuda_place_props.textureAlignment; diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu index 5e87c438815..37df0de3128 100644 --- a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu @@ -26,6 +26,7 @@ std::vector InvertNeighborsListCUDA( // maybe this can use torch's impl way ? auto stream = inp_neighbors_index.stream(); + // -1 means current global place auto cuda_place_props = phi::backends::gpu::GetDeviceProperties(-1); const int texture_alignment = cuda_place_props.textureAlignment; diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp index 0c415474138..7832c98fedb 100644 --- a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp @@ -6,6 +6,8 @@ // ---------------------------------------------------------------------------- // +#include "open3d/ml/paddle/misc/InvertNeighborsListOps.h" + #include #include "open3d/ml/paddle/PaddleHelper.h" diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h index 24116862242..e8c39f8036c 100644 --- a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h @@ -12,7 +12,7 @@ #include "open3d/ml/paddle/PaddleHelper.h" std::vector InvertNeighborsList( - int64_t num_points, - const paddle::Tensor& inp_neighbors_index, - const paddle::Tensor& inp_neighbors_row_splits, - const paddle::Tensor& inp_neighbors_attributes); + paddle::Tensor& inp_neighbors_index, + paddle::Tensor& inp_neighbors_row_splits, + paddle::Tensor& inp_neighbors_attributes, + int64_t num_points); diff --git a/cpp/open3d/ml/paddle/misc/NmsOps.cpp b/cpp/open3d/ml/paddle/misc/NmsOps.cpp new file mode 100644 index 00000000000..9e5342e6a7d --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/NmsOps.cpp @@ -0,0 +1,67 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- + +#include + +#include "open3d/ml/contrib/Nms.h" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "paddle/extension.h" + +std::vector Nms(paddle::Tensor& boxes, + paddle::Tensor& scores, + double nms_overlap_thresh) { + CHECK_TYPE(boxes, phi::DataType::FLOAT32); + CHECK_TYPE(scores, phi::DataType::FLOAT32); + + std::vector keep_indices_blob; + if (boxes.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + keep_indices_blob = open3d::ml::contrib::NmsCUDAKernel( + boxes.data(), scores.data(), boxes.shape()[0], + nms_overlap_thresh); +#else + PD_CHECK(false, "Nms was not compiled with CUDA support"); + +#endif + } else { + keep_indices_blob = open3d::ml::contrib::NmsCPUKernel( + boxes.data(), scores.data(), boxes.shape()[0], + nms_overlap_thresh); + } + + paddle::IntArray out_shape( + {static_cast(keep_indices_blob.size())}); + paddle::IntArray out_strides({1}); + // NOTE: Not pass deleter because data will be free as vector destroy. + if (keep_indices_blob.data()) { + paddle::Tensor temp_keep_indices = paddle::from_blob( + keep_indices_blob.data(), out_shape, out_strides, + phi::DataType::INT64, phi::DataLayout::NCHW, phi::CPUPlace()); + if (boxes.is_gpu()) { + temp_keep_indices = temp_keep_indices.copy_to(boxes.place(), false); + } + + paddle::Tensor keep_indices = paddle::empty_like(temp_keep_indices); + + return {paddle::experimental::copysign(temp_keep_indices, + keep_indices)}; + } else { + // keep indices is nullptr + return {InitializedEmptyTensor({0}, boxes.place())}; + } +} + +std::vector NmsInferDtype() { + return {paddle::DataType::INT64}; +} + +PD_BUILD_OP(open3d_nms) + .Inputs({"boxes", "scores"}) + .Outputs({"keep_indices"}) + .Attrs({"nms_overlap_thresh: double"}) + .SetKernelFn(PD_KERNEL(Nms)) + .SetInferDtypeFn(PD_INFER_DTYPE(NmsInferDtype)); diff --git a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cpp b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cpp new file mode 100644 index 00000000000..7a25c8da636 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cpp @@ -0,0 +1,33 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.h" + +#include "open3d/ml/impl/misc/ReduceSubarraysSum.h" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "paddle/extension.h" + +template +paddle::Tensor ReduceSubarraysSumCPU(const paddle::Tensor& values, + const paddle::Tensor& row_splits) { + paddle::Tensor sums = paddle::empty({row_splits.shape()[0] - 1}, + paddle::DataType(ToPaddleDtype())); + + open3d::ml::impl::ReduceSubarraysSumCPU( + values.data(), values.shape()[0], row_splits.data(), + row_splits.shape()[0] - 1, sums.data()); + return sums; +} +#define INSTANTIATE(T) \ + template paddle::Tensor ReduceSubarraysSumCPU(const paddle::Tensor&, \ + const paddle::Tensor&); + +INSTANTIATE(int32_t) +INSTANTIATE(int64_t) +INSTANTIATE(float) +INSTANTIATE(double) diff --git a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cu b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cu new file mode 100644 index 00000000000..d50ed60deb2 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cu @@ -0,0 +1,36 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/ml/impl/misc/ReduceSubarraysSum.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.h" +#include "paddle/extension.h" + +template +paddle::Tensor ReduceSubarraysSumCUDA(const paddle::Tensor& values, + const paddle::Tensor& row_splits) { + auto place = values.place(); + paddle::Tensor sums = + paddle::empty({row_splits.shape()[0] - 1}, + paddle::DataType(ToPaddleDtype()), place); + + auto stream = values.stream(); + open3d::ml::impl::ReduceSubarraysSumCUDA( + stream, values.data(), values.shape()[0], + row_splits.data(), row_splits.shape()[0] - 1, + sums.data()); + return sums; +} +#define INSTANTIATE(T) \ + template paddle::Tensor ReduceSubarraysSumCUDA(const paddle::Tensor&, \ + const paddle::Tensor&); + +INSTANTIATE(int32_t) +INSTANTIATE(int64_t) +INSTANTIATE(float) +INSTANTIATE(double) diff --git a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.h b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.h new file mode 100644 index 00000000000..bfdebbcb7cf --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.h @@ -0,0 +1,20 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include "paddle/extension.h" + +template +paddle::Tensor ReduceSubarraysSumCPU(const paddle::Tensor& values, + const paddle::Tensor& row_splits); + +#ifdef BUILD_CUDA_MODULE +template +paddle::Tensor ReduceSubarraysSumCUDA(const paddle::Tensor& values, + const paddle::Tensor& row_splits); +#endif diff --git a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.cpp b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.cpp new file mode 100644 index 00000000000..1e0fb060978 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.cpp @@ -0,0 +1,71 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/ml/paddle/misc/ReduceSubarraysSumOps.h" + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.h" +#include "paddle/extension.h" + +std::vector ReduceSubarraysSum(paddle::Tensor& values, + paddle::Tensor& row_splits) { + CHECK_TYPE(row_splits, phi::DataType::INT64); + + const auto& attr_type = values.dtype(); + + // special treatment for empty values vector + if (values.shape()[0] == 0) { + return {InitializedEmptyTensor(values.dtype(), values.shape(), + values.place())}; + } + +#define CALL(attr_t, fn) \ + if (ComparePaddleDtype(attr_type)) { \ + return {fn(values, row_splits)}; \ + } + + CHECK_SAME_DEVICE_TYPE(values, row_splits); + + if (values.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + // pass to cuda function + CALL(int32_t, ReduceSubarraysSumCUDA) + CALL(int64_t, ReduceSubarraysSumCUDA) + CALL(float, ReduceSubarraysSumCUDA) + CALL(double, ReduceSubarraysSumCUDA) +#else + PD_CHECK(false, + "ReduceSubarraysSum was not compiled with CUDA support"); +#endif + } else { + CALL(int32_t, ReduceSubarraysSumCPU) + CALL(int64_t, ReduceSubarraysSumCPU) + CALL(float, ReduceSubarraysSumCPU) + CALL(double, ReduceSubarraysSumCPU) + } + return {paddle::Tensor()}; +} + +std::vector ReduceSubarraysSumInferDtype( + const paddle::DataType values_dtype) { + return {values_dtype}; +} + +std::vector> ReduceSubarraysSumInferShape( + std::vector values_shape) { + return {values_shape}; +} + +PD_BUILD_OP(open3d_reduce_subarrays_sum) + .Inputs({"values", "row_splits"}) + .Outputs({"sums"}) + .SetKernelFn(PD_KERNEL(ReduceSubarraysSum)) + .SetInferShapeFn(PD_INFER_SHAPE(ReduceSubarraysSumInferShape)) + .SetInferDtypeFn(PD_INFER_DTYPE(ReduceSubarraysSumInferDtype)); diff --git a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.h b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.h new file mode 100644 index 00000000000..6eddb171465 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.h @@ -0,0 +1,13 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include "paddle/extension.h" + +std::vector ReduceSubarraysSum(paddle::Tensor& values, + paddle::Tensor& row_splits); diff --git a/cpp/open3d/ml/paddle/misc/RoiPoolOps.cpp b/cpp/open3d/ml/paddle/misc/RoiPoolOps.cpp new file mode 100644 index 00000000000..a00db88b5ea --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/RoiPoolOps.cpp @@ -0,0 +1,96 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +//***************************************************************************************/ +// +// Based on PointRCNN Library (MIT License): +// https://github.com/sshaoshuai/PointRCNN +// +// Copyright (c) 2019 Shaoshuai Shi +// +// 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. +// +//***************************************************************************************/ + +#include "open3d/ml/contrib/RoiPoolKernel.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +#ifdef BUILD_CUDA_MODULE + +std::vector RoiPool(paddle::Tensor &xyz, + paddle::Tensor &boxes3d, + paddle::Tensor &pts_feature, + const int64_t sampled_pts_num) { + int batch_size = xyz.shape()[0]; + int pts_num = xyz.shape()[1]; + int boxes_num = boxes3d.shape()[1]; + int feature_in_len = pts_feature.shape()[2]; + + auto place = xyz.place(); + paddle::Tensor features = paddle::full( + {batch_size, boxes_num, sampled_pts_num, 3 + feature_in_len}, 0.0f, + paddle::DataType(ToPaddleDtype()), place); + + paddle::Tensor empty_flag = + paddle::full({batch_size, boxes_num}, 0.0f, + paddle::DataType(ToPaddleDtype()), place); + + const float *xyz_data = xyz.data(); + const float *boxes3d_data = boxes3d.data(); + const float *pts_feature_data = pts_feature.data(); + float *pooled_features_data = features.data(); + int *pooled_empty_flag_data = empty_flag.data(); + + open3d::ml::contrib::roipool3dLauncher( + batch_size, pts_num, boxes_num, feature_in_len, sampled_pts_num, + xyz_data, boxes3d_data, pts_feature_data, pooled_features_data, + pooled_empty_flag_data); + + return {features, empty_flag}; +} + +std::vector RoiPoolInferDtype() { + return {paddle::DataType::FLOAT32, paddle::DataType::INT32}; +} + +std::vector> RoiPoolInferShape( + std::vector xyz_shape, + std::vector boxes3d_shape, + std::vector pts_feature_shape, + const int64_t sampled_pts_num) { + std::vector features_shape{xyz_shape[0], boxes3d_shape[1], + sampled_pts_num, + 3 + pts_feature_shape[2]}; + return {features_shape, {xyz_shape[0], boxes3d_shape[1]}}; +} + +PD_BUILD_OP(open3d_roi_pool) + .Inputs({"xyz", "boxes3d", "pts_feature"}) + .Outputs({"features", "empty_flag"}) + .Attrs({ + "sampled_pts_num: int64_t", + }) + .SetKernelFn(PD_KERNEL(RoiPool)) + .SetInferShapeFn(PD_INFER_SHAPE(RoiPoolInferShape)) + .SetInferDtypeFn(PD_INFER_DTYPE(RoiPoolInferDtype)); + +#endif diff --git a/cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp b/cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp new file mode 100644 index 00000000000..ddf4207d66b --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp @@ -0,0 +1,118 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/ml/impl/misc/VoxelPooling.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +namespace { + +template +class OutputAllocator { +public: + OutputAllocator(paddle::Place place) : place(place) {} + + void AllocPooledPositions(TReal** ptr, size_t num) { + if (num != 0) { + positions = paddle::empty({int64_t(num), 3}, ToPaddleDtype(), + place); + } else { + positions = InitializedEmptyTensor(ToPaddleDtype(), {0, 3}, + place); + } + *ptr = positions.data(); + } + + void AllocPooledFeatures(TFeat** ptr, size_t num, size_t channels) { + if (num != 0) { + features = paddle::empty({int64_t(num), int64_t(channels)}, + ToPaddleDtype(), place); + } else { + features = InitializedEmptyTensor(ToPaddleDtype(), + {0, int64_t(channels)}, place); + } + *ptr = features.data(); + } + + const paddle::Tensor& PooledPositions() const { return positions; } + const paddle::Tensor& PooledFeatures() const { return features; } + +private: + paddle::Tensor positions; + paddle::Tensor features; + paddle::Place place; +}; + +} // namespace + +template +std::vector VoxelPoolingCPU(const paddle::Tensor& positions, + const paddle::Tensor& features, + const double voxel_size, + const AccumulationFn position_fn, + const AccumulationFn feature_fn, + const bool debug) { + OutputAllocator output_allocator(positions.place()); + + if (debug) { + std::string err; + PD_CHECK(CheckVoxelSize(err, positions.shape()[0], + positions.data(), TReal(voxel_size)), + err); + } + + VoxelPooling(positions.shape()[0], positions.data(), + features.shape()[1], features.data(), + voxel_size, output_allocator, position_fn, + feature_fn); + + return {output_allocator.PooledPositions(), + output_allocator.PooledFeatures()}; +} +#define INSTANTIATE(TReal, TFeat) \ + template std::vector VoxelPoolingCPU( \ + const paddle::Tensor&, const paddle::Tensor&, const double, \ + const AccumulationFn, const AccumulationFn, const bool); + +INSTANTIATE(float, int32_t) +INSTANTIATE(float, int64_t) +INSTANTIATE(float, float) +INSTANTIATE(float, double) +INSTANTIATE(double, int32_t) +INSTANTIATE(double, int64_t) +INSTANTIATE(double, float) +INSTANTIATE(double, double) +#undef INSTANTIATE + +template +void VoxelPoolingGradCPU(paddle::Tensor& features_backprop, + const paddle::Tensor& positions, + const paddle::Tensor& features, + const paddle::Tensor& pooled_positions, + const paddle::Tensor& pooled_features_gradient, + const double voxel_size, + const AccumulationFn position_fn, + const AccumulationFn feature_fn) { + VoxelPoolingBackprop( + features_backprop.data(), positions.shape()[0], + positions.data(), features.shape()[1], + features.data(), pooled_positions.shape()[0], + pooled_positions.data(), + pooled_features_gradient.data(), TReal(voxel_size), + position_fn, feature_fn); +} +#define INSTANTIATE(TReal, TFeat) \ + template void VoxelPoolingGradCPU( \ + paddle::Tensor&, const paddle::Tensor&, const paddle::Tensor&, \ + const paddle::Tensor&, const paddle::Tensor&, const double, \ + const AccumulationFn, const AccumulationFn); +INSTANTIATE(float, float) +INSTANTIATE(float, double) +INSTANTIATE(double, float) +INSTANTIATE(double, double) diff --git a/cpp/open3d/ml/paddle/misc/VoxelPoolingOps.cpp b/cpp/open3d/ml/paddle/misc/VoxelPoolingOps.cpp new file mode 100644 index 00000000000..bc5ec64017a --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/VoxelPoolingOps.cpp @@ -0,0 +1,211 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/impl/misc/VoxelPooling.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +std::vector VoxelPoolingCPU(const paddle::Tensor& positions, + const paddle::Tensor& features, + const double voxel_size, + const AccumulationFn position_fn, + const AccumulationFn feature_fn, + const bool debug); + +template +void VoxelPoolingGradCPU(paddle::Tensor& features_backprop, + const paddle::Tensor& positions, + const paddle::Tensor& features, + const paddle::Tensor& pooled_positions, + const paddle::Tensor& pooled_features_gradient, + const double voxel_size, + const AccumulationFn position_fn, + const AccumulationFn feature_fn); + +std::vector VoxelPoolingForward( + paddle::Tensor& positions, + paddle::Tensor& features, + const double voxel_size, + const std::string& position_fn_str, + const std::string& feature_fn_str, + const bool debug) { + AccumulationFn position_fn = AVERAGE; + if (position_fn_str == "average") { + position_fn = AVERAGE; + } else if (position_fn_str == "nearest_neighbor") { + position_fn = NEAREST_NEIGHBOR; + } else if (position_fn_str == "center") { + position_fn = CENTER; + } else { + PD_CHECK(false, + "position_fn must be one of ('average', " + "'nearest_neighbor', 'center') but got " + + position_fn_str); + } + AccumulationFn feature_fn = AVERAGE; + if (feature_fn_str == "average") { + feature_fn = AVERAGE; + } else if (feature_fn_str == "nearest_neighbor") { + feature_fn = NEAREST_NEIGHBOR; + } else if (feature_fn_str == "max") { + feature_fn = MAX; + } else { + PD_CHECK(false, + "feature_fn must be one of ('average', " + "'nearest_neighbor', 'max') but got " + + feature_fn_str); + } + + // check input shapes + { + using namespace open3d::ml::op_util; + Dim num_points("num_points"); + Dim num_channels("num_channels"); + + CHECK_SHAPE(positions, num_points, 3); + CHECK_SHAPE_COMBINE_LAST_DIMS(features, num_points, num_channels); + } + + // ctx->saved_data["position_fn_str"] = position_fn_str; + // ctx->saved_data["feature_fn_str"] = feature_fn_str; + // ctx->saved_data["voxel_size"] = voxel_size; + + const auto& positions_type = positions.dtype(); + const auto& features_type = features.dtype(); + +#define FN_PARAMETERS \ + positions, features, voxel_size, position_fn, feature_fn, debug + +#define CALL(real_t, feat_t, fn) \ + if (ComparePaddleDtype(positions_type) && \ + ComparePaddleDtype(features_type)) { \ + return fn(FN_PARAMETERS); \ + } + + CHECK_SAME_DEVICE_TYPE(positions, features); + if (positions.is_gpu()) { + PD_CHECK(false, "VoxelPooling does not support CUDA"); + } else { + CALL(float, float, VoxelPoolingCPU) + CALL(float, int32_t, VoxelPoolingCPU) + CALL(float, int64_t, VoxelPoolingCPU) + CALL(float, double, VoxelPoolingCPU) + CALL(double, float, VoxelPoolingCPU) + CALL(double, int32_t, VoxelPoolingCPU) + CALL(double, int64_t, VoxelPoolingCPU) + CALL(double, double, VoxelPoolingCPU) + } +#undef FN_PARAMETERS +#undef CALL + + PD_CHECK(false, "VoxelPooling does not support " + + phi::DataTypeToString(positions.dtype()) + + " as input for positions and " + + phi::DataTypeToString(features.dtype()) + + " as input for features"); + return {paddle::Tensor(), paddle::Tensor()}; +} + +std::vector VoxelPoolingBackward( + paddle::Tensor& positions, + paddle::Tensor& features, + paddle::Tensor& pooled_positions, + paddle::Tensor& pooled_features_gradient, + const double voxel_size, + const std::string& position_fn_str, + const std::string& feature_fn_str) { + AccumulationFn position_fn = AVERAGE; + if (position_fn_str == "average") { + position_fn = AVERAGE; + } else if (position_fn_str == "nearest_neighbor") { + position_fn = NEAREST_NEIGHBOR; + } else if (position_fn_str == "center") { + position_fn = CENTER; + } else { + PD_CHECK(false, + "position_fn must be one of ('average', " + "'nearest_neighbor', 'center') but got " + + position_fn_str); + } + AccumulationFn feature_fn = AVERAGE; + if (feature_fn_str == "average") { + feature_fn = AVERAGE; + } else if (feature_fn_str == "nearest_neighbor") { + feature_fn = NEAREST_NEIGHBOR; + } else if (feature_fn_str == "max") { + feature_fn = MAX; + } else { + PD_CHECK(false, + "feature_fn must be one of ('average', " + "'nearest_neighbor', 'max') but got " + + feature_fn_str); + } + + // auto pooled_positions = saved_vars[2]; + + paddle::Tensor features_backprop = + paddle::empty(features.shape(), features.dtype()); + + const auto& positions_type = positions.dtype(); + const auto& features_type = features.dtype(); + +#define FN_PARAMETERS \ + features_backprop, positions, features, pooled_positions, \ + pooled_features_gradient, voxel_size, position_fn, feature_fn + +#define CALL(real_t, feat_t, fn) \ + if (ComparePaddleDtype(positions_type) && \ + ComparePaddleDtype(features_type)) { \ + fn(FN_PARAMETERS); \ + return {features_backprop}; \ + } + + CHECK_SAME_DEVICE_TYPE(positions, features); + if (positions.is_gpu()) { + PD_CHECK(false, "VoxelPooling backward does not support CUDA"); + } else { + CALL(float, float, VoxelPoolingGradCPU) + CALL(float, double, VoxelPoolingGradCPU) + CALL(double, float, VoxelPoolingGradCPU) + CALL(double, double, VoxelPoolingGradCPU) + PD_CHECK(false, "VoxelPooling backward does not support " + + phi::DataTypeToString(positions.dtype()) + + " as input for positions and " + + phi::DataTypeToString(features.dtype()) + + " as input for features"); + } +#undef FN_PARAMETERS +#undef CALL + + return {}; +} + +std::vector VoxelPoolingInferDtype( + paddle::DataType positions_dtype, paddle::DataType features_dtype) { + return {positions_dtype, features_dtype}; +} + +PD_BUILD_OP(open3d_voxel_pooling) + .Inputs({"positions", "features"}) + .Outputs({"pooled_positions", "pooled_features"}) + .Attrs({"voxel_size:double", "position_fn:std::string", + "feature_fn:std::string", "debug:bool"}) + .SetKernelFn(PD_KERNEL(VoxelPoolingForward)) + .SetInferDtypeFn(PD_INFER_DTYPE(VoxelPoolingInferDtype)); + +PD_BUILD_GRAD_OP(open3d_voxel_pooling) + .Inputs({"positions", "features", "pooled_positions", + paddle::Grad("pooled_features")}) + .Outputs({paddle::Grad("features")}) + .Attrs({"voxel_size:double", "position_fn:std::string", + "feature_fn:std::string"}) + .SetKernelFn(PD_KERNEL(VoxelPoolingBackward)); diff --git a/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cpp b/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cpp new file mode 100644 index 00000000000..bbd3d6671c1 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cpp @@ -0,0 +1,73 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/ml/paddle/misc/VoxelizeOpKernel.h" + +#include "open3d/ml/impl/misc/Voxelize.h" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "paddle/extension.h" + +using namespace open3d::ml::impl; + +template +void VoxelizeCPU(const paddle::Tensor& points, + const paddle::Tensor& row_splits, + const paddle::Tensor& voxel_size, + const paddle::Tensor& points_range_min, + const paddle::Tensor& points_range_max, + const int64_t max_points_per_voxel, + const int64_t max_voxels, + paddle::Tensor& voxel_coords, + paddle::Tensor& voxel_point_indices, + paddle::Tensor& voxel_point_row_splits, + paddle::Tensor& voxel_batch_splits) { + VoxelizeOutputAllocator output_allocator(points.place()); + + switch (points.shape()[1]) { +#define CASE(NDIM) \ + case NDIM: \ + VoxelizeCPU(points.shape()[0], points.data(), \ + row_splits.shape()[0] - 1, \ + row_splits.data(), voxel_size.data(), \ + points_range_min.data(), \ + points_range_max.data(), max_points_per_voxel, \ + max_voxels, output_allocator); \ + break; + CASE(1) + CASE(2) + CASE(3) + CASE(4) + CASE(5) + CASE(6) + CASE(7) + CASE(8) + default: + break; // will be handled by the generic paddle function + +#undef CASE + } + + voxel_coords = output_allocator.VoxelCoords(); + voxel_point_indices = output_allocator.VoxelPointIndices(); + voxel_point_row_splits = output_allocator.VoxelPointRowSplits(); + voxel_batch_splits = output_allocator.VoxelBatchSplits(); +} + +#define INSTANTIATE(T) \ + template void VoxelizeCPU( \ + const paddle::Tensor& points, const paddle::Tensor& row_splits, \ + const paddle::Tensor& voxel_size, \ + const paddle::Tensor& points_range_min, \ + const paddle::Tensor& points_range_max, \ + const int64_t max_points_per_voxel, const int64_t max_voxels, \ + paddle::Tensor& voxel_coords, paddle::Tensor& voxel_point_indices, \ + paddle::Tensor& voxel_point_row_splits, \ + paddle::Tensor& voxel_batch_splits); + +INSTANTIATE(float) +INSTANTIATE(double) diff --git a/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cu b/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cu new file mode 100644 index 00000000000..60936a257de --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cu @@ -0,0 +1,91 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include "open3d/ml/impl/misc/Voxelize.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/VoxelizeOpKernel.h" +#include "paddle/extension.h" + +using namespace open3d::ml::impl; + +template +void VoxelizeCUDA(const paddle::Tensor& points, + const paddle::Tensor& row_splits, + const paddle::Tensor& voxel_size, + const paddle::Tensor& points_range_min, + const paddle::Tensor& points_range_max, + const int64_t max_points_per_voxel, + const int64_t max_voxels, + paddle::Tensor& voxel_coords, + paddle::Tensor& voxel_point_indices, + paddle::Tensor& voxel_point_row_splits, + paddle::Tensor& voxel_batch_splits) { + auto stream = points.stream(); + // -1 means current global place + auto cuda_device_props = phi::backends::gpu::GetDeviceProperties(-1); + const int texture_alignment = cuda_device_props.textureAlignment; + + VoxelizeOutputAllocator output_allocator(points.place()); + + switch (points.shape()[1]) { +#define CASE(NDIM) \ + case NDIM: { \ + void* temp_ptr = nullptr; \ + size_t temp_size = 0; \ + VoxelizeCUDA( \ + stream, temp_ptr, temp_size, texture_alignment, \ + points.shape()[0], points.data(), \ + row_splits.shape()[0] - 1, row_splits.data(), \ + voxel_size.data(), points_range_min.data(), \ + points_range_max.data(), max_points_per_voxel, max_voxels, \ + output_allocator); \ + \ + auto temp_tensor = \ + CreateTempTensor(temp_size, points.place(), &temp_ptr); \ + \ + VoxelizeCUDA( \ + stream, temp_ptr, temp_size, texture_alignment, \ + points.shape()[0], points.data(), \ + row_splits.shape()[0] - 1, row_splits.data(), \ + voxel_size.data(), points_range_min.data(), \ + points_range_max.data(), max_points_per_voxel, max_voxels, \ + output_allocator); \ + } break; + CASE(1) + CASE(2) + CASE(3) + CASE(4) + CASE(5) + CASE(6) + CASE(7) + CASE(8) + default: + break; // will be handled by the generic paddle function + +#undef CASE + } + + voxel_coords = output_allocator.VoxelCoords(); + voxel_point_indices = output_allocator.VoxelPointIndices(); + voxel_point_row_splits = output_allocator.VoxelPointRowSplits(); + voxel_batch_splits = output_allocator.VoxelBatchSplits(); +} + +#define INSTANTIATE(T) \ + template void VoxelizeCUDA( \ + const paddle::Tensor& points, const paddle::Tensor& row_splits, \ + const paddle::Tensor& voxel_size, \ + const paddle::Tensor& points_range_min, \ + const paddle::Tensor& points_range_max, \ + const int64_t max_points_per_voxel, const int64_t max_voxels, \ + paddle::Tensor& voxel_coords, paddle::Tensor& voxel_point_indices, \ + paddle::Tensor& voxel_point_row_splits, \ + paddle::Tensor& voxel_batch_splits); + +INSTANTIATE(float) +INSTANTIATE(double) diff --git a/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.h b/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.h new file mode 100644 index 00000000000..9481a8c8859 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.h @@ -0,0 +1,98 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include +#include + +#include "open3d/ml/paddle/PaddleHelper.h" +#include "paddle/extension.h" + +template +void VoxelizeCPU(const paddle::Tensor& points, + const paddle::Tensor& row_splits, + const paddle::Tensor& voxel_size, + const paddle::Tensor& points_range_min, + const paddle::Tensor& points_range_max, + const int64_t max_points_per_voxel, + const int64_t max_voxels, + paddle::Tensor& voxel_coords, + paddle::Tensor& voxel_point_indices, + paddle::Tensor& voxel_point_row_splits, + paddle::Tensor& voxel_batch_splits); + +#ifdef BUILD_CUDA_MODULE +template +void VoxelizeCUDA(const paddle::Tensor& points, + const paddle::Tensor& row_splits, + const paddle::Tensor& voxel_size, + const paddle::Tensor& points_range_min, + const paddle::Tensor& points_range_max, + const int64_t max_points_per_voxel, + const int64_t max_voxels, + paddle::Tensor& voxel_coords, + paddle::Tensor& voxel_point_indices, + paddle::Tensor& voxel_point_row_splits, + paddle::Tensor& voxel_batch_splits); +#endif + +class VoxelizeOutputAllocator { +public: + VoxelizeOutputAllocator(paddle::Place place) : place(place) {} + + void AllocVoxelCoords(int32_t** ptr, int64_t rows, int64_t cols) { + if (rows * cols == 0) { + voxel_coords = InitializedEmptyTensor({rows, cols}, place); + } else { + voxel_coords = paddle::empty( + {rows, cols}, paddle::DataType(ToPaddleDtype()), + place); + } + *ptr = voxel_coords.data(); + } + + void AllocVoxelPointIndices(int64_t** ptr, int64_t num) { + if (num == 0) { + voxel_point_indices = InitializedEmptyTensor({num}, place); + } else { + voxel_point_indices = paddle::empty( + {num}, paddle::DataType(ToPaddleDtype()), place); + } + *ptr = voxel_point_indices.data(); + } + + void AllocVoxelPointRowSplits(int64_t** ptr, int64_t num) { + voxel_point_row_splits = paddle::empty( + {num}, paddle::DataType(ToPaddleDtype()), place); + *ptr = voxel_point_row_splits.data(); + } + + void AllocVoxelBatchSplits(int64_t** ptr, int64_t num) { + voxel_batch_splits = paddle::empty( + {num}, paddle::DataType(ToPaddleDtype()), place); + *ptr = voxel_batch_splits.data(); + } + + const paddle::Tensor& VoxelCoords() const { return voxel_coords; } + const paddle::Tensor& VoxelPointIndices() const { + return voxel_point_indices; + } + const paddle::Tensor& VoxelPointRowSplits() const { + return voxel_point_row_splits; + } + const paddle::Tensor& VoxelBatchSplits() const { + return voxel_batch_splits; + } + +private: + paddle::Tensor voxel_coords; + paddle::Tensor voxel_point_indices; + paddle::Tensor voxel_point_row_splits; + paddle::Tensor voxel_batch_splits; + paddle::Place place; +}; diff --git a/cpp/open3d/ml/paddle/misc/VoxelizeOps.cpp b/cpp/open3d/ml/paddle/misc/VoxelizeOps.cpp new file mode 100644 index 00000000000..cb93e366038 --- /dev/null +++ b/cpp/open3d/ml/paddle/misc/VoxelizeOps.cpp @@ -0,0 +1,96 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/VoxelizeOpKernel.h" +#include "paddle/extension.h" + +std::vector Voxelize(paddle::Tensor& points, + paddle::Tensor& row_splits, + paddle::Tensor& voxel_size, + paddle::Tensor& points_range_min, + paddle::Tensor& points_range_max, + const int64_t max_points_per_voxel, + const int64_t max_voxels) { + CHECK_TYPE(row_splits, phi::DataType::INT64); + + auto cpu_place = paddle::CPUPlace(); + // make sure that these tensors are on the cpu + voxel_size = voxel_size.copy_to(cpu_place, false); + points_range_min = points_range_min.copy_to(cpu_place, false); + points_range_max = points_range_max.copy_to(cpu_place, false); + + CHECK_SAME_DTYPE(points, voxel_size, points_range_min, points_range_max); + + // check input shapes + { + using namespace open3d::ml::op_util; + Dim num_points("num_points"); + Dim ndim("ndim"); + CHECK_SHAPE(points, num_points, ndim); + CHECK_SHAPE(voxel_size, ndim); + CHECK_SHAPE(points_range_min, ndim); + CHECK_SHAPE(points_range_max, ndim); + PD_CHECK(0 < ndim.value() && ndim.value() < 9, + "the number of dimensions must be in [1,..,8]"); + } + + const auto& points_dtype = points.dtype(); + + // output tensors + paddle::Tensor voxel_coords, voxel_point_indices, voxel_point_row_splits, + voxel_batch_splits; + +#define CALL(point_t, fn) \ + if (ComparePaddleDtype(points_dtype)) { \ + fn(points, row_splits, voxel_size, points_range_min, \ + points_range_max, max_points_per_voxel, max_voxels, \ + voxel_coords, voxel_point_indices, voxel_point_row_splits, \ + voxel_batch_splits); \ + return {voxel_coords, voxel_point_indices, voxel_point_row_splits, \ + voxel_batch_splits}; \ + } + + if (points.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + // pass to cuda function + CALL(float, VoxelizeCUDA) + CALL(double, VoxelizeCUDA) +#else + PD_CHECK(false, "Voxelize was not compiled with CUDA support"); +#endif + } else { + CALL(float, VoxelizeCPU) + CALL(double, VoxelizeCPU) + } + + PD_CHECK(false, "Voxelize does not support " + + phi::DataTypeToString(points.dtype()) + + " as input for values"); + + return std::vector(); +} + +std::vector VoxelizeInferDtype() { + return {paddle::DataType::INT32, paddle::DataType::INT64, + paddle::DataType::INT64, paddle::DataType::INT64}; +} + +PD_BUILD_OP(open3d_voxelize) + .Inputs({"points", "row_splits", "voxel_size", "points_range_min", + "points_range_max"}) + .Outputs({"voxel_coords", "voxel_point_indices", + "voxel_point_row_splits", "voxel_batch_splits"}) + .Attrs({ + "max_points_per_voxel: int64_t", + "max_voxels: int64_t", + }) + .SetKernelFn(PD_KERNEL(Voxelize)) + .SetInferDtypeFn(PD_INFER_DTYPE(VoxelizeInferDtype)); \ No newline at end of file diff --git a/python/open3d/ml/paddle/layers/__init__.py b/python/open3d/ml/paddle/layers/__init__.py index 8390a9bec51..eeebb261b5a 100644 --- a/python/open3d/ml/paddle/layers/__init__.py +++ b/python/open3d/ml/paddle/layers/__init__.py @@ -10,3 +10,5 @@ All layers subclass paddle.nn.Layer """ from ..python.layers.neighbor_search import * +from ..python.layers.convolutions import * +from ..python.layers.voxel_pooling import * diff --git a/python/open3d/ml/paddle/python/layers/voxel_pooling.py b/python/open3d/ml/paddle/python/layers/voxel_pooling.py new file mode 100644 index 00000000000..8d6def494fc --- /dev/null +++ b/python/open3d/ml/paddle/python/layers/voxel_pooling.py @@ -0,0 +1,101 @@ +# ---------------------------------------------------------------------------- +# - Open3D: www.open3d.org - +# ---------------------------------------------------------------------------- +# Copyright (c) 2018-2023 www.open3d.org +# SPDX-License-Identifier: MIT +# ---------------------------------------------------------------------------- + +from ...python import ops +import paddle + +__all__ = ['VoxelPooling'] + + +class VoxelPooling(paddle.nn.Layer): + """Voxel pooling for 3D point clouds. + + Spatial pooling for point clouds by combining points that fall into the same voxel bin. + + The voxel grid used for pooling is always aligned to the origin (0,0,0) to + simplify building voxel grid hierarchies. The order of the returned voxels is + not defined as can be seen in the following example:: + + import paddle + import open3d.ml.paddle as ml3d + + positions = paddle.to_tensor([ + [0.1, 0.1, 0.1], + [0.5, 0.5, 0.5], + [1.7, 1.7, 1.7], + [1.8, 1.8, 1.8], + [0.3, 2.4, 1.4]]) + + features = paddle.to_tensor([ + [1.0, 2.0], + [1.1, 2.3], + [4.2, 0.1], + [1.3, 3.4], + [2.3, 1.9]]) + + voxel_pooling = ml3d.layers.VoxelPooling(position_fn='center', feature_fn='max') + + ans = voxel_pooling(positions, features, 1.0) + + # returns the voxel centers in + # ans.pooled_positions = [[0.5, 2.5, 1.5], + # [1.5, 1.5, 1.5], + # [0.5, 0.5, 0.5]] + # + # and the max pooled features for each voxel in + # ans.pooled_features = [[2.3, 1.9], + # [4.2, 3.4], + # [1.1, 2.3]] + + Arguments: + position_fn: Defines how the new point positions will be computed. + The options are + * "average" computes the center of gravity for the points within one voxel. + * "nearest_neighbor" selects the point closest to the voxel center. + * "center" uses the voxel center for the position of the generated point. + + feature_fn: Defines how the pooled features will be computed. + The options are + * "average" computes the average feature vector. + * "nearest_neighbor" selects the feature vector of the point closest to the voxel center. + * "max" uses the maximum feature among all points within the voxel. + """ + + def __init__(self, position_fn='center', feature_fn='max', **kwargs): + super().__init__() + self.position_fn = position_fn + self.feature_fn = feature_fn + + def forward(self, positions, features, voxel_size): + """This function computes the pooled positions and features. + + Arguments: + positions: The point positions with shape [N,3] with N as the number of points. + *This argument must be given as a positional argument!* + + features: The feature vector with shape [N,channels]. + + voxel_size: The voxel size. + + Returns: + 2 Tensors in the following order: + + pooled_positions + The output point positions with shape [M,3] and M <= N. + + pooled_features: + The output point features with shape [M,channels] and M <= N. + """ + if isinstance(voxel_size, (float, int)): + voxel_size = paddle.to_tensor(voxel_size, dtype=positions.dtype) + result = ops.voxel_pooling(positions, + features, + voxel_size, + position_fn=self.position_fn, + feature_fn=self.feature_fn, + debug=False) + return result From 75cbc86a3aec77f1b732d8df84fd6b277d153ca7 Mon Sep 17 00:00:00 2001 From: RDIO <35186529+Woodman3@users.noreply.github.com> Date: Sat, 9 Nov 2024 19:51:46 +0800 Subject: [PATCH 07/19] [Feat] Add pointnet operators (#5) * add pointnet op * [Fix] Delete scripts directory --------- Signed-off-by: Woodman3 <1025760745@qq.com> Signed-off-by: RDIO <35186529+Woodman3@users.noreply.github.com> --- cpp/open3d/ml/paddle/CMakeLists.txt | 12 ++ .../ml/paddle/pointnet/BallQueryKernel.cu | 74 +++++++ .../ml/paddle/pointnet/BallQueryKernel.h | 44 +++++ .../ml/paddle/pointnet/BallQueryOps.cpp | 87 +++++++++ .../ml/paddle/pointnet/InterpolateKernel.cu | 139 ++++++++++++++ .../ml/paddle/pointnet/InterpolateKernel.h | 63 ++++++ .../ml/paddle/pointnet/InterpolateOps.cpp | 181 ++++++++++++++++++ .../ml/paddle/pointnet/SamplingKernel.cu | 118 ++++++++++++ .../ml/paddle/pointnet/SamplingKernel.h | 42 ++++ cpp/open3d/ml/paddle/pointnet/SamplingOps.cpp | 85 ++++++++ 10 files changed, 845 insertions(+) create mode 100644 cpp/open3d/ml/paddle/pointnet/BallQueryKernel.cu create mode 100644 cpp/open3d/ml/paddle/pointnet/BallQueryKernel.h create mode 100644 cpp/open3d/ml/paddle/pointnet/BallQueryOps.cpp create mode 100644 cpp/open3d/ml/paddle/pointnet/InterpolateKernel.cu create mode 100644 cpp/open3d/ml/paddle/pointnet/InterpolateKernel.h create mode 100644 cpp/open3d/ml/paddle/pointnet/InterpolateOps.cpp create mode 100644 cpp/open3d/ml/paddle/pointnet/SamplingKernel.cu create mode 100644 cpp/open3d/ml/paddle/pointnet/SamplingKernel.h create mode 100644 cpp/open3d/ml/paddle/pointnet/SamplingOps.cpp diff --git a/cpp/open3d/ml/paddle/CMakeLists.txt b/cpp/open3d/ml/paddle/CMakeLists.txt index e0af855ea9c..87677f067d9 100644 --- a/cpp/open3d/ml/paddle/CMakeLists.txt +++ b/cpp/open3d/ml/paddle/CMakeLists.txt @@ -37,6 +37,12 @@ target_sources(open3d_paddle_ops PRIVATE misc/RoiPoolOps.cpp ) +target_sources(open3d_paddle_ops PRIVATE + pointnet/BallQueryOps.cpp + pointnet/InterpolateOps.cpp + pointnet/SamplingOps.cpp +) + target_sources(open3d_paddle_ops PRIVATE ../contrib/Nms.cpp ) @@ -51,6 +57,12 @@ if (BUILD_CUDA_MODULE) misc/VoxelizeOpKernel.cu ) + target_sources(open3d_paddle_ops PRIVATE + pointnet/BallQueryKernel.cu + pointnet/InterpolateKernel.cu + pointnet/SamplingKernel.cu + ) + target_sources(open3d_paddle_ops PRIVATE ../contrib/BallQuery.cu ../contrib/InterpolatePoints.cu diff --git a/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.cu b/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.cu new file mode 100644 index 00000000000..9ce46b20f67 --- /dev/null +++ b/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.cu @@ -0,0 +1,74 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +//***************************************************************************************/ +// +// Based on Pointnet2 Library (MIT License): +// https://github.com/sshaoshuai/Pointnet2.PyPaddle +// +// Copyright (c) 2019 Shaoshuai Shi +// +// 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. +// +//***************************************************************************************/ + +#include +#include +#include + +#include "open3d/ml/contrib/BallQuery.cuh" +#include "open3d/ml/contrib/cuda_utils.h" +#include "open3d/ml/paddle/pointnet/BallQueryKernel.h" + +using namespace open3d::ml::contrib; + +void ball_query_launcher(int b, + int n, + int m, + float radius, + int nsample, + const float *new_xyz, + const float *xyz, + int *idx, + uint64_t stream_id) { + // new_xyz: (B, M, 3) + // xyz: (B, N, 3) + // output: + // idx: (B, M, nsample) + + cudaStream_t stream = reinterpret_cast(stream_id); + + cudaError_t err; + + dim3 blocks(DIVUP(m, THREADS_PER_BLOCK), + b); // blockIdx.x(col), blockIdx.y(row) + dim3 threads(THREADS_PER_BLOCK); + + ball_query_kernel<<>>(b, n, m, radius, nsample, + new_xyz, xyz, idx); + // cudaDeviceSynchronize(); // for using printf in kernel function + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); + exit(-1); + } +} diff --git a/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.h b/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.h new file mode 100644 index 00000000000..fe145e216ec --- /dev/null +++ b/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.h @@ -0,0 +1,44 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +//***************************************************************************************/ +// +// Based on Pointnet2 Library (MIT License): +// https://github.com/sshaoshuai/Pointnet2.PyPaddle +// +// Copyright (c) 2019 Shaoshuai Shi +// +// 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. +// +//***************************************************************************************/ + +#pragma once + +void ball_query_launcher(int b, + int n, + int m, + float radius, + int nsample, + const float *xyz, + const float *new_xyz, + int *idx, + uint64_t stream_id); diff --git a/cpp/open3d/ml/paddle/pointnet/BallQueryOps.cpp b/cpp/open3d/ml/paddle/pointnet/BallQueryOps.cpp new file mode 100644 index 00000000000..87b3ef7e16f --- /dev/null +++ b/cpp/open3d/ml/paddle/pointnet/BallQueryOps.cpp @@ -0,0 +1,87 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +//***************************************************************************************/ +// +// Based on Pointnet2 Library (MIT License): +// https://github.com/sshaoshuai/Pointnet2.PyPaddle +// +// Copyright (c) 2019 Shaoshuai Shi +// +// 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. +// +//***************************************************************************************/ + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/pointnet/BallQueryKernel.h" +#include "paddle/extension.h" + +#ifdef BUILD_CUDA_MODULE + +std::vector BallQuery(paddle::Tensor &xyz, + paddle::Tensor ¢er, + double radius, + const int64_t nsample) { + int batch_size = xyz.shape()[0]; + int pts_num = xyz.shape()[1]; + int ball_num = center.shape()[1]; + + auto place = xyz.place(); + paddle::Tensor out = + paddle::full({batch_size, ball_num, nsample}, 0.0f, + paddle::DataType(ToPaddleDtype()), place); + + const float *center_data = center.data(); + const float *xyz_data = xyz.data(); + int *idx = out.data(); + + ball_query_launcher(batch_size, pts_num, ball_num, radius, nsample, + center_data, xyz_data, idx, + reinterpret_cast(xyz.stream())); + return {out}; +} + +std::vector BallQueryInferDtype() { + return {paddle::DataType::FLOAT32}; +} + +std::vector> BallQueryInferShape( + std::vector xyz_shape, + std::vector center_shape, + const int64_t nsample) { + return {{xyz_shape[0], xyz_shape[1], center_shape[1]}}; +} + +PD_BUILD_OP(open3d_ball_query) + .Inputs({"xyz", "center"}) + .Outputs({"out"}) + .Attrs({ + "radius: double", + "nsample: int64_t", + }) + .SetKernelFn(PD_KERNEL(BallQuery)) + .SetInferShapeFn(PD_INFER_SHAPE(BallQueryInferShape)) + .SetInferDtypeFn(PD_INFER_DTYPE(BallQueryInferDtype)); + +#endif diff --git a/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.cu b/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.cu new file mode 100644 index 00000000000..7697f0c8742 --- /dev/null +++ b/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.cu @@ -0,0 +1,139 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +//***************************************************************************************/ +// +// Based on Pointnet2 Library (MIT License): +// https://github.com/sshaoshuai/Pointnet2.PyPaddle +// +// Copyright (c) 2019 Shaoshuai Shi +// +// 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. +// +//***************************************************************************************/ + +#include +#include +#include + +#include + +#include "open3d/ml/contrib/InterpolatePoints.cuh" +#include "open3d/ml/contrib/cuda_utils.h" +#include "open3d/ml/paddle/pointnet/InterpolateKernel.h" + +using namespace open3d::ml::contrib; + +void three_nn_launcher(int b, + int n, + int m, + const float *unknown, + const float *known, + float *dist2, + int *idx, + uint64_t stream_id) { + // unknown: (B, N, 3) + // known: (B, M, 3) + // output: + // dist2: (B, N, 3) + // idx: (B, N, 3) + + cudaError_t err; + + cudaStream_t stream = reinterpret_cast(stream_id); + + dim3 blocks(DIVUP(n, THREADS_PER_BLOCK), + b); // blockIdx.x(col), blockIdx.y(row) + dim3 threads(THREADS_PER_BLOCK); + + three_nn_kernel<<>>(b, n, m, unknown, known, + dist2, idx); + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); + exit(-1); + } +} + +void three_interpolate_launcher(int b, + int c, + int m, + int n, + const float *points, + const int *idx, + const float *weight, + float *out, + uint64_t stream_id) { + // points: (B, C, M) + // idx: (B, N, 3) + // weight: (B, N, 3) + // output: + // out: (B, C, N) + + cudaError_t err; + + cudaStream_t stream = reinterpret_cast(stream_id); + + dim3 blocks(DIVUP(n, THREADS_PER_BLOCK), c, + b); // blockIdx.x(col), blockIdx.y(row) + dim3 threads(THREADS_PER_BLOCK); + three_interpolate_kernel<<>>(b, c, m, n, points, + idx, weight, out); + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); + exit(-1); + } +} + +void three_interpolate_grad_launcher(int b, + int c, + int n, + int m, + const float *grad_out, + const int *idx, + const float *weight, + float *grad_points, + uint64_t stream_id) { + // grad_out: (B, C, N) + // weight: (B, N, 3) + // output: + // grad_points: (B, C, M) + + cudaError_t err; + + cudaStream_t stream = reinterpret_cast(stream_id); + + dim3 blocks(DIVUP(n, THREADS_PER_BLOCK), c, + b); // blockIdx.x(col), blockIdx.y(row) + dim3 threads(THREADS_PER_BLOCK); + three_interpolate_grad_kernel<<>>( + b, c, n, m, grad_out, idx, weight, grad_points); + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); + exit(-1); + } +} diff --git a/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.h b/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.h new file mode 100644 index 00000000000..4daa872af2c --- /dev/null +++ b/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.h @@ -0,0 +1,63 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +//***************************************************************************************/ +// +// Based on Pointnet2 Library (MIT License): +// https://github.com/sshaoshuai/Pointnet2.PyPaddle +// +// Copyright (c) 2019 Shaoshuai Shi +// +// 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. +// +//***************************************************************************************/ + +#pragma once + +void three_nn_launcher(int b, + int n, + int m, + const float *unknown, + const float *known, + float *dist2, + int *idx, + uint64_t stream_id); + +void three_interpolate_launcher(int b, + int c, + int m, + int n, + const float *points, + const int *idx, + const float *weight, + float *out, + uint64_t stream_id); + +void three_interpolate_grad_launcher(int b, + int c, + int n, + int m, + const float *grad_out, + const int *idx, + const float *weight, + float *grad_points, + uint64_t stream_id); diff --git a/cpp/open3d/ml/paddle/pointnet/InterpolateOps.cpp b/cpp/open3d/ml/paddle/pointnet/InterpolateOps.cpp new file mode 100644 index 00000000000..63ac08056c7 --- /dev/null +++ b/cpp/open3d/ml/paddle/pointnet/InterpolateOps.cpp @@ -0,0 +1,181 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +//***************************************************************************************/ +// +// Based on Pointnet2 Library (MIT License): +// https://github.com/sshaoshuai/Pointnet2.PyPaddle +// +// Copyright (c) 2019 Shaoshuai Shi +// +// 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. +// +//***************************************************************************************/ + +#include +#include +#include + +#include +#include + +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/pointnet/InterpolateKernel.h" +#include "paddle/extension.h" + +#ifdef BUILD_CUDA_MODULE +std::vector ThreeNN(paddle::Tensor &query_pts, + paddle::Tensor &data_pts) { + int batch_size = query_pts.shape()[0]; + int pts_num_out = query_pts.shape()[1]; + int pts_num_in = data_pts.shape()[1]; + + auto place = data_pts.place(); + paddle::Tensor out_idx = + paddle::full({batch_size, pts_num_out, 3}, 0, + paddle::DataType(ToPaddleDtype()), place); + + paddle::Tensor out_dist2 = + paddle::zeros({batch_size, pts_num_out, 3}, + paddle::DataType(ToPaddleDtype()), place); + + const float *pts_out = query_pts.data(); + const float *pts_in = data_pts.data(); + float *dist2 = out_dist2.data(); + int *idx = out_idx.data(); + + three_nn_launcher(batch_size, pts_num_out, pts_num_in, pts_out, pts_in, + dist2, idx, + reinterpret_cast(query_pts.stream())); + + return {out_dist2, out_idx}; +} + +std::vector ThreeNNInferDtype() { + return {paddle::DataType::INT32, paddle::DataType::FLOAT32}; +} + +std::vector> ThreeNNInferShape( + std::vector query_pts_shape, + std::vector data_pts_shape) { + std::vector shape{query_pts_shape[0], query_pts_shape[1], 3}; + return {shape, shape}; +} + +PD_BUILD_OP(open3d_three_nn) + .Inputs({"query_pts", "data_pts"}) + .Outputs({"dist", "idx"}) + .Attrs({}) + .SetKernelFn(PD_KERNEL(ThreeNN)) + .SetInferShapeFn(PD_INFER_SHAPE(ThreeNNInferShape)) + .SetInferDtypeFn(PD_INFER_DTYPE(ThreeNNInferDtype)); + +std::vector ThreeInterpolate(paddle::Tensor &points, + paddle::Tensor &idx, + paddle::Tensor &weights) { + int batch_size = points.shape()[0]; + int C = points.shape()[1]; + int M = points.shape()[2]; + int N = idx.shape()[1]; + + auto place = points.place(); + paddle::Tensor out = + paddle::full({batch_size, C, N}, 0.0f, + paddle::DataType(ToPaddleDtype()), place); + + const float *points_data = points.data(); + const float *weights_data = weights.data(); + const int *idx_data = idx.data(); + float *out_data = out.data(); + + three_interpolate_launcher(batch_size, C, M, N, points_data, idx_data, + weights_data, out_data, + reinterpret_cast(points.stream())); + + return {out}; +} + +std::vector ThreeInterpolateInferDtype() { + return {paddle::DataType::FLOAT32}; +} + +std::vector> ThreeInterpolateInferShape( + std::vector points_shape, std::vector idx_shape) { + return {{points_shape[0], points_shape[1], idx_shape[1]}}; +} + +PD_BUILD_OP(open3d_three_interpolate) + .Inputs({ + "points", + "idx", + "weights", + }) + .Outputs({"out"}) + .Attrs({}) + .SetKernelFn(PD_KERNEL(ThreeInterpolate)) + .SetInferShapeFn(PD_INFER_SHAPE(ThreeInterpolateInferShape)) + .SetInferDtypeFn(PD_INFER_DTYPE(ThreeInterpolateInferDtype)); + +std::vector ThreeInterpolateGrad(paddle::Tensor &grad_out, + paddle::Tensor &idx, + paddle::Tensor &weights, + const int64_t M) { + int batch_size = grad_out.shape()[0]; + int C = grad_out.shape()[1]; + int N = grad_out.shape()[2]; + + auto place = grad_out.place(); + paddle::Tensor out = + paddle::full({batch_size, C, M}, 0.0f, + paddle::DataType(ToPaddleDtype()), place); + + const float *grad_out_data = grad_out.data(); + const float *weights_data = weights.data(); + const int *idx_data = idx.data(); + + float *out_data = out.data(); + + three_interpolate_grad_launcher( + batch_size, C, N, M, grad_out_data, idx_data, weights_data, + out_data, reinterpret_cast(grad_out.stream())); + + return {out}; +} + +std::vector ThreeInterpolateGradInferDtype() { + return {paddle::DataType::FLOAT32}; +} + +std::vector> ThreeInterpolateGradInferShape( + std::vector grad_out_shape) { + return {{grad_out_shape[0], grad_out_shape[1], grad_out_shape[2]}}; +} + +PD_BUILD_OP(open3d_three_interpolate_grad) + .Inputs({"grad_out", "idx", "weights"}) + .Outputs({"out"}) + .Attrs({"M: int64_t"}) + .SetKernelFn(PD_KERNEL(ThreeInterpolateGrad)) + .SetInferShapeFn(PD_INFER_SHAPE(ThreeInterpolateGradInferShape)) + .SetInferDtypeFn(PD_INFER_DTYPE(ThreeInterpolateGradInferDtype)); + +#endif diff --git a/cpp/open3d/ml/paddle/pointnet/SamplingKernel.cu b/cpp/open3d/ml/paddle/pointnet/SamplingKernel.cu new file mode 100644 index 00000000000..ff87b57d3ed --- /dev/null +++ b/cpp/open3d/ml/paddle/pointnet/SamplingKernel.cu @@ -0,0 +1,118 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +//***************************************************************************************/ +// +// Based on Pointnet2 Library (MIT License): +// https://github.com/sshaoshuai/Pointnet2.PyPaddle +// +// Copyright (c) 2019 Shaoshuai Shi +// +// 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. +// +//***************************************************************************************/ + +#include +#include + +#include + +#include "open3d/ml/contrib/PointSampling.cuh" +#include "open3d/ml/contrib/cuda_utils.h" +#include "open3d/ml/paddle/pointnet/SamplingKernel.h" + +using namespace open3d::ml::contrib; + +void furthest_point_sampling_launcher(int b, + int n, + int m, + const float *dataset, + float *temp, + int *idxs, + uint64_t stream_id) { + // dataset: (B, N, 3) + // tmp: (B, N) + // output: + // idx: (B, M) + + cudaError_t err; + + cudaStream_t stream = reinterpret_cast(stream_id); + + unsigned int n_threads = OptNumThreads(n); + + switch (n_threads) { + case 1024: + furthest_point_sampling_kernel<1024> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 512: + furthest_point_sampling_kernel<512> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 256: + furthest_point_sampling_kernel<256> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 128: + furthest_point_sampling_kernel<128> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 64: + furthest_point_sampling_kernel<64> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 32: + furthest_point_sampling_kernel<32> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 16: + furthest_point_sampling_kernel<16> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 8: + furthest_point_sampling_kernel<8> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 4: + furthest_point_sampling_kernel<4> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 2: + furthest_point_sampling_kernel<2> + <<>>(b, n, m, dataset, temp, idxs); + break; + case 1: + furthest_point_sampling_kernel<1> + <<>>(b, n, m, dataset, temp, idxs); + break; + default: + furthest_point_sampling_kernel<512> + <<>>(b, n, m, dataset, temp, idxs); + } + + err = cudaGetLastError(); + if (cudaSuccess != err) { + fprintf(stderr, "CUDA kernel failed : %s\n", cudaGetErrorString(err)); + exit(-1); + } +} diff --git a/cpp/open3d/ml/paddle/pointnet/SamplingKernel.h b/cpp/open3d/ml/paddle/pointnet/SamplingKernel.h new file mode 100644 index 00000000000..f04fad8835e --- /dev/null +++ b/cpp/open3d/ml/paddle/pointnet/SamplingKernel.h @@ -0,0 +1,42 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +//***************************************************************************************/ +// +// Based on Pointnet2 Library (MIT License): +// https://github.com/sshaoshuai/Pointnet2.PyPaddle +// +// Copyright (c) 2019 Shaoshuai Shi +// +// 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. +// +//***************************************************************************************/ + +#pragma once + +void furthest_point_sampling_launcher(int b, + int n, + int m, + const float *dataset, + float *temp, + int *idxs, + uint64_t stream_id); diff --git a/cpp/open3d/ml/paddle/pointnet/SamplingOps.cpp b/cpp/open3d/ml/paddle/pointnet/SamplingOps.cpp new file mode 100644 index 00000000000..6f541d72372 --- /dev/null +++ b/cpp/open3d/ml/paddle/pointnet/SamplingOps.cpp @@ -0,0 +1,85 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +//***************************************************************************************/ +// +// Based on Pointnet2 Library (MIT License): +// https://github.com/sshaoshuai/Pointnet2.PyPaddle +// +// Copyright (c) 2019 Shaoshuai Shi +// +// 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. +// +//***************************************************************************************/ + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/pointnet/SamplingKernel.h" +#include "paddle/extension.h" + +#ifdef BUILD_CUDA_MODULE + +std::vector FurthestPointSampling(paddle::Tensor &points, + const int64_t sample_size) { + int batch_size = points.shape()[0]; + int pts_size = points.shape()[1]; + + auto place = points.place(); + paddle::Tensor out = + paddle::full({batch_size, sample_size}, 0, + paddle::DataType(ToPaddleDtype()), place); + paddle::Tensor temp = + paddle::full({batch_size, pts_size}, 1e10, + paddle::DataType(ToPaddleDtype()), place); + + const float *points_data = points.data(); + float *temp_data = temp.data(); + int *out_data = out.data(); + + furthest_point_sampling_launcher( + batch_size, pts_size, sample_size, points_data, temp_data, out_data, + reinterpret_cast(points.stream())); + + return {out}; +} + +std::vector FurthestPointSamplingInferDtype() { + return {paddle::DataType::INT32}; +} + +std::vector> FurthestPointSamplingInferShape( + std::vector points_shape, const int64_t sample_size) { + return {{points_shape[0], sample_size}}; +} + +PD_BUILD_OP(open3d_furthest_point_sampling) + .Inputs({"points"}) + .Outputs({"out"}) + .Attrs({ + "sample_size: int64_t", + }) + .SetKernelFn(PD_KERNEL(FurthestPointSampling)) + .SetInferShapeFn(PD_INFER_SHAPE(FurthestPointSamplingInferShape)) + .SetInferDtypeFn(PD_INFER_DTYPE(FurthestPointSamplingInferDtype)); + +#endif From f1ab64cdcbf1681efb7e15462966854bc01dc303 Mon Sep 17 00:00:00 2001 From: RDIO <35186529+Woodman3@users.noreply.github.com> Date: Mon, 11 Nov 2024 14:30:11 +0800 Subject: [PATCH 08/19] [Feat] Add ContinuousConv and ContinuousConvTranspose operators (#6) * [Feat] add conv op * [Doc] add comment * [fix] add contigous(not compile) --------- Signed-off-by: Woodman3 <1025760745@qq.com> --- cpp/open3d/ml/paddle/CMakeLists.txt | 18 ++ cpp/open3d/ml/paddle/PaddleHelper.cpp | 30 ++ cpp/open3d/ml/paddle/PaddleHelper.h | 14 +- .../ContinuousConvBackpropFilterOpKernel.cpp | 72 +++++ .../ContinuousConvBackpropFilterOpKernel.cu | 109 +++++++ .../ContinuousConvBackpropFilterOpKernel.h | 54 ++++ .../continuous_conv/ContinuousConvHelper.h | 56 ++++ .../ContinuousConvOpKernel.cpp | 68 ++++ .../continuous_conv/ContinuousConvOpKernel.cu | 105 +++++++ .../continuous_conv/ContinuousConvOpKernel.h | 53 ++++ .../continuous_conv/ContinuousConvOps.cpp | 239 ++++++++++++++ ...ousConvTransposeBackpropFilterOpKernel.cpp | 81 +++++ ...uousConvTransposeBackpropFilterOpKernel.cu | 122 ++++++++ ...nuousConvTransposeBackpropFilterOpKernel.h | 59 ++++ .../ContinuousConvTransposeOpKernel.cpp | 80 +++++ .../ContinuousConvTransposeOpKernel.cu | 120 +++++++ .../ContinuousConvTransposeOpKernel.h | 59 ++++ .../ContinuousConvTransposeOps.cpp | 258 +++++++++++++++ .../ml/paddle/python/layers/convolutions.py | 296 ++++++++++++++++++ python/test/ml_ops/mltest.py | 14 +- python/test/ml_ops/test_cconv.py | 12 +- python/test/ml_ops/test_voxel_pooling.py | 54 +++- 22 files changed, 1950 insertions(+), 23 deletions(-) create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.h create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvHelper.h create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.h create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOps.cpp create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.h create mode 100644 cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOps.cpp create mode 100644 python/open3d/ml/paddle/python/layers/convolutions.py diff --git a/cpp/open3d/ml/paddle/CMakeLists.txt b/cpp/open3d/ml/paddle/CMakeLists.txt index 87677f067d9..34d7f1842ee 100644 --- a/cpp/open3d/ml/paddle/CMakeLists.txt +++ b/cpp/open3d/ml/paddle/CMakeLists.txt @@ -43,6 +43,15 @@ target_sources(open3d_paddle_ops PRIVATE pointnet/SamplingOps.cpp ) +target_sources(open3d_paddle_ops PRIVATE + continuous_conv/ContinuousConvOps.cpp + continuous_conv/ContinuousConvOpKernel.cpp + continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp + continuous_conv/ContinuousConvTransposeOps.cpp + continuous_conv/ContinuousConvTransposeOpKernel.cpp + continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp +) + target_sources(open3d_paddle_ops PRIVATE ../contrib/Nms.cpp ) @@ -63,6 +72,12 @@ if (BUILD_CUDA_MODULE) pointnet/SamplingKernel.cu ) + target_sources(open3d_paddle_ops PRIVATE + continuous_conv/ContinuousConvOpKernel.cu + continuous_conv/ContinuousConvBackpropFilterOpKernel.cu + continuous_conv/ContinuousConvTransposeOpKernel.cu + continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu + ) target_sources(open3d_paddle_ops PRIVATE ../contrib/BallQuery.cu ../contrib/InterpolatePoints.cu @@ -70,6 +85,9 @@ if (BUILD_CUDA_MODULE) ../contrib/RoiPoolKernel.cu ) + target_sources(open3d_paddle_ops PRIVATE + ../impl/continuous_conv/ContinuousConvCUDAKernels.cu + ) endif() open3d_show_and_abort_on_warning(open3d_paddle_ops) diff --git a/cpp/open3d/ml/paddle/PaddleHelper.cpp b/cpp/open3d/ml/paddle/PaddleHelper.cpp index 9a0c00065cd..085563185ab 100644 --- a/cpp/open3d/ml/paddle/PaddleHelper.cpp +++ b/cpp/open3d/ml/paddle/PaddleHelper.cpp @@ -40,3 +40,33 @@ paddle::Tensor InitializedEmptyTensor(const phi::DataType dtype, phi::DataTypeToString(dtype)); } } + +paddle::Tensor Arange(const int end, const paddle::Place& place) { + PD_CHECK(end > 0, "end:%d ,end must greater than 0", end); + auto start_tensor = paddle::zeros({1}, paddle::DataType::INT32, place); + auto end_tensor = paddle::experimental::full( + {1}, end, paddle::DataType::INT32, place); + auto step_tensor = + paddle::experimental::full({1}, 1, paddle::DataType::INT32, place); + return paddle::experimental::arange(start_tensor, end_tensor, step_tensor, + paddle::DataType::INT32, place); +} + +paddle::Tensor Transpose(const paddle::Tensor& t, int64_t dim0, int64_t dim1) { + int len = t.shape().size(); + dim0 = dim0 >= 0 ? dim0 : len + dim0; + dim1 = dim1 >= 0 ? dim1 : len + dim1; + PD_CHECK(dim0 >= 0 && dim0 < len, + "dim0 not in range" + "dim0:%d ,range:%d", + dim0, len); + PD_CHECK(dim1 >= 0 && dim1 < len, + "dim1 not in range" + "dim1:%d ,range:%d", + dim1, len); + std::vector transpose_perm(len); + std::iota(transpose_perm.begin(), transpose_perm.end(), 0); + transpose_perm[dim0] = dim1; + transpose_perm[dim1] = dim0; + return paddle::experimental::transpose(t, transpose_perm); +} diff --git a/cpp/open3d/ml/paddle/PaddleHelper.h b/cpp/open3d/ml/paddle/PaddleHelper.h index 5ef6c6dd917..7b4a4d1f98a 100644 --- a/cpp/open3d/ml/paddle/PaddleHelper.h +++ b/cpp/open3d/ml/paddle/PaddleHelper.h @@ -7,14 +7,16 @@ #pragma once -#include -#include -#include +#include +#include #include #include #include "open3d/ml/ShapeChecking.h" +#include "paddle/extension.h" +#include "paddle/phi/backends/all_context.h" +#include "paddle/phi/core/allocator.h" // Macros for checking tensor properties #define CHECK_CUDA(x) \ @@ -282,3 +284,9 @@ paddle::Tensor InitializedEmptyTensor(const phi::IntArray& shape, paddle::Tensor InitializedEmptyTensor(const phi::DataType dtype, const phi::IntArray& shape, const phi::Place& place); + +// return a array of [0 1 2 ... end-1] +paddle::Tensor Arange(const int end, const paddle::Place& place); + +// just like tensor.transpose(dim0,dim1) +paddle::Tensor Transpose(const paddle::Tensor& t, int64_t dim0, int64_t dim1); diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp new file mode 100644 index 00000000000..f9c4ea79d42 --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp @@ -0,0 +1,72 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConvBackpropFilter.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void ContinuousConvBackpropFilterCPU( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool align_corners, + const open3d::ml::impl::CoordinateMapping coordinate_mapping, + const bool normalize, + const open3d::ml::impl::InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop) { + const bool individual_extents = extents.shape()[0] > 1; + const bool isotropic_extents = extents.shape()[1] == 1; + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + CConvBackpropFilterCPU( + filter_backprop.data(), filter_dims, out_positions.shape()[0], + out_positions.data(), inp_positions.shape()[0], + inp_positions.data(), inp_features.data(), + inp_importance.shape()[0] ? inp_importance.data() : nullptr, + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), extents.data(), + offset.data(), out_features_gradient.data(), + interpolation, coordinate_mapping, align_corners, + individual_extents, isotropic_extents, normalize); +} +#define INSTANTIATE(TFeat, TOut, TReal, TIndex) \ + template void ContinuousConvBackpropFilterCPU( \ + const paddle::Tensor& filters, \ + const paddle::Tensor& out_positions, \ + const paddle::Tensor& extents, const paddle::Tensor& offset, \ + const paddle::Tensor& inp_positions, \ + const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_importance, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, \ + const paddle::Tensor& out_features_gradient, \ + const bool align_corners, \ + const open3d::ml::impl::CoordinateMapping coordinate_mapping, \ + const bool normalize, \ + const open3d::ml::impl::InterpolationMode interpolation, \ + const int64_t max_temp_mem_MB, paddle::Tensor& filter_backprop); + +INSTANTIATE(float, float, float, int32_t) diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu new file mode 100644 index 00000000000..839a7ba327d --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu @@ -0,0 +1,109 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#include +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConvBackpropFilter.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void ContinuousConvBackpropFilterCUDA( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool align_corners, + const open3d::ml::impl::CoordinateMapping coordinate_mapping, + const bool normalize, + const open3d::ml::impl::InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop) { + const bool individual_extents = extents.shape()[0] > 1; + const bool isotropic_extents = extents.shape()[1] == 1; + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + + auto stream = filters.stream(); + // -1 means current global place + auto cuda_device_props = phi::backends::gpu::GetDeviceProperties(-1); + const int texture_alignment = cuda_device_props.textureAlignment; + + auto place = filters.place(); + + void* temp_ptr = nullptr; + size_t temp_size = 0; + size_t max_temp_size = 0; + + // determine temp_size + CConvBackpropFilterCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + filter_backprop.data(), filter_dims, out_positions.shape()[0], + out_positions.data(), inp_positions.shape()[0], + inp_positions.data(), inp_features.data(), + inp_importance.shape()[0] ? inp_importance.data() : nullptr, + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), extents.data(), + offset.data(), out_features_gradient.data(), + interpolation, coordinate_mapping, align_corners, + individual_extents, isotropic_extents, normalize); + + temp_size = std::max( + std::min(static_cast(max_temp_mem_MB) * 1024 * 1024, + max_temp_size), + temp_size); + + auto temp_tensor = CreateTempTensor(temp_size, place, &temp_ptr); + + // actually run the operation + CConvBackpropFilterCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + filter_backprop.data(), filter_dims, out_positions.shape()[0], + out_positions.data(), inp_positions.shape()[0], + inp_positions.data(), inp_features.data(), + inp_importance.shape()[0] ? inp_importance.data() : nullptr, + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), extents.data(), + offset.data(), out_features_gradient.data(), + interpolation, coordinate_mapping, align_corners, + individual_extents, isotropic_extents, normalize); +} +#define INSTANTIATE(TFeat, TOut, TReal, TIndex) \ + template void \ + ContinuousConvBackpropFilterCUDA( \ + const paddle::Tensor& filters, \ + const paddle::Tensor& out_positions, \ + const paddle::Tensor& extents, const paddle::Tensor& offset, \ + const paddle::Tensor& inp_positions, \ + const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_importance, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, \ + const paddle::Tensor& out_features_gradient, \ + const bool align_corners, \ + const open3d::ml::impl::CoordinateMapping coordinate_mapping, \ + const bool normalize, \ + const open3d::ml::impl::InterpolationMode interpolation, \ + const int64_t max_temp_mem_MB, paddle::Tensor& filter_backprop); + +INSTANTIATE(float, float, float, int32_t); diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.h b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.h new file mode 100644 index 00000000000..5dd79cb88f0 --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.h @@ -0,0 +1,54 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConvTypes.h" + +template +void ContinuousConvBackpropFilterCPU( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool align_corners, + const open3d::ml::impl::CoordinateMapping coordinate_mapping, + const bool normalize, + const open3d::ml::impl::InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop); + +#ifdef BUILD_CUDA_MODULE +template +void ContinuousConvBackpropFilterCUDA( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool align_corners, + const open3d::ml::impl::CoordinateMapping coordinate_mapping, + const bool normalize, + const open3d::ml::impl::InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop); +#endif diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvHelper.h b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvHelper.h new file mode 100644 index 00000000000..32f65fbd38e --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvHelper.h @@ -0,0 +1,56 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConvTypes.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +// +// helper functions for parsing arguments +// + +inline open3d::ml::impl::CoordinateMapping ParseCoordinateMappingStr( + const std::string& str) { + using open3d::ml::impl::CoordinateMapping; + CoordinateMapping coordinate_mapping = + CoordinateMapping::BALL_TO_CUBE_RADIAL; + if (str == "ball_to_cube_radial") { + coordinate_mapping = CoordinateMapping::BALL_TO_CUBE_RADIAL; + } else if (str == "ball_to_cube_volume_preserving") { + coordinate_mapping = CoordinateMapping::BALL_TO_CUBE_VOLUME_PRESERVING; + } else if (str == "identity") { + coordinate_mapping = CoordinateMapping::IDENTITY; + } else { + PD_CHECK(false, + "coordinate_mapping must be one of ('ball_to_cube_radial', " + "'ball_to_cube_volume_preserving', 'identity') but got " + + str); + } + return coordinate_mapping; +} + +inline open3d::ml::impl::InterpolationMode ParseInterpolationStr( + const std::string& str) { + using open3d::ml::impl::InterpolationMode; + InterpolationMode interpolation = InterpolationMode::LINEAR; + if (str == "linear") { + interpolation = InterpolationMode::LINEAR; + } else if (str == "linear_border") { + interpolation = InterpolationMode::LINEAR_BORDER; + } else if (str == "nearest_neighbor") { + interpolation = InterpolationMode::NEAREST_NEIGHBOR; + } else { + PD_CHECK(false, + "interpolation must be one of ('linear', " + "'linear_border', 'nearest_neighbor') but got " + + str); + } + return interpolation; +} diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cpp b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cpp new file mode 100644 index 00000000000..24a30deeacb --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cpp @@ -0,0 +1,68 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConv.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void ContinuousConvCPU(const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool align_corners, + const CoordinateMapping coordinate_mapping, + const bool normalize, + const InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features) { + const bool individual_extents = extents.shape()[0] > 1; + const bool isotropic_extents = extents.shape()[1] == 1; + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + CConvComputeFeaturesCPU( + out_features.data(), filter_dims, filters.data(), + out_positions.shape()[0], out_positions.data(), + inp_positions.shape()[0], inp_positions.data(), + inp_features.data(), + inp_importance.shape()[0] ? inp_importance.data() : nullptr, + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), extents.data(), + offset.data(), interpolation, coordinate_mapping, + align_corners, individual_extents, isotropic_extents, normalize); +} +#define INSTANTIATE(TFeat, TOut, TReal, TIndex) \ + template void ContinuousConvCPU( \ + const paddle::Tensor& filters, \ + const paddle::Tensor& out_positions, \ + const paddle::Tensor& extents, const paddle::Tensor& offset, \ + const paddle::Tensor& inp_positions, \ + const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_importance, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, \ + const bool align_corners, \ + const CoordinateMapping coordinate_mapping, const bool normalize, \ + const InterpolationMode interpolation, \ + const int64_t max_temp_mem_MB, paddle::Tensor& out_features); + +INSTANTIATE(float, float, float, int32_t) diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cu b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cu new file mode 100644 index 00000000000..4412845c45b --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cu @@ -0,0 +1,105 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConv.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void ContinuousConvCUDA(const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool align_corners, + const CoordinateMapping coordinate_mapping, + const bool normalize, + const InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features) { + const bool individual_extents = extents.shape()[0] > 1; + const bool isotropic_extents = extents.shape()[1] == 1; + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + + auto stream = filters.stream(); + // -1 means current global place + auto cuda_device_props = phi::backends::gpu::GetDeviceProperties(-1); + const int texture_alignment = cuda_device_props.textureAlignment; + + auto place = filters.place(); + + void* temp_ptr = nullptr; + size_t temp_size = 0; + size_t max_temp_size = 0; + + // determine temp_size + CConvComputeFeaturesCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + out_features.data(), filter_dims, filters.data(), + out_positions.shape()[0], out_positions.data(), + inp_positions.shape()[0], inp_positions.data(), + inp_features.data(), + inp_importance.shape()[0] ? inp_importance.data() : nullptr, + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), extents.data(), + offset.data(), interpolation, coordinate_mapping, + align_corners, individual_extents, isotropic_extents, normalize); + + temp_size = std::max( + std::min(static_cast(max_temp_mem_MB) * 1024 * 1024, + max_temp_size), + temp_size); + + auto temp_tensor = CreateTempTensor(temp_size, place, &temp_ptr); + + // actually run the operation + CConvComputeFeaturesCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + out_features.data(), filter_dims, filters.data(), + out_positions.shape()[0], out_positions.data(), + inp_positions.shape()[0], inp_positions.data(), + inp_features.data(), + inp_importance.shape()[0] ? inp_importance.data() : nullptr, + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), extents.data(), + offset.data(), interpolation, coordinate_mapping, + align_corners, individual_extents, isotropic_extents, normalize); +} +#define INSTANTIATE(TFeat, TOut, TReal, TIndex) \ + template void ContinuousConvCUDA( \ + const paddle::Tensor& filters, \ + const paddle::Tensor& out_positions, \ + const paddle::Tensor& extents, const paddle::Tensor& offset, \ + const paddle::Tensor& inp_positions, \ + const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_importance, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, \ + const bool align_corners, \ + const CoordinateMapping coordinate_mapping, const bool normalize, \ + const InterpolationMode interpolation, \ + const int64_t max_temp_mem_MB, paddle::Tensor& out_features); + +INSTANTIATE(float, float, float, int32_t) diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.h b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.h new file mode 100644 index 00000000000..da95fb6d9a8 --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.h @@ -0,0 +1,53 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConvTypes.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +template +void ContinuousConvCPU( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool align_corners, + const open3d::ml::impl::CoordinateMapping coordinate_mapping, + const bool normalize, + const open3d::ml::impl::InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features); + +#ifdef BUILD_CUDA_MODULE +template +void ContinuousConvCUDA( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool align_corners, + const open3d::ml::impl::CoordinateMapping coordinate_mapping, + const bool normalize, + const open3d::ml::impl::InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features); +#endif diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOps.cpp b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOps.cpp new file mode 100644 index 00000000000..ba750abc3ab --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOps.cpp @@ -0,0 +1,239 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.h" +#include "open3d/ml/paddle/continuous_conv/ContinuousConvHelper.h" +#include "open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.h" +#include "open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.h" +#include "open3d/ml/paddle/misc/InvertNeighborsListOps.h" +#include "open3d/ml/paddle/misc/ReduceSubarraysSumOps.h" + +using namespace open3d::ml::impl; + +std::vector ContinuousConvForward( + paddle::Tensor& filters, + paddle::Tensor& out_positions, + paddle::Tensor& extents, + paddle::Tensor& offset, + paddle::Tensor& inp_positions, + paddle::Tensor& inp_features, + paddle::Tensor& inp_importance, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_importance, + paddle::Tensor& neighbors_row_splits, + const bool align_corners, + const std::string& coordinate_mapping_str, + const bool normalize, + const std::string& interpolation_str, + const int64_t max_temp_mem_MB) { + CoordinateMapping coordinate_mapping = + ParseCoordinateMappingStr(coordinate_mapping_str); + + InterpolationMode interpolation = ParseInterpolationStr(interpolation_str); + + CHECK_TYPE(neighbors_row_splits, paddle::DataType::INT64); + CHECK_SAME_DTYPE(filters, out_positions, extents, offset, inp_positions, + inp_features, inp_importance, neighbors_importance); + CHECK_SAME_DEVICE_TYPE(filters, out_positions, inp_positions, inp_features, + inp_importance); + + // check input shapes + using namespace open3d::ml::op_util; + Dim kernel_depth("kernel_depth"); + Dim kernel_height("kernel_height"); + Dim kernel_width("kernel_width"); + Dim out_channels("out_channels"); + Dim in_channels("in_channels"); + Dim num_out_points("num_out_points"); + Dim num_inp_points("num_inp_points"); + Dim num_neighbors("nun_neighbors"); + + CHECK_SHAPE(filters, kernel_depth, kernel_height, kernel_width, in_channels, + out_channels); + CHECK_SHAPE(out_positions, num_out_points, 3); + CHECK_SHAPE(extents, num_out_points || 1, Dim(3) || 1); + CHECK_SHAPE(offset, 3); + CHECK_SHAPE(inp_positions, num_inp_points, 3); + CHECK_SHAPE(inp_features, num_inp_points, in_channels); + CHECK_SHAPE(inp_importance, num_inp_points || 0); + CHECK_SHAPE(neighbors_index, num_neighbors); + CHECK_SHAPE(neighbors_importance, num_neighbors || 0); + CHECK_SHAPE(neighbors_row_splits, num_out_points + 1); + + // make sure that these are on the same place as the filters, positions + // and feats + auto place = inp_features.place(); + offset = offset.copy_to(place, false); + extents = extents.copy_to(place, false); + neighbors_index = neighbors_index.copy_to(place, false); + neighbors_importance = neighbors_importance.copy_to(place, false); + neighbors_row_splits = neighbors_row_splits.copy_to(place, false); + + const auto& feat_dtype = filters.dtype(); + const auto& real_dtype = inp_positions.dtype(); + const auto& index_dtype = neighbors_index.dtype(); + + paddle::Tensor out_features = paddle::empty( + {num_out_points.value(), out_channels.value()}, feat_dtype, place); +#define FN_PARAMETERS \ + filters, out_positions, extents, offset, inp_positions, inp_features, \ + inp_importance, neighbors_index, neighbors_importance, \ + neighbors_row_splits, align_corners, coordinate_mapping, \ + normalize, interpolation, max_temp_mem_MB, out_features + +#define CALL(feat_t, out_t, real_t, index_t, fn) \ + if (ComparePaddleDtype(feat_dtype) && \ + ComparePaddleDtype(real_dtype) && \ + ComparePaddleDtype(index_dtype)) { \ + fn(FN_PARAMETERS); \ + return {out_features}; \ + } + + if (inp_features.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + CALL(float, float, float, int32_t, ::ContinuousConvCUDA) +#else + PD_CHECK(false, "ContinuousConv was not compiled with CUDA support"); +#endif + } else { + CALL(float, float, float, int32_t, ::ContinuousConvCPU) + } +#undef FN_PARAMETERS +#undef CALL + + PD_CHECK(false, "ContinuousConv does not support " + + phi::DataTypeToString(inp_features.dtype()) + + " as input for inp_features and " + + phi::DataTypeToString(neighbors_index.dtype()) + + " as input for neighbors_index"); + return {paddle::Tensor()}; +} + +std::vector ContinuousConvBackward( + paddle::Tensor& filters, + paddle::Tensor& out_positions, + paddle::Tensor& extents, + paddle::Tensor& offset, + paddle::Tensor& inp_positions, + paddle::Tensor& inp_features, + paddle::Tensor& inp_importance, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_importance, + paddle::Tensor& neighbors_row_splits, + paddle::Tensor& out_features_gradient, + const bool align_corners, + const std::string& coordinate_mapping_str, + const bool normalize, + const std::string& interpolation_str, + const int64_t max_temp_mem_MB) { + CoordinateMapping coordinate_mapping = + ParseCoordinateMappingStr(coordinate_mapping_str); + + InterpolationMode interpolation = ParseInterpolationStr(interpolation_str); + + auto place = inp_features.place(); + const auto& feat_dtype = filters.dtype(); + const auto& real_dtype = inp_positions.dtype(); + const auto& index_dtype = neighbors_index.dtype(); + CHECK_SAME_DTYPE(out_features_gradient, inp_features, filters); + CHECK_SAME_DEVICE_TYPE(out_features_gradient, inp_features, filters); + + // output vars + paddle::Tensor filters_backprop; + paddle::Tensor inp_features_backprop; + +#define CALL(feat_t, out_t, real_t, index_t, fn_suffix) \ + if (ComparePaddleDtype(feat_dtype) && \ + ComparePaddleDtype(real_dtype) && \ + ComparePaddleDtype(index_dtype)) { \ + filters_backprop = paddle::empty(filters.shape(), real_dtype, place); \ + ContinuousConvBackpropFilter##fn_suffix( \ + filters, out_positions, extents, offset, inp_positions, \ + inp_features, inp_importance, neighbors_index, \ + neighbors_importance, neighbors_row_splits, \ + out_features_gradient, align_corners, coordinate_mapping, \ + normalize, interpolation, max_temp_mem_MB, filters_backprop); \ + \ + paddle::Tensor inv_neighbors_index, inv_neighbors_row_splits, \ + inv_neighbors_importance; \ + auto inv = InvertNeighborsList(neighbors_index, neighbors_row_splits, \ + neighbors_importance, \ + inp_positions.shape()[0]); \ + inv_neighbors_index = inv[0]; \ + inv_neighbors_row_splits = inv[1]; \ + inv_neighbors_importance = inv[2]; \ + auto neighbors_importance_sum = ReduceSubarraysSum( \ + neighbors_importance, neighbors_row_splits)[0]; \ + inp_features_backprop = \ + paddle::ones(inp_features.shape(), real_dtype, place); \ + auto filters_transposed = Transpose(filters, 3, 4).contiguous(); \ + \ + ContinuousConvTranspose##fn_suffix( \ + filters_transposed, inp_positions, inp_importance, extents, \ + offset, out_positions, out_features_gradient, neighbors_index, \ + neighbors_importance_sum, neighbors_row_splits, \ + inv_neighbors_index, inv_neighbors_importance, \ + inv_neighbors_row_splits, align_corners, coordinate_mapping, \ + normalize, interpolation, max_temp_mem_MB, \ + inp_features_backprop); \ + dispatch_success = true; \ + } + + bool dispatch_success = false; + if (inp_features.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + CALL(float, float, float, int32_t, CUDA) +#else + PD_CHECK(false, + "ContinuousConv backward was not compiled " + "with CUDA support"); +#endif + } else { + CALL(float, float, float, int32_t, CPU) + } + PD_CHECK(dispatch_success, + "ContinuousConv backward does not support " + + phi::DataTypeToString(inp_features.dtype()) + + " as input for inp_features and " + + phi::DataTypeToString(neighbors_index.dtype()) + + " as input for neighbors_index"); + + return {filters_backprop, inp_features_backprop}; +} + +std::vector ContinuousConvInferDtype( + paddle::DataType filters_dtype) { + return {filters_dtype}; +} + +PD_BUILD_OP(open3d_continuous_conv) + .Inputs({"filters", "out_positions", "extents", "offset", + "inp_positions", "inp_features", "inp_importance", + "neighbors_index", "neighbors_importance", + "neighbors_row_splits"}) + .Outputs({"out_features"}) + .Attrs({"align_corners:bool", "coordinate_mapping:std::string", + "normalize:bool", "interpolation:std::string", + "max_temp_mem_MB:int64_t"}) + .SetKernelFn(PD_KERNEL(ContinuousConvForward)) + .SetInferDtypeFn(PD_INFER_DTYPE(ContinuousConvInferDtype)); + +PD_BUILD_GRAD_OP(open3d_continuous_conv) + .Inputs({"filters", "out_positions", "extents", "offset", + "inp_positions", "inp_features", "inp_importance", + "neighbors_index", "neighbors_importance", + "neighbors_row_splits", paddle::Grad("out_features")}) + .Outputs({paddle::Grad("filters"), paddle::Grad("inp_features")}) + .Attrs({"align_corners:bool", "coordinate_mapping:std::string", + "normalize:bool", "interpolation:std::string", + "max_temp_mem_MB:int64_t"}) + .SetKernelFn(PD_KERNEL(ContinuousConvBackward)); diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp new file mode 100644 index 00000000000..26679fa703c --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp @@ -0,0 +1,81 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConvTransposeBackpropFilter.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void ContinuousConvTransposeBackpropFilterCPU( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& out_importance, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool align_corners, + const CoordinateMapping coordinate_mapping, + const bool normalize, + const InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop) { + const bool individual_extents = extents.shape()[0] > 1; + const bool isotropic_extents = extents.shape()[1] == 1; + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + CConvTransposeBackpropFilterCPU( + filter_backprop.data(), filter_dims, out_positions.shape()[0], + out_positions.data(), + out_importance.shape()[0] ? out_importance.data() : nullptr, + inp_positions.shape()[0], inp_positions.data(), + inp_features.data(), + inp_neighbors_importance_sum.shape()[0] + ? inp_neighbors_importance_sum.data() + : nullptr, + inp_neighbors_row_splits.data(), + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), extents.data(), + offset.data(), out_features_gradient.data(), + interpolation, coordinate_mapping, align_corners, + individual_extents, isotropic_extents, normalize); +} +#define INSTANTIATE(TFeat, TOut, TReal, TIndex) \ + template void \ + ContinuousConvTransposeBackpropFilterCPU( \ + const paddle::Tensor& filters, \ + const paddle::Tensor& out_positions, \ + const paddle::Tensor& out_importance, \ + const paddle::Tensor& extents, const paddle::Tensor& offset, \ + const paddle::Tensor& inp_positions, \ + const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_neighbors_importance_sum, \ + const paddle::Tensor& inp_neighbors_row_splits, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, \ + const paddle::Tensor& out_features_gradient, \ + const bool align_corners, \ + const CoordinateMapping coordinate_mapping, const bool normalize, \ + const InterpolationMode interpolation, \ + const int64_t max_temp_mem_MB, paddle::Tensor& filter_backprop); + +INSTANTIATE(float, float, float, int32_t) diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu new file mode 100644 index 00000000000..5a44e449025 --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu @@ -0,0 +1,122 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#include +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConvTransposeBackpropFilter.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void ContinuousConvTransposeBackpropFilterCUDA( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& out_importance, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool align_corners, + const CoordinateMapping coordinate_mapping, + const bool normalize, + const InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop) { + const bool individual_extents = extents.shape()[0] > 1; + const bool isotropic_extents = extents.shape()[1] == 1; + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + + auto stream = filters.stream(); + // -1 means current global place + auto cuda_device_props = phi::backends::gpu::GetDeviceProperties(-1); + const int texture_alignment = cuda_device_props.textureAlignment; + + auto place = filters.place(); + + void* temp_ptr = nullptr; + size_t temp_size = 0; + size_t max_temp_size = 0; + + // determine temp_size + CConvTransposeBackpropFilterCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + filter_backprop.data(), filter_dims, out_positions.shape()[0], + out_positions.data(), + out_importance.shape()[0] ? out_importance.data() : nullptr, + inp_positions.shape()[0], inp_positions.data(), + inp_features.data(), + inp_neighbors_importance_sum.shape()[0] + ? inp_neighbors_importance_sum.data() + : nullptr, + inp_neighbors_row_splits.data(), + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), extents.data(), + offset.data(), out_features_gradient.data(), + interpolation, coordinate_mapping, align_corners, + individual_extents, isotropic_extents, normalize); + + temp_size = std::max( + std::min(static_cast(max_temp_mem_MB) * 1024 * 1024, + max_temp_size), + temp_size); + + auto temp_tensor = CreateTempTensor(temp_size, place, &temp_ptr); + + // actually run the operation + CConvTransposeBackpropFilterCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + filter_backprop.data(), filter_dims, out_positions.shape()[0], + out_positions.data(), + out_importance.shape()[0] ? out_importance.data() : nullptr, + inp_positions.shape()[0], inp_positions.data(), + inp_features.data(), + inp_neighbors_importance_sum.shape()[0] + ? inp_neighbors_importance_sum.data() + : nullptr, + inp_neighbors_row_splits.data(), + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), extents.data(), + offset.data(), out_features_gradient.data(), + interpolation, coordinate_mapping, align_corners, + individual_extents, isotropic_extents, normalize); +} +#define INSTANTIATE(TFeat, TOut, TReal, TIndex) \ + template void \ + ContinuousConvTransposeBackpropFilterCUDA( \ + const paddle::Tensor& filters, \ + const paddle::Tensor& out_positions, \ + const paddle::Tensor& out_importance, \ + const paddle::Tensor& extents, const paddle::Tensor& offset, \ + const paddle::Tensor& inp_positions, \ + const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_neighbors_importance_sum, \ + const paddle::Tensor& inp_neighbors_row_splits, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, \ + const paddle::Tensor& out_features_gradient, \ + const bool align_corners, \ + const CoordinateMapping coordinate_mapping, const bool normalize, \ + const InterpolationMode interpolation, \ + const int64_t max_temp_mem_MB, paddle::Tensor& filter_backprop); + +INSTANTIATE(float, float, float, int32_t) diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h new file mode 100644 index 00000000000..25c54049678 --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h @@ -0,0 +1,59 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConvTypes.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +template +void ContinuousConvTransposeBackpropFilterCPU( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& out_importance, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool align_corners, + const open3d::ml::impl::CoordinateMapping coordinate_mapping, + const bool normalize, + const open3d::ml::impl::InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop); + +#ifdef BUILD_CUDA_MODULE +template +void ContinuousConvTransposeBackpropFilterCUDA( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& out_importance, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool align_corners, + const open3d::ml::impl::CoordinateMapping coordinate_mapping, + const bool normalize, + const open3d::ml::impl::InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop); +#endif diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cpp b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cpp new file mode 100644 index 00000000000..5d5c09c986c --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cpp @@ -0,0 +1,80 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConvTranspose.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void ContinuousConvTransposeCPU( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& out_importance, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_index, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool align_corners, + const CoordinateMapping coordinate_mapping, + const bool normalize, + const InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features) { + const bool individual_extents = extents.shape()[0] > 1; + const bool isotropic_extents = extents.shape()[1] == 1; + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + + CConvTransposeComputeFeaturesCPU( + out_features.data(), filter_dims, filters.data(), + out_positions.shape()[0], out_positions.data(), + out_importance.shape()[0] ? out_importance.data() : nullptr, + inp_positions.shape()[0], inp_positions.data(), + inp_features.data(), + inp_neighbors_importance_sum.shape()[0] + ? inp_neighbors_importance_sum.data() + : nullptr, + inp_neighbors_row_splits.data(), + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), extents.data(), + offset.data(), interpolation, coordinate_mapping, + align_corners, individual_extents, isotropic_extents, normalize); +} +#define INSTANTIATE(TFeat, TOut, TReal, TIndex) \ + template void ContinuousConvTransposeCPU( \ + const paddle::Tensor& filters, \ + const paddle::Tensor& out_positions, \ + const paddle::Tensor& out_importance, \ + const paddle::Tensor& extents, const paddle::Tensor& offset, \ + const paddle::Tensor& inp_positions, \ + const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_neighbors_index, \ + const paddle::Tensor& inp_neighbors_importance_sum, \ + const paddle::Tensor& inp_neighbors_row_splits, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, \ + const bool align_corners, \ + const CoordinateMapping coordinate_mapping, const bool normalize, \ + const InterpolationMode interpolation, \ + const int64_t max_temp_mem_MB, paddle::Tensor& out_features); + +INSTANTIATE(float, float, float, int32_t) diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cu b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cu new file mode 100644 index 00000000000..1cf71071b29 --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cu @@ -0,0 +1,120 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConvTranspose.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void ContinuousConvTransposeCUDA( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& out_importance, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_index, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool align_corners, + const CoordinateMapping coordinate_mapping, + const bool normalize, + const InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features) { + const bool individual_extents = extents.shape()[0] > 1; + const bool isotropic_extents = extents.shape()[1] == 1; + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + + auto stream = filters.stream(); + // -1 means current global place + auto cuda_device_props = phi::backends::gpu::GetDeviceProperties(-1); + const int texture_alignment = cuda_device_props.textureAlignment; + + auto place = filters.place(); + + void* temp_ptr = nullptr; + size_t temp_size = 0; + size_t max_temp_size = 0; + + // determine temp_size + CConvTransposeComputeFeaturesCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + out_features.data(), filter_dims, filters.data(), + out_positions.shape()[0], out_positions.data(), + out_importance.shape()[0] ? out_importance.data() : nullptr, + inp_positions.shape()[0], inp_positions.data(), + inp_features.data(), + inp_neighbors_importance_sum.shape()[0] + ? inp_neighbors_importance_sum.data() + : nullptr, + inp_neighbors_row_splits.data(), + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), extents.data(), + offset.data(), interpolation, coordinate_mapping, + align_corners, individual_extents, isotropic_extents, normalize); + + temp_size = std::max( + std::min(static_cast(max_temp_mem_MB) * 1024 * 1024, + max_temp_size), + temp_size); + + auto temp_tensor = CreateTempTensor(temp_size, place, &temp_ptr); + + // actually run the operation + CConvTransposeComputeFeaturesCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + out_features.data(), filter_dims, filters.data(), + out_positions.shape()[0], out_positions.data(), + out_importance.shape()[0] ? out_importance.data() : nullptr, + inp_positions.shape()[0], inp_positions.data(), + inp_features.data(), + inp_neighbors_importance_sum.shape()[0] + ? inp_neighbors_importance_sum.data() + : nullptr, + inp_neighbors_row_splits.data(), + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), extents.data(), + offset.data(), interpolation, coordinate_mapping, + align_corners, individual_extents, isotropic_extents, normalize); +} +#define INSTANTIATE(TFeat, TOut, TReal, TIndex) \ + template void ContinuousConvTransposeCUDA( \ + const paddle::Tensor& filters, \ + const paddle::Tensor& out_positions, \ + const paddle::Tensor& out_importance, \ + const paddle::Tensor& extents, const paddle::Tensor& offset, \ + const paddle::Tensor& inp_positions, \ + const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_neighbors_index, \ + const paddle::Tensor& inp_neighbors_importance_sum, \ + const paddle::Tensor& inp_neighbors_row_splits, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, \ + const bool align_corners, \ + const CoordinateMapping coordinate_mapping, const bool normalize, \ + const InterpolationMode interpolation, \ + const int64_t max_temp_mem_MB, paddle::Tensor& out_features); + +INSTANTIATE(float, float, float, int32_t) diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.h b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.h new file mode 100644 index 00000000000..76ba572b7e4 --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.h @@ -0,0 +1,59 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include + +#include "open3d/ml/impl/continuous_conv/ContinuousConvTypes.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +template +void ContinuousConvTransposeCPU( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& out_importance, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_index, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool align_corners, + const open3d::ml::impl::CoordinateMapping coordinate_mapping, + const bool normalize, + const open3d::ml::impl::InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features); + +#ifdef BUILD_CUDA_MODULE +template +void ContinuousConvTransposeCUDA( + const paddle::Tensor& filters, + const paddle::Tensor& out_positions, + const paddle::Tensor& out_importance, + const paddle::Tensor& extents, + const paddle::Tensor& offset, + const paddle::Tensor& inp_positions, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_index, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool align_corners, + const open3d::ml::impl::CoordinateMapping coordinate_mapping, + const bool normalize, + const open3d::ml::impl::InterpolationMode interpolation, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features); +#endif diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOps.cpp b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOps.cpp new file mode 100644 index 00000000000..913a41a67a2 --- /dev/null +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOps.cpp @@ -0,0 +1,258 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/continuous_conv/ContinuousConvHelper.h" +#include "open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.h" +#include "open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h" +#include "open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.h" +#include "open3d/ml/paddle/misc/InvertNeighborsListOps.h" +#include "open3d/ml/paddle/misc/ReduceSubarraysSumOps.h" + +using namespace open3d::ml::impl; + +std::vector ContinuousConvTransposeForward( + paddle::Tensor& filters, + paddle::Tensor& out_positions, + paddle::Tensor& out_importance, + paddle::Tensor& extents, + paddle::Tensor& offset, + paddle::Tensor& inp_positions, + paddle::Tensor& inp_features, + paddle::Tensor& inp_neighbors_index, + paddle::Tensor& inp_neighbors_importance_sum, + paddle::Tensor& inp_neighbors_row_splits, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_importance, + paddle::Tensor& neighbors_row_splits, + const bool align_corners, + const std::string& coordinate_mapping_str, + const bool normalize, + const std::string& interpolation_str, + const int64_t max_temp_mem_MB) { + CoordinateMapping coordinate_mapping = + ParseCoordinateMappingStr(coordinate_mapping_str); + + InterpolationMode interpolation = ParseInterpolationStr(interpolation_str); + + CHECK_TYPE(neighbors_row_splits, paddle::DataType::INT64); + CHECK_TYPE(inp_neighbors_row_splits, paddle::DataType::INT64); + CHECK_SAME_DTYPE(neighbors_index, inp_neighbors_index); + CHECK_SAME_DTYPE(filters, out_positions, extents, offset, inp_positions, + inp_features, out_importance, neighbors_importance); + CHECK_SAME_DEVICE_TYPE(filters, out_positions, inp_positions, inp_features, + out_importance); + + // check input shapes + using namespace open3d::ml::op_util; + Dim kernel_depth("kernel_depth"); + Dim kernel_height("kernel_height"); + Dim kernel_width("kernel_width"); + Dim out_channels("out_channels"); + Dim in_channels("in_channels"); + Dim num_out_points("num_out_points"); + Dim num_inp_points("num_inp_points"); + Dim num_neighbors("nun_neighbors"); + + CHECK_SHAPE(filters, kernel_depth, kernel_height, kernel_width, in_channels, + out_channels); + CHECK_SHAPE(out_positions, num_out_points, 3); + CHECK_SHAPE(inp_positions, num_inp_points, 3); + CHECK_SHAPE(extents, num_inp_points || 1, Dim(3) || 1); + CHECK_SHAPE(offset, 3); + CHECK_SHAPE(inp_features, num_inp_points, in_channels); + CHECK_SHAPE(out_importance, num_out_points || 0); + CHECK_SHAPE(inp_neighbors_index, num_neighbors); + CHECK_SHAPE(inp_neighbors_importance_sum, num_inp_points || 0); + CHECK_SHAPE(inp_neighbors_row_splits, num_inp_points + 1); + CHECK_SHAPE(neighbors_index, num_neighbors); + CHECK_SHAPE(neighbors_importance, num_neighbors || 0); + CHECK_SHAPE(neighbors_row_splits, num_out_points + 1); + + // make sure that these are on the same place as the filters, positions + // and feats + auto place = inp_features.place(); + offset = offset.copy_to(place, false); + extents = extents.copy_to(place, false); + neighbors_index = neighbors_index.copy_to(place, false); + neighbors_importance = neighbors_importance.copy_to(place, false); + neighbors_row_splits = neighbors_row_splits.copy_to(place, false); + inp_neighbors_index = inp_neighbors_index.copy_to(place, false); + inp_neighbors_importance_sum = + inp_neighbors_importance_sum.copy_to(place, false); + inp_neighbors_row_splits = inp_neighbors_row_splits.copy_to(place, false); + + const auto& feat_dtype = filters.dtype(); + const auto& real_dtype = inp_positions.dtype(); + const auto& index_dtype = neighbors_index.dtype(); + + paddle::Tensor out_features = paddle::empty( + {num_out_points.value(), out_channels.value()}, real_dtype, place); +#define FN_PARAMETERS \ + filters, out_positions, out_importance, extents, offset, inp_positions, \ + inp_features, inp_neighbors_index, inp_neighbors_importance_sum, \ + inp_neighbors_row_splits, neighbors_index, neighbors_importance, \ + neighbors_row_splits, align_corners, coordinate_mapping, \ + normalize, interpolation, max_temp_mem_MB, out_features + +#define CALL(feat_t, out_t, real_t, index_t, fn) \ + if (ComparePaddleDtype(feat_dtype) && \ + ComparePaddleDtype(real_dtype) && \ + ComparePaddleDtype(index_dtype)) { \ + fn(FN_PARAMETERS); \ + return {out_features}; \ + } + + if (inp_features.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + CALL(float, float, float, int32_t, ::ContinuousConvTransposeCUDA) +#else + PD_CHECK(false, + "ContinuousConvTranspose was not compiled with CUDA " + "support"); +#endif + } else { + CALL(float, float, float, int32_t, ::ContinuousConvTransposeCPU) + } +#undef FN_PARAMETERS +#undef CALL + + PD_CHECK(false, "ContinuousConv does not support " + + phi::DataTypeToString(inp_features.dtype()) + + " as input for inp_features and " + + phi::DataTypeToString(neighbors_index.dtype()) + + " as input for neighbors_index"); + return {paddle::Tensor()}; +} + +std::vector ContinuousConvTransposeBackward( + paddle::Tensor& filters, + paddle::Tensor& out_positions, + paddle::Tensor& out_importance, + paddle::Tensor& extents, + paddle::Tensor& offset, + paddle::Tensor& inp_positions, + paddle::Tensor& inp_features, + paddle::Tensor& inp_neighbors_importance_sum, + paddle::Tensor& inp_neighbors_row_splits, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_importance, + paddle::Tensor& neighbors_row_splits, + paddle::Tensor& out_features_gradient, + const bool align_corners, + const std::string& coordinate_mapping_str, + const bool normalize, + const std::string& interpolation_str, + const int64_t max_temp_mem_MB) { + CoordinateMapping coordinate_mapping = + ParseCoordinateMappingStr(coordinate_mapping_str); + + InterpolationMode interpolation = ParseInterpolationStr(interpolation_str); + + auto place = inp_features.place(); + const auto& feat_dtype = filters.dtype(); + const auto& real_dtype = inp_features.dtype(); + const auto& index_dtype = neighbors_index.dtype(); + CHECK_SAME_DTYPE(out_features_gradient, inp_features, filters); + CHECK_SAME_DEVICE_TYPE(out_features_gradient, inp_features, filters); + + // output vars + paddle::Tensor filters_backprop; + paddle::Tensor inp_features_backprop; + +#define CALL(feat_t, out_t, real_t, index_t, fn_suffix) \ + if (ComparePaddleDtype(feat_dtype) && \ + ComparePaddleDtype(real_dtype) && \ + ComparePaddleDtype(index_dtype)) { \ + filters_backprop = paddle::empty(filters.shape(), real_dtype, place); \ + ContinuousConvTransposeBackpropFilter##fn_suffix( \ + filters, out_positions, out_importance, extents, offset, \ + inp_positions, inp_features, inp_neighbors_importance_sum, \ + inp_neighbors_row_splits, neighbors_index, \ + neighbors_importance, neighbors_row_splits, \ + out_features_gradient, align_corners, coordinate_mapping, \ + normalize, interpolation, max_temp_mem_MB, filters_backprop); \ + \ + paddle::Tensor inv_neighbors_index, inv_neighbors_row_splits, \ + inv_neighbors_importance; \ + auto inv = InvertNeighborsList(neighbors_index, neighbors_row_splits, \ + neighbors_importance, \ + inp_positions.shape()[0]); \ + inv_neighbors_index = inv[0]; \ + inv_neighbors_row_splits = inv[1]; \ + inv_neighbors_importance = inv[2]; \ + InvertNeighborsList(neighbors_index, neighbors_row_splits, \ + neighbors_importance, inp_positions.shape()[0]); \ + inp_features_backprop = \ + paddle::ones(inp_features.shape(), real_dtype, place); \ + auto filters_transposed = Transpose(filters, 3, 4).contiguous(); \ + \ + ContinuousConv##fn_suffix( \ + filters_transposed, inp_positions, extents, offset, \ + out_positions, out_features_gradient, out_importance, \ + inv_neighbors_index, inv_neighbors_importance, \ + inp_neighbors_row_splits, align_corners, coordinate_mapping, \ + normalize, interpolation, max_temp_mem_MB, \ + inp_features_backprop); \ + dispatch_success = true; \ + } + + bool dispatch_success = false; + if (inp_features.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + CALL(float, float, float, int32_t, CUDA) +#else + PD_CHECK(false, + "ContinuousConvTranspose backward was not compiled " + "with CUDA support"); +#endif + } else { + CALL(float, float, float, int32_t, CPU) + } + PD_CHECK(dispatch_success, + "ContinuousConvTranspose backward does not support " + + phi::DataTypeToString(inp_features.dtype()) + + " as input for inp_features and " + + phi::DataTypeToString(neighbors_index.dtype()) + + " as input for neighbors_index"); + + return {filters_backprop, inp_features_backprop}; +} + +std::vector ContinuousConvTransposeInferDtype( + paddle::DataType inp_positions_dtype) { + return {inp_positions_dtype}; +} + +PD_BUILD_OP(open3d_continuous_conv_transpose) + .Inputs({"filters", "out_positions", "out_importance", "extents", + "offset", "inp_positions", "inp_features", + "inp_neighbors_index", "inp_neighbors_importance_sum", + "inp_neighbors_row_splits", "neighbors_index", + "neighbors_importance", "neighbors_row_splits"}) + .Outputs({"out_features"}) + .Attrs({"align_corners:bool", "coordinate_mapping:std::string", + "normalize:bool", "interpolation:std::string", + "max_temp_mem_MB:int64_t"}) + .SetKernelFn(PD_KERNEL(ContinuousConvTransposeForward)) + .SetInferDtypeFn(PD_INFER_DTYPE(ContinuousConvTransposeInferDtype)); + +PD_BUILD_GRAD_OP(open3d_continuous_conv_transpose) + .Inputs({"filters", "out_positions", "out_importance", "extents", + "offset", "inp_positions", "inp_features", + "inp_neighbors_importance_sum", "inp_neighbors_row_splits", + "neighbors_index", "neighbors_importance", + "neighbors_row_splits", paddle::Grad("out_features")}) + .Outputs({paddle::Grad("filters"), paddle::Grad("inp_features")}) + .Attrs({"align_corners:bool", "coordinate_mapping:std::string", + "normalize:bool", "interpolation:std::string", + "max_temp_mem_MB:int64_t"}) + .SetKernelFn(PD_KERNEL(ContinuousConvTransposeBackward)); diff --git a/python/open3d/ml/paddle/python/layers/convolutions.py b/python/open3d/ml/paddle/python/layers/convolutions.py new file mode 100644 index 00000000000..302a90f1bb0 --- /dev/null +++ b/python/open3d/ml/paddle/python/layers/convolutions.py @@ -0,0 +1,296 @@ +# ---------------------------------------------------------------------------- +# - Open3D: www.open3d.org - +# ---------------------------------------------------------------------------- +# Copyright (c) 2018-2023 www.open3d.org +# SPDX-License-Identifier: MIT +# ---------------------------------------------------------------------------- + +from ...python import ops +from ....paddle import classes +from .neighbor_search import FixedRadiusSearch, RadiusSearch +import paddle +from paddle import create_parameter +import numpy as np + +__all__ = ['ContinuousConv'] + + +class ContinuousConv(paddle.nn.Layer): + r"""Continuous Convolution. + + This convolution supports continuous input and output point positions. + This layer implements the convolution defined in + + *B. Ummenhofer and V. Koltun, Lagrangian Fluid Simulation with Continuous Convolutions, ICLR 2020.* + + The convolution at position :math:`\mathbf x` is defined as + + .. math:: + (f*g)(\mathbf x) = \frac{1}{\psi(\mathbf x)} \sum_{i \in \mathcal N(\mathbf x, R)} a(\mathbf x_i, \mathbf x)\; f_i\; g(\Lambda(\mathbf x_i - \mathbf x)). + + With :math:`f` as the input feature function and :math:`g` as the filter function. + The input points are :math:`\mathbf x_i` and the input features are :math:`f_i`. + The normalization :math:`\frac{1}{\psi(\mathbf x)}` can be turned on with the **normalize** parameter. + The per neighbor value :math:`a(\mathbf x_i, \mathbf x)` can be used to implement window functions; see parameter **window_function**. + The function :math:`\Lambda` for looking up filter values is defined by the parameters **coordinate_mapping** and **interpolation**. + + Example: + This shows a minimal example of how to use the layer:: + + import paddle + import open3d.ml.paddle as ml3d + + inp_positions = paddle.randn([20, 3]) + inp_features = paddle.randn([20, 8]) + out_positions = paddle.randn([10, 3]) + + conv = ml3d.layers.ContinuousConv(in_channels=8, filters=16, kernel_size=[3,3,3]) + out_features = conv(inp_features, inp_positions, out_positions, extents=2.0) + + + Arguments: + in_channels: The number of input channels. + + filters: The number of filters/output channels. + + kernel_size: The spatial resolution of the filter, e.g. [3,3,3]. + + activation: The activation function to use. None means no activation. + + use_bias: If True adds an additive bias vector. + + kernel_initializer: Initializer for the kernel weights. + + bias_initializer: Initializer for the bias vector. + + align_corners: If true then the voxel centers of the outer voxels of the + filter array are mapped to the boundary of the filter shape. + If false then the boundary of the filter array is mapped to the + boundary of the filter shape. + + coordinate_mapping: The mapping that is applied to the input coordinates. + One of 'ball_to_cube_radial', 'ball_to_cube_volume_preserving', + 'identity'. + + * 'ball_to_cube_radial' uses radial stretching to map a sphere to + a cube. + * 'ball_to_cube_volume_preserving' is using a more expensive volume + preserving mapping to map a sphere to a cube. + * 'identity' no mapping is applied to the coordinates. + + interpolation: One of 'linear', 'linear_border', 'nearest_neighbor'. + * 'linear' is trilinear interpolation with coordinate clamping. + * 'linear_border' uses a zero border if outside the range. + * 'nearest_neighbor' uses the nearest neighbor instead of interpolation. + + normalize: If true then the result is normalized either by the number of + points (neighbors_importance is null) or by the sum of the respective + values in neighbors_importance. + + radius_search_ignore_query_points: If true the points that coincide with the + center of the search window will be ignored. This excludes the query point + if 'queries' and 'points' are the same point cloud. + + radius_search_metric: Either L1, L2 or Linf. Default is L2 + + offset: A single 3D vector used in the filter coordinate computation. + The shape is [3]. + + window_function: Optional radial window function to steer the importance of + points based on their distance to the center. The input to the function + is a 1D tensor of distances (squared distances if radius_search_metric is + 'L2'). The output must be a tensor of the same shape. Example:: + + def window_fn(r_sqr): + return paddle.clamp((1-r_sqr)**3, 0, 1) + + use_dense_layer_for_center: If True a linear dense layer is used to + process the input features for each point. The result is added to the + result of the convolution before adding the bias. This option is + useful when using even kernel sizes that have no center element and + input and output point sets are the same and + 'radius_search_ignore_query_points' has been set to True. + + dense_kernel_initializer: Initializer for the kernel weights of the + linear layer used for the center if 'use_dense_layer_for_center' + is True. + """ + + def __init__(self, + in_channels, + filters, + kernel_size, + activation=None, + use_bias=True, + kernel_initializer=paddle.nn.initializer.Uniform(-0.05, 0.05), + bias_initializer=paddle.nn.initializer.Constant(), + align_corners=True, + coordinate_mapping='ball_to_cube_radial', + interpolation='linear', + normalize=True, + radius_search_ignore_query_points=False, + radius_search_metric='L2', + offset=None, + window_function=None, + use_dense_layer_for_center=False, + dense_kernel_initializer=paddle.nn.initializer.XavierUniform(), + **kwargs): + super().__init__() + + self.in_channels = in_channels + self.filters = filters + self.kernel_size = kernel_size + self.activation = activation + self.use_bias = use_bias + self.kernel_initializer = kernel_initializer + self.bias_initializer = bias_initializer + self.align_corners = align_corners + self.coordinate_mapping = coordinate_mapping + self.interpolation = interpolation + self.normalize = normalize + self.radius_search_ignore_query_points = radius_search_ignore_query_points + self.radius_search_metric = radius_search_metric + self.dense_kernel_initializer = dense_kernel_initializer + + if offset is None: + offset = paddle.zeros(shape=(3,), dtype=paddle.float32) + self.register_buffer('offset', offset) + + self.window_function = window_function + + self.fixed_radius_search = FixedRadiusSearch( + metric=self.radius_search_metric, + ignore_query_point=self.radius_search_ignore_query_points, + return_distances=not self.window_function is None) + + self.radius_search = RadiusSearch( + metric=self.radius_search_metric, + ignore_query_point=self.radius_search_ignore_query_points, + return_distances=not self.window_function is None, + normalize_distances=not self.window_function is None) + + self.use_dense_layer_for_center = use_dense_layer_for_center + if self.use_dense_layer_for_center: + self.dense = paddle.nn.Linear(self.in_channels, + self.filters, + bias=False) + self.dense_kernel_initializer(self.dense.weight) + + kernel_shape = (*self.kernel_size, self.in_channels, self.filters) + # self.kernel = paddle.nn.Parameter(data=paddle.Tensor(*kernel_shape), + # requires_grad=True) + self.kernel = create_parameter( + kernel_shape, + dtype=paddle.float32, + default_initializer=self.kernel_initializer) + + if self.use_bias: + self.bias = create_parameter((self.filters,), + dtype=paddle.float32, + is_bias=True, + default_initializer=bias_initializer) + + def forward(self, + inp_features, + inp_positions, + out_positions, + extents, + inp_importance=None, + fixed_radius_search_hash_table=None, + user_neighbors_index=None, + user_neighbors_row_splits=None, + user_neighbors_importance=None): + offset = self.offset + if isinstance(extents, (float, int)): + extents = paddle.to_tensor(extents, dtype=inp_positions.dtype) + + if inp_importance is None: + inp_importance = paddle.empty( + (0,), dtype=paddle.float32).to(self.kernel.place) + + return_distances = not self.window_function is None + + if not user_neighbors_index is None and not user_neighbors_row_splits is None: + + if user_neighbors_importance is None: + neighbors_importance = paddle.empty( + (0,), dtype=paddle.float32).to(self.kernel.place) + else: + neighbors_importance = user_neighbors_importance + + neighbors_index = user_neighbors_index + neighbors_row_splits = user_neighbors_row_splits + + else: + if len(extents.shape) == 0: + radius = 0.5 * extents + self.nns = self.fixed_radius_search( + inp_positions, + queries=out_positions, + radius=radius, + hash_table=fixed_radius_search_hash_table) + if return_distances: + if self.radius_search_metric == 'L2': + neighbors_distance_normalized = self.nns.neighbors_distance / ( + radius * radius) + else: # L1 + neighbors_distance_normalized = self.nns.neighbors_distance / radius + + elif len(extents.shape) == 1: + radii = 0.5 * extents + self.nns = self.radius_search(inp_positions, + queries=out_positions, + radii=radii) + + else: + raise ValueError("extents rank must be 0 or 1") + + if self.window_function is None: + neighbors_importance = paddle.empty((0,), dtype=paddle.float32) + else: + neighbors_importance = self.window_function( + neighbors_distance_normalized) + + neighbors_index = self.nns.neighbors_index + neighbors_row_splits = self.nns.neighbors_row_splits + + # for stats and debugging + num_pairs = neighbors_index.shape[0] + self._avg_neighbors = num_pairs / out_positions.shape[0] + + extents_rank2 = extents + while len(extents_rank2.shape) < 2: + extents_rank2 = paddle.unsqueeze(extents_rank2, axis=-1) + + self._conv_values = { + 'filters': self.kernel, + 'out_positions': out_positions, + 'extents': extents_rank2, + 'offset': offset, + 'inp_positions': inp_positions, + 'inp_features': inp_features, + 'inp_importance': inp_importance, + 'neighbors_index': neighbors_index, + 'neighbors_row_splits': neighbors_row_splits, + 'neighbors_importance': neighbors_importance, + 'align_corners': self.align_corners, + 'coordinate_mapping': self.coordinate_mapping, + 'interpolation': self.interpolation, + 'normalize': self.normalize, + 'max_temp_mem_mb': 64 + } + + out_features = ops.continuous_conv(**self._conv_values) + + self._conv_output = out_features + + if self.use_dense_layer_for_center: + self._dense_output = self.dense(inp_features) + out_features = out_features + self._dense_output + + if self.use_bias: + out_features += self.bias + if not self.activation is None: + out_features = self.activation(out_features) + + return out_features diff --git a/python/test/ml_ops/mltest.py b/python/test/ml_ops/mltest.py index 2cce40716be..92996b85618 100644 --- a/python/test/ml_ops/mltest.py +++ b/python/test/ml_ops/mltest.py @@ -165,7 +165,9 @@ def run_op(ml, device_name, check_device, fn, *args, **kwargs): assert tensor_on_device elif ml.module.__name__ == 'paddle': _args = [to_paddle(x, device_name) for x in args] - _kwargs = {k: to_paddle(v, device_name) for k, v in kwargs.items()} + _kwargs = { + k.lower(): to_paddle(v, device_name) for k, v in kwargs.items() + } ans = fn(*_args, **_kwargs) @@ -249,7 +251,7 @@ def run_op_grad(ml, device_name, check_device, fn, x, y_attr_name, x_var.stop_gradient = False _args = [x_var if a is x else to_paddle(a, device_name) for a in args] _kwargs = { - k: x_var if a is x else to_paddle(a, device_name) + k.lower(): x_var if a is x else to_paddle(a, device_name) for k, a in kwargs.items() } @@ -310,19 +312,19 @@ def set_deterministic(self, deterministic): else: raise Exception('Unsupported ml framework') - def random_uniform(self, shape, dtype, minval=0, maxval=1): + def random_uniform(self, size, dtype, minval=0, maxval=1): if isinstance(dtype, str): dtype = self.get_dtype(dtype) if self.module.__name__ == 'tensorflow': - return self.module.random.uniform(shape=shape, + return self.module.random.uniform(shape=size, dtype=dtype, minval=minval, maxval=maxval) elif self.module.__name__ == 'torch': - ans = self.module.empty(size=shape, dtype=dtype) + ans = self.module.empty(size=size, dtype=dtype) return ans.uniform_(minval, maxval) elif self.module.__name__ == 'paddle': - ans = self.module.empty(shape=shape, dtype=dtype) + ans = self.module.empty(shape=size, dtype=dtype) return ans.uniform_(minval, maxval) else: raise Exception('Unsupported ml framework') diff --git a/python/test/ml_ops/test_cconv.py b/python/test/ml_ops/test_cconv.py index 891498b69d0..72bd14d8f2b 100644 --- a/python/test/ml_ops/test_cconv.py +++ b/python/test/ml_ops/test_cconv.py @@ -183,6 +183,7 @@ def test_cconv_gradient(ml, dtype, filter_size, out_channels, in_channels, 'coordinate_mapping': coordinate_mapping, 'normalize': with_normalization, 'interpolation': interpolation, + 'max_temp_mem_MB': 64 } filters = np.random.random(size=(*filter_size, in_channels, @@ -223,9 +224,14 @@ def test_cconv_gradient(ml, dtype, filter_size, out_channels, in_channels, neighbors_importance_sum = np.empty((0,), dtype=dtype) inverted_neighbors_index, inverted_neighbors_row_splits, inverted_neighbors_importance = mltest.run_op( - ml, ml.device, False, ml.ops.invert_neighbors_list, - inp_positions.shape[0], neighbors_index, neighbors_row_splits, - neighbors_importance) + ml, + ml.device, + False, + ml.ops.invert_neighbors_list, + num_points=inp_positions.shape[0], + inp_neighbors_index=neighbors_index, + inp_neighbors_row_splits=neighbors_row_splits, + inp_neighbors_attributes=neighbors_importance) # print(neighbors_row_splits, inverted_neighbors_row_splits) # print(neighbors_index, inverted_neighbors_index) diff --git a/python/test/ml_ops/test_voxel_pooling.py b/python/test/ml_ops/test_voxel_pooling.py index 90426acef93..f1932c0320b 100644 --- a/python/test/ml_ops/test_voxel_pooling.py +++ b/python/test/ml_ops/test_voxel_pooling.py @@ -57,8 +57,16 @@ def test_voxel_pooling(ml, pos_dtype, feat_dtype, position_fn, feature_fn): # yapf: enable voxel_size = 1 - ans = mltest.run_op(ml, ml.device, True, ml.ops.voxel_pooling, points, - features, voxel_size, position_fn, feature_fn) + ans = mltest.run_op(ml, + ml.device, + True, + ml.ops.voxel_pooling, + positions=points, + features=features, + voxel_size=voxel_size, + position_fn=position_fn, + feature_fn=feature_fn, + debug=False) if position_fn == 'average': expected_positions = np.stack( @@ -113,8 +121,16 @@ def test_voxel_pooling_empty_point_set(ml, pos_dtype, feat_dtype, position_fn, features = np.zeros(shape=[0, 5], dtype=feat_dtype) voxel_size = 1 - ans = mltest.run_op(ml, ml.device, True, ml.ops.voxel_pooling, points, - features, voxel_size, position_fn, feature_fn) + ans = mltest.run_op(ml, + ml.device, + True, + ml.ops.voxel_pooling, + positions=points, + features=features, + voxel_size=voxel_size, + position_fn=position_fn, + feature_fn=feature_fn, + debug=False) np.testing.assert_array_equal(points, ans.pooled_positions) np.testing.assert_array_equal(features, ans.pooled_features) @@ -150,16 +166,32 @@ def test_voxel_pooling_grad(ml, pos_dtype, feat_dtype, position_fn, feature_fn, voxel_size = 0.25 def fn(features): - ans = mltest.run_op(ml, ml.device, True, ml.ops.voxel_pooling, - positions, features, voxel_size, position_fn, - feature_fn) + ans = mltest.run_op(ml, + ml.device, + True, + ml.ops.voxel_pooling, + positions=positions, + features=features, + voxel_size=voxel_size, + position_fn=position_fn, + feature_fn=feature_fn, + debug=False) return ans.pooled_features def fn_grad(features_bp, features): - return mltest.run_op_grad(ml, ml.device, True, ml.ops.voxel_pooling, - features, 'pooled_features', features_bp, - positions, features, voxel_size, position_fn, - feature_fn) + return mltest.run_op_grad(ml, + ml.device, + True, + ml.ops.voxel_pooling, + features, + 'pooled_features', + features_bp, + positions=positions, + features=features, + voxel_size=voxel_size, + position_fn=position_fn, + feature_fn=feature_fn, + debug=False) gradient_OK = check_gradients(features, fn, fn_grad, epsilon=1) assert gradient_OK From fea60e99ba426f193c080d7b1508a19f313d5908 Mon Sep 17 00:00:00 2001 From: RDIO <35186529+Woodman3@users.noreply.github.com> Date: Mon, 11 Nov 2024 16:28:04 +0800 Subject: [PATCH 09/19] [Feat] Add SparseConv and SparseConvTranspose operators (#7) * [Feat] add sconv_op * [Fix] include sstream * [doc] add comment --------- Signed-off-by: Woodman3 <1025760745@qq.com> --- cpp/open3d/ml/paddle/CMakeLists.txt | 16 + .../SparseConvBackpropFilterOpKernel.cpp | 56 +++ .../SparseConvBackpropFilterOpKernel.cu | 94 ++++ .../SparseConvBackpropFilterOpKernel.h | 40 ++ .../paddle/sparse_conv/SparseConvOpKernel.cpp | 52 +++ .../paddle/sparse_conv/SparseConvOpKernel.cu | 87 ++++ .../paddle/sparse_conv/SparseConvOpKernel.h | 38 ++ .../ml/paddle/sparse_conv/SparseConvOps.cpp | 212 +++++++++ ...rseConvTransposeBackpropFilterOpKernel.cpp | 66 +++ ...arseConvTransposeBackpropFilterOpKernel.cu | 106 +++++ ...parseConvTransposeBackpropFilterOpKernel.h | 46 ++ .../SparseConvTransposeOpKernel.cpp | 62 +++ .../SparseConvTransposeOpKernel.cu | 100 +++++ .../sparse_conv/SparseConvTransposeOpKernel.h | 42 ++ .../sparse_conv/SparseConvTransposeOps.cpp | 224 ++++++++++ .../ml/paddle/python/layers/convolutions.py | 407 +++++++++++++++++- python/test/ml_ops/test_general_sparseconv.py | 14 +- python/test/ml_ops/test_sparseconv.py | 14 + 18 files changed, 1670 insertions(+), 6 deletions(-) create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.h create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.h create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvOps.cpp create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cpp create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cu create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.h create mode 100644 cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOps.cpp diff --git a/cpp/open3d/ml/paddle/CMakeLists.txt b/cpp/open3d/ml/paddle/CMakeLists.txt index 34d7f1842ee..1652c3acd70 100644 --- a/cpp/open3d/ml/paddle/CMakeLists.txt +++ b/cpp/open3d/ml/paddle/CMakeLists.txt @@ -52,6 +52,15 @@ target_sources(open3d_paddle_ops PRIVATE continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp ) +target_sources(open3d_paddle_ops PRIVATE + sparse_conv/SparseConvBackpropFilterOpKernel.cpp + sparse_conv/SparseConvOpKernel.cpp + sparse_conv/SparseConvOps.cpp + sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp + sparse_conv/SparseConvTransposeOpKernel.cpp + sparse_conv/SparseConvTransposeOps.cpp +) + target_sources(open3d_paddle_ops PRIVATE ../contrib/Nms.cpp ) @@ -78,6 +87,12 @@ if (BUILD_CUDA_MODULE) continuous_conv/ContinuousConvTransposeOpKernel.cu continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu ) + target_sources(open3d_paddle_ops PRIVATE + sparse_conv/SparseConvBackpropFilterOpKernel.cu + sparse_conv/SparseConvOpKernel.cu + sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu + sparse_conv/SparseConvTransposeOpKernel.cu + ) target_sources(open3d_paddle_ops PRIVATE ../contrib/BallQuery.cu ../contrib/InterpolatePoints.cu @@ -87,6 +102,7 @@ if (BUILD_CUDA_MODULE) target_sources(open3d_paddle_ops PRIVATE ../impl/continuous_conv/ContinuousConvCUDAKernels.cu + ../impl/sparse_conv/SparseConvCUDAKernels.cu ) endif() diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cpp b/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cpp new file mode 100644 index 00000000000..e37fbb61d79 --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cpp @@ -0,0 +1,56 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/impl/sparse_conv/SparseConvBackpropFilter.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void SparseConvBackpropFilterCPU(const paddle::Tensor& filters, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop) { + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + SparseConvBackpropFilterCPU( + filter_backprop.data(), filter_dims, + neighbors_row_splits.shape()[0] - 1, inp_features.shape()[0], + inp_features.data(), + inp_importance.shape()[0] ? inp_importance.data() : nullptr, + neighbors_index.data(), + neighbors_kernel_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), + out_features_gradient.data(), normalize); +} +#define INSTANTIATE(TFeat, TOut, TIndex, TKernelIndex) \ + template void \ + SparseConvBackpropFilterCPU( \ + const paddle::Tensor& filters, const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_importance, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_kernel_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, \ + const paddle::Tensor& out_features_gradient, const bool normalize, \ + const int64_t max_temp_mem_MB, paddle::Tensor& filter_backprop); + +INSTANTIATE(float, float, int32_t, uint8_t) diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cu b/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cu new file mode 100644 index 00000000000..237fa8242de --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cu @@ -0,0 +1,94 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include +#include + +#include "open3d/ml/impl/sparse_conv/SparseConvBackpropFilter.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void SparseConvBackpropFilterCUDA(const paddle::Tensor& filters, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop) { + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + + auto stream = filters.stream(); + // -1 means current global place + auto cuda_device_props = phi::backends::gpu::GetDeviceProperties(-1); + const int texture_alignment = cuda_device_props.textureAlignment; + + auto place = filters.place(); + + void* temp_ptr = nullptr; + size_t temp_size = 0; + size_t max_temp_size = 0; + + // determine temp_size + SparseConvBackpropFilterCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + filter_backprop.data(), filter_dims, + neighbors_row_splits.shape()[0] - 1, inp_features.shape()[0], + inp_features.data(), + inp_importance.shape()[0] ? inp_importance.data() : nullptr, + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_kernel_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), + out_features_gradient.data(), normalize); + + temp_size = std::max( + std::min(static_cast(max_temp_mem_MB) * 1024 * 1024, + max_temp_size), + temp_size); + + auto temp_tensor = CreateTempTensor(temp_size, place, &temp_ptr); + + // actually run the operation + SparseConvBackpropFilterCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + filter_backprop.data(), filter_dims, + neighbors_row_splits.shape()[0] - 1, inp_features.shape()[0], + inp_features.data(), + inp_importance.shape()[0] ? inp_importance.data() : nullptr, + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_kernel_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), + out_features_gradient.data(), normalize); +} +#define INSTANTIATE(TFeat, TOut, TIndex, TKernelIndex) \ + template void \ + SparseConvBackpropFilterCUDA( \ + const paddle::Tensor& filters, const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_importance, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_kernel_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, \ + const paddle::Tensor& out_features_gradient, const bool normalize, \ + const int64_t max_temp_mem_MB, paddle::Tensor& filter_backprop); + +INSTANTIATE(float, float, int32_t, uint8_t) diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.h b/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.h new file mode 100644 index 00000000000..82bd824aafa --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.h @@ -0,0 +1,40 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" + +template +void SparseConvBackpropFilterCPU(const paddle::Tensor& filters, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop); + +#ifdef BUILD_CUDA_MODULE +template +void SparseConvBackpropFilterCUDA(const paddle::Tensor& filters, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop); +#endif diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cpp b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cpp new file mode 100644 index 00000000000..f55939be66e --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cpp @@ -0,0 +1,52 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/impl/sparse_conv/SparseConv.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void SparseConvCPU(const paddle::Tensor& filters, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features) { + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + SparseConvComputeFeaturesCPU( + out_features.data(), filter_dims, filters.data(), + neighbors_row_splits.shape()[0] - 1, inp_features.shape()[0], + inp_features.data(), + inp_importance.shape()[0] ? inp_importance.data() : nullptr, + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_kernel_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), normalize); +} +#define INSTANTIATE(TFeat, TOut, TIndex, TKernelIndex) \ + template void SparseConvCPU( \ + const paddle::Tensor& filters, const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_importance, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_kernel_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, const bool normalize, \ + const int64_t max_temp_mem_MB, paddle::Tensor& out_features); + +INSTANTIATE(float, float, int32_t, uint8_t) diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cu b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cu new file mode 100644 index 00000000000..95a52683887 --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cu @@ -0,0 +1,87 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include +#include + +#include "open3d/ml/impl/sparse_conv/SparseConv.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void SparseConvCUDA(const paddle::Tensor& filters, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features) { + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + + auto stream = filters.stream(); + // -1 means current global place + auto cuda_device_props = phi::backends::gpu::GetDeviceProperties(-1); + const int texture_alignment = cuda_device_props.textureAlignment; + + auto place = filters.place(); + + void* temp_ptr = nullptr; + size_t temp_size = 0; + size_t max_temp_size = 0; + + // determine temp_size + SparseConvComputeFeaturesCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + out_features.data(), filter_dims, filters.data(), + neighbors_row_splits.shape()[0] - 1, inp_features.shape()[0], + inp_features.data(), + inp_importance.shape()[0] ? inp_importance.data() : nullptr, + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_kernel_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), normalize); + + temp_size = std::max( + std::min(static_cast(max_temp_mem_MB) * 1024 * 1024, + max_temp_size), + temp_size); + + auto temp_tensor = CreateTempTensor(temp_size, place, &temp_ptr); + + // actually run the operation + SparseConvComputeFeaturesCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + out_features.data(), filter_dims, filters.data(), + neighbors_row_splits.shape()[0] - 1, inp_features.shape()[0], + inp_features.data(), + inp_importance.shape()[0] ? inp_importance.data() : nullptr, + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_kernel_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), normalize); +} +#define INSTANTIATE(TFeat, TOut, TReal, TIndex) \ + template void SparseConvCUDA( \ + const paddle::Tensor& filters, const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_importance, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_kernel_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, const bool normalize, \ + const int64_t max_temp_mem_MB, paddle::Tensor& out_features); + +INSTANTIATE(float, float, int32_t, uint8_t) diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.h b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.h new file mode 100644 index 00000000000..942ce8bc89c --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.h @@ -0,0 +1,38 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" + +template +void SparseConvCPU(const paddle::Tensor& filters, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features); + +#ifdef BUILD_CUDA_MODULE +template +void SparseConvCUDA(const paddle::Tensor& filters, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_importance, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features); +#endif diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvOps.cpp b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOps.cpp new file mode 100644 index 00000000000..5f6f3a95c05 --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOps.cpp @@ -0,0 +1,212 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/InvertNeighborsListOps.h" +#include "open3d/ml/paddle/misc/ReduceSubarraysSumOps.h" +#include "open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.h" +#include "open3d/ml/paddle/sparse_conv/SparseConvOpKernel.h" +#include "open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.h" + +std::vector SparseConvForward( + paddle::Tensor& filters, + paddle::Tensor& inp_features, + paddle::Tensor& inp_importance, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_kernel_index, + paddle::Tensor& neighbors_importance, + paddle::Tensor& neighbors_row_splits, + const bool normalize, + const int64_t max_temp_mem_MB) { + CHECK_TYPE(neighbors_row_splits, paddle::DataType::INT64); + CHECK_SAME_DTYPE(filters, inp_features, inp_importance, + neighbors_importance); + CHECK_SAME_DEVICE_TYPE(filters, inp_features, inp_importance); + + // check input shapes + using namespace open3d::ml::op_util; + Dim num_kernel_elements("num_kernel_elements"); + Dim in_channels("in_channels"); + Dim out_channels("out_channels"); + Dim num_out_points("num_out_points"); + Dim num_inp_points("num_inp_points"); + Dim num_neighbors("nun_neighbors"); + + CHECK_SHAPE_COMBINE_FIRST_DIMS(filters, num_kernel_elements, in_channels, + out_channels); + CHECK_SHAPE(inp_features, num_inp_points, in_channels); + CHECK_SHAPE(inp_importance, num_inp_points || 0); + CHECK_SHAPE(neighbors_index, num_neighbors); + CHECK_SHAPE(neighbors_kernel_index, num_neighbors); + CHECK_SHAPE(neighbors_importance, num_neighbors || 0); + CHECK_SHAPE(neighbors_row_splits, num_out_points + 1); + + // make sure that these are on the same place as the filters and feats + auto place = inp_features.place(); + neighbors_index = neighbors_index.copy_to(place, false); + neighbors_kernel_index = neighbors_kernel_index.copy_to(place, false); + neighbors_importance = neighbors_importance.copy_to(place, false); + neighbors_row_splits = neighbors_row_splits.copy_to(place, false); + + const auto& feat_dtype = filters.dtype(); + const auto& index_dtype = neighbors_index.dtype(); + const auto& kernel_index_dtype = neighbors_kernel_index.dtype(); + + paddle::Tensor out_features = paddle::empty( + {num_out_points.value(), out_channels.value()}, feat_dtype, place); +#define FN_PARAMETERS \ + filters, inp_features, inp_importance, neighbors_index, \ + neighbors_kernel_index, neighbors_importance, \ + neighbors_row_splits, normalize, max_temp_mem_MB, out_features + +#define CALL(feat_t, out_t, index_t, kernel_index_t, fn) \ + if (ComparePaddleDtype(feat_dtype) && \ + ComparePaddleDtype(index_dtype) && \ + ComparePaddleDtype(kernel_index_dtype)) { \ + fn(FN_PARAMETERS); \ + return {out_features}; \ + } + + if (inp_features.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + CALL(float, float, int32_t, uint8_t, ::SparseConvCUDA) +#else + PD_CHECK(false, "SparseConv was not compiled with CUDA support"); +#endif + } else { + CALL(float, float, int32_t, uint8_t, ::SparseConvCPU) + } +#undef FN_PARAMETERS +#undef CALL + + PD_CHECK(false, + "SparseConv does not support " + + phi::DataTypeToString(inp_features.dtype()) + + " as input for inp_features, and " + + phi::DataTypeToString(neighbors_index.dtype()) + + " as input for neighbors_index, and " + + phi::DataTypeToString(neighbors_kernel_index.dtype()) + + " as input for neighbors_kernel_indexcgcgcc"); + return {paddle::Tensor()}; +} + +std::vector SparseConvBackward( + paddle::Tensor& filters, + paddle::Tensor& inp_features, + paddle::Tensor& inp_importance, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_kernel_index, + paddle::Tensor& neighbors_importance, + paddle::Tensor& neighbors_row_splits, + paddle::Tensor& out_features_gradient, + const bool normalize, + const int64_t max_temp_mem_MB) { + auto place = inp_features.place(); + const auto& feat_dtype = filters.dtype(); + const auto& index_dtype = neighbors_index.dtype(); + const auto& kernel_index_dtype = neighbors_kernel_index.dtype(); + CHECK_SAME_DTYPE(out_features_gradient, inp_features, filters); + CHECK_SAME_DEVICE_TYPE(out_features_gradient, inp_features, filters); + + // output vars + paddle::Tensor filters_backprop; + paddle::Tensor inp_features_backprop; + +#define CALL(feat_t, out_t, index_t, kernel_index_t, fn_suffix) \ + if (ComparePaddleDtype(feat_dtype) && \ + ComparePaddleDtype(index_dtype) && \ + ComparePaddleDtype(kernel_index_dtype)) { \ + filters_backprop = paddle::empty(filters.shape(), feat_dtype, place); \ + SparseConvBackpropFilter##fn_suffix( \ + filters, inp_features, inp_importance, neighbors_index, \ + neighbors_kernel_index, neighbors_importance, \ + neighbors_row_splits, out_features_gradient, normalize, \ + max_temp_mem_MB, filters_backprop); \ + \ + paddle::Tensor inv_neighbors_index, inv_neighbors_row_splits, \ + inv_neighbors_importance, inv_arange; \ + paddle::Tensor arange = Arange(neighbors_index.shape()[0], place); \ + auto inv = InvertNeighborsList(neighbors_index, neighbors_row_splits, \ + arange, inp_features.shape()[0]); \ + inv_neighbors_index = inv[0]; \ + inv_neighbors_row_splits = inv[1]; \ + inv_arange = inv[2]; \ + paddle::Tensor inv_neighbors_kernel_index = \ + paddle::experimental::gather(neighbors_kernel_index, \ + inv_arange); \ + if (neighbors_importance.shape()[0] > 0) { \ + inv_neighbors_importance = paddle::experimental::gather( \ + neighbors_importance, inv_arange); \ + } else { \ + inv_neighbors_importance = paddle::empty({0}, feat_dtype, place); \ + } \ + \ + auto neighbors_importance_sum = ReduceSubarraysSum( \ + neighbors_importance, neighbors_row_splits)[0]; \ + inp_features_backprop = \ + paddle::ones(inp_features.shape(), feat_dtype, place); \ + auto filters_transposed = Transpose(filters, -1, -2).contiguous(); \ + \ + SparseConvTranspose##fn_suffix( \ + filters_transposed, inp_importance, out_features_gradient, \ + neighbors_importance_sum, neighbors_row_splits, \ + inv_neighbors_index, inv_neighbors_kernel_index, \ + inv_neighbors_importance, inv_neighbors_row_splits, normalize, \ + max_temp_mem_MB, inp_features_backprop); \ + dispatch_success = true; \ + } + + bool dispatch_success = false; + if (inp_features.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + CALL(float, float, int32_t, uint8_t, CUDA) +#else + PD_CHECK(false, + "SparseConv backward was not compiled " + "with CUDA support"); +#endif + } else { + CALL(float, float, int32_t, uint8_t, CPU) + } + PD_CHECK(dispatch_success, + "SparseConv backward does not support " + + phi::DataTypeToString(inp_features.dtype()) + + " as input for inp_features, and " + + phi::DataTypeToString(neighbors_index.dtype()) + + " as input for neighbors_index, and " + + phi::DataTypeToString(neighbors_kernel_index.dtype()) + + " as input for neighbors_kernel_index"); + + return {filters_backprop, inp_features_backprop}; +} + +std::vector SparseConvInferDtype( + paddle::DataType filters_dtype) { + return {filters_dtype}; +} + +PD_BUILD_OP(open3d_sparse_conv) + .Inputs({"filters", "inp_features", "inp_importance", "neighbors_index", + "neighbors_kernel_index", "neighbors_importance", + "neighbors_row_splits"}) + .Outputs({"out_features"}) + .Attrs({"normalize:bool", "max_temp_mem_MB:int64_t"}) + .SetKernelFn(PD_KERNEL(SparseConvForward)) + .SetInferDtypeFn(PD_INFER_DTYPE(SparseConvInferDtype)); + +PD_BUILD_GRAD_OP(open3d_sparse_conv) + .Inputs({"filters", "inp_features", "inp_importance", "neighbors_index", + "neighbors_kernel_index", "neighbors_importance", + "neighbors_row_splits", paddle::Grad("out_features")}) + .Outputs({paddle::Grad("filters"), paddle::Grad("inp_features")}) + .Attrs({"normalize:bool", "max_temp_mem_MB:int64_t"}) + .SetKernelFn(PD_KERNEL(SparseConvBackward)); \ No newline at end of file diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp new file mode 100644 index 00000000000..1aa89df8a61 --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp @@ -0,0 +1,66 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/impl/sparse_conv/SparseConvTransposeBackpropFilter.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void SparseConvTransposeBackpropFilterCPU( + const paddle::Tensor& filters, + const paddle::Tensor& out_importance, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop) { + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + SparseConvTransposeBackpropFilterCPU( + filter_backprop.data(), filter_dims, + neighbors_row_splits.shape()[0] - 1, + out_importance.shape()[0] ? out_importance.data() : nullptr, + inp_features.shape()[0], inp_features.data(), + inp_neighbors_importance_sum.shape()[0] + ? inp_neighbors_importance_sum.data() + : nullptr, + inp_neighbors_row_splits.data(), + neighbors_index.data(), + neighbors_kernel_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), + out_features_gradient.data(), normalize); +} +#define INSTANTIATE(TFeat, TOut, TIndex, TKernelIndex) \ + template void \ + SparseConvTransposeBackpropFilterCPU( \ + const paddle::Tensor& filters, \ + const paddle::Tensor& out_importance, \ + const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_neighbors_importance_sum, \ + const paddle::Tensor& inp_neighbors_row_splits, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_kernel_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, \ + const paddle::Tensor& out_features_gradient, const bool normalize, \ + const int64_t max_temp_mem_MB, paddle::Tensor& filter_backprop); + +INSTANTIATE(float, float, int32_t, uint8_t) diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu new file mode 100644 index 00000000000..b065449804e --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu @@ -0,0 +1,106 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include +#include + +#include "open3d/ml/impl/sparse_conv/SparseConvTransposeBackpropFilter.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void SparseConvTransposeBackpropFilterCUDA( + const paddle::Tensor& filters, + const paddle::Tensor& out_importance, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop) { + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + + auto stream = filters.stream(); + // -1 means current global place + auto cuda_device_props = phi::backends::gpu::GetDeviceProperties(-1); + const int texture_alignment = cuda_device_props.textureAlignment; + + auto place = filters.place(); + + void* temp_ptr = nullptr; + size_t temp_size = 0; + size_t max_temp_size = 0; + + // determine temp_size + SparseConvTransposeBackpropFilterCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + filter_backprop.data(), filter_dims, + neighbors_row_splits.shape()[0] - 1, + out_importance.shape()[0] ? out_importance.data() : nullptr, + inp_features.shape()[0], inp_features.data(), + inp_neighbors_importance_sum.shape()[0] + ? inp_neighbors_importance_sum.data() + : nullptr, + inp_neighbors_row_splits.data(), + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_kernel_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), + out_features_gradient.data(), normalize); + + temp_size = std::max( + std::min(static_cast(max_temp_mem_MB) * 1024 * 1024, + max_temp_size), + temp_size); + + auto temp_tensor = CreateTempTensor(temp_size, place, &temp_ptr); + + // actually run the operation + SparseConvTransposeBackpropFilterCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + filter_backprop.data(), filter_dims, + neighbors_row_splits.shape()[0] - 1, + out_importance.shape()[0] ? out_importance.data() : nullptr, + inp_features.shape()[0], inp_features.data(), + inp_neighbors_importance_sum.shape()[0] + ? inp_neighbors_importance_sum.data() + : nullptr, + inp_neighbors_row_splits.data(), + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_kernel_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), + out_features_gradient.data(), normalize); +} +#define INSTANTIATE(TFeat, TOut, TIndex, TKernelIndex) \ + template void \ + SparseConvTransposeBackpropFilterCUDA( \ + const paddle::Tensor& filters, \ + const paddle::Tensor& out_importance, \ + const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_neighbors_importance_sum, \ + const paddle::Tensor& inp_neighbors_row_splits, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_kernel_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, \ + const paddle::Tensor& out_features_gradient, const bool normalize, \ + const int64_t max_temp_mem_MB, paddle::Tensor& filter_backprop); + +INSTANTIATE(float, float, int32_t, uint8_t) diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h new file mode 100644 index 00000000000..2a5a6f66848 --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h @@ -0,0 +1,46 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" + +template +void SparseConvTransposeBackpropFilterCPU( + const paddle::Tensor& filters, + const paddle::Tensor& out_importance, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop); + +#ifdef BUILD_CUDA_MODULE +template +void SparseConvTransposeBackpropFilterCUDA( + const paddle::Tensor& filters, + const paddle::Tensor& out_importance, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const paddle::Tensor& out_features_gradient, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& filter_backprop); +#endif diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cpp b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cpp new file mode 100644 index 00000000000..2eb0851d21f --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cpp @@ -0,0 +1,62 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/impl/sparse_conv/SparseConvTranspose.h" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void SparseConvTransposeCPU(const paddle::Tensor& filters, + const paddle::Tensor& out_importance, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features) { + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + + SparseConvTransposeComputeFeaturesCPU( + out_features.data(), filter_dims, filters.data(), + neighbors_row_splits.shape()[0] - 1, + out_importance.shape()[0] ? out_importance.data() : nullptr, + inp_features.shape()[0], inp_features.data(), + inp_neighbors_importance_sum.shape()[0] + ? inp_neighbors_importance_sum.data() + : nullptr, + inp_neighbors_row_splits.data(), + neighbors_index.data(), + neighbors_kernel_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), normalize); +} +#define INSTANTIATE(TFeat, TOut, TIndex, TKernelIndex) \ + template void SparseConvTransposeCPU( \ + const paddle::Tensor& filters, \ + const paddle::Tensor& out_importance, \ + const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_neighbors_importance_sum, \ + const paddle::Tensor& inp_neighbors_row_splits, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_kernel_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, const bool normalize, \ + const int64_t max_temp_mem_MB, paddle::Tensor& out_features); + +INSTANTIATE(float, float, int32_t, uint8_t) diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cu b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cu new file mode 100644 index 00000000000..2b1151c3e5c --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cu @@ -0,0 +1,100 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include +#include + +#include "open3d/ml/impl/sparse_conv/SparseConvTranspose.cuh" +#include "open3d/ml/paddle/PaddleHelper.h" + +using namespace open3d::ml::impl; + +template +void SparseConvTransposeCUDA(const paddle::Tensor& filters, + const paddle::Tensor& out_importance, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features) { + std::vector filter_dims; + for (auto d : filters.shape()) { + filter_dims.push_back(static_cast(d)); + } + + auto stream = filters.stream(); + // -1 means current global place + auto cuda_device_props = phi::backends::gpu::GetDeviceProperties(-1); + const int texture_alignment = cuda_device_props.textureAlignment; + + auto place = filters.place(); + + void* temp_ptr = nullptr; + size_t temp_size = 0; + size_t max_temp_size = 0; + + // determine temp_size + SparseConvTransposeComputeFeaturesCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + out_features.data(), filter_dims, filters.data(), + neighbors_row_splits.shape()[0] - 1, + out_importance.shape()[0] ? out_importance.data() : nullptr, + inp_features.shape()[0], inp_features.data(), + inp_neighbors_importance_sum.shape()[0] + ? inp_neighbors_importance_sum.data() + : nullptr, + inp_neighbors_row_splits.data(), + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_kernel_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), normalize); + + temp_size = std::max( + std::min(static_cast(max_temp_mem_MB) * 1024 * 1024, + max_temp_size), + temp_size); + + auto temp_tensor = CreateTempTensor(temp_size, place, &temp_ptr); + + // actually run the operation + SparseConvTransposeComputeFeaturesCUDA( + stream, temp_ptr, temp_size, max_temp_size, texture_alignment, + out_features.data(), filter_dims, filters.data(), + neighbors_row_splits.shape()[0] - 1, + out_importance.shape()[0] ? out_importance.data() : nullptr, + inp_features.shape()[0], inp_features.data(), + inp_neighbors_importance_sum.shape()[0] + ? inp_neighbors_importance_sum.data() + : nullptr, + inp_neighbors_row_splits.data(), + neighbors_index.shape()[0], neighbors_index.data(), + neighbors_kernel_index.data(), + neighbors_importance.shape()[0] ? neighbors_importance.data() + : nullptr, + neighbors_row_splits.data(), normalize); +} +#define INSTANTIATE(TFeat, TOut, TIndex, TKernelIndex) \ + template void SparseConvTransposeCUDA( \ + const paddle::Tensor& filters, \ + const paddle::Tensor& out_importance, \ + const paddle::Tensor& inp_features, \ + const paddle::Tensor& inp_neighbors_importance_sum, \ + const paddle::Tensor& inp_neighbors_row_splits, \ + const paddle::Tensor& neighbors_index, \ + const paddle::Tensor& neighbors_kernel_index, \ + const paddle::Tensor& neighbors_importance, \ + const paddle::Tensor& neighbors_row_splits, const bool normalize, \ + const int64_t max_temp_mem_MB, paddle::Tensor& out_features); + +INSTANTIATE(float, float, int32_t, uint8_t) diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.h b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.h new file mode 100644 index 00000000000..8bc41db3124 --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.h @@ -0,0 +1,42 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// +#pragma once + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" + +template +void SparseConvTransposeCPU(const paddle::Tensor& filters, + const paddle::Tensor& out_importance, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features); + +#ifdef BUILD_CUDA_MODULE +template +void SparseConvTransposeCUDA(const paddle::Tensor& filters, + const paddle::Tensor& out_importance, + const paddle::Tensor& inp_features, + const paddle::Tensor& inp_neighbors_importance_sum, + const paddle::Tensor& inp_neighbors_row_splits, + const paddle::Tensor& neighbors_index, + const paddle::Tensor& neighbors_kernel_index, + const paddle::Tensor& neighbors_importance, + const paddle::Tensor& neighbors_row_splits, + const bool normalize, + const int64_t max_temp_mem_MB, + paddle::Tensor& out_features); +#endif diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOps.cpp b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOps.cpp new file mode 100644 index 00000000000..b4680bea6c6 --- /dev/null +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOps.cpp @@ -0,0 +1,224 @@ +// ---------------------------------------------------------------------------- +// - Open3D: www.open3d.org - +// ---------------------------------------------------------------------------- +// Copyright (c) 2018-2023 www.open3d.org +// SPDX-License-Identifier: MIT +// ---------------------------------------------------------------------------- +// + +#include + +#include "open3d/ml/paddle/PaddleHelper.h" +#include "open3d/ml/paddle/misc/InvertNeighborsListOps.h" +#include "open3d/ml/paddle/misc/ReduceSubarraysSumOps.h" +#include "open3d/ml/paddle/sparse_conv/SparseConvOpKernel.h" +#include "open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h" +#include "open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.h" + +std::vector SparseConvTransposeForward( + paddle::Tensor& filters, + paddle::Tensor& out_importance, + paddle::Tensor& inp_features, + paddle::Tensor& inp_neighbors_index, + paddle::Tensor& inp_neighbors_importance_sum, + paddle::Tensor& inp_neighbors_row_splits, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_kernel_index, + paddle::Tensor& neighbors_importance, + paddle::Tensor& neighbors_row_splits, + const bool normalize, + const int64_t max_temp_mem_MB) { + CHECK_TYPE(neighbors_row_splits, paddle::DataType::INT64); + CHECK_TYPE(inp_neighbors_row_splits, paddle::DataType::INT64); + CHECK_SAME_DTYPE(neighbors_index, inp_neighbors_index); + CHECK_SAME_DTYPE(filters, inp_features, out_importance, + neighbors_importance); + CHECK_SAME_DEVICE_TYPE(filters, inp_features, out_importance); + + // check input shapes + using namespace open3d::ml::op_util; + Dim num_out("num_out"); + Dim num_inp("num_inp"); + Dim num_kernel_elements("num_kernel_elements"); + Dim in_channels("in_channels"); + Dim out_channels("out_channels"); + Dim num_neighbors("num_neighbors"); + + CHECK_SHAPE_COMBINE_FIRST_DIMS(filters, num_kernel_elements, in_channels, + out_channels); + CHECK_SHAPE(neighbors_row_splits, num_out + 1); + CHECK_SHAPE(out_importance, 0 || num_out); + CHECK_SHAPE(inp_features, num_inp, in_channels); + CHECK_SHAPE(inp_neighbors_index, num_neighbors); + CHECK_SHAPE(inp_neighbors_importance_sum, 0 || num_inp); + CHECK_SHAPE(inp_neighbors_row_splits, num_inp + 1); + CHECK_SHAPE(neighbors_index, num_neighbors); + CHECK_SHAPE(neighbors_kernel_index, num_neighbors); + CHECK_SHAPE(neighbors_importance, 0 || num_neighbors); + + // make sure that these are on the same place as the filters and feats + auto place = inp_features.place(); + neighbors_index = neighbors_index.copy_to(place, false); + neighbors_kernel_index = neighbors_kernel_index.copy_to(place, false); + neighbors_importance = neighbors_importance.copy_to(place, false); + neighbors_row_splits = neighbors_row_splits.copy_to(place, false); + inp_neighbors_index = inp_neighbors_index.copy_to(place, false); + inp_neighbors_importance_sum = + inp_neighbors_importance_sum.copy_to(place, false); + inp_neighbors_row_splits = inp_neighbors_row_splits.copy_to(place, false); + + const auto& feat_dtype = filters.dtype(); + const auto& index_dtype = neighbors_index.dtype(); + const auto& kernel_index_dtype = neighbors_kernel_index.dtype(); + + paddle::Tensor out_features = paddle::empty( + {num_out.value(), out_channels.value()}, feat_dtype, place); +#define FN_PARAMETERS \ + filters, out_importance, inp_features, inp_neighbors_importance_sum, \ + inp_neighbors_row_splits, neighbors_index, neighbors_kernel_index, \ + neighbors_importance, neighbors_row_splits, normalize, \ + max_temp_mem_MB, out_features + +#define CALL(feat_t, out_t, index_t, kernel_index_t, fn) \ + if (ComparePaddleDtype(feat_dtype) && \ + ComparePaddleDtype(index_dtype) && \ + ComparePaddleDtype(kernel_index_dtype)) { \ + fn(FN_PARAMETERS); \ + return {out_features}; \ + } + + if (inp_features.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + CALL(float, float, int32_t, uint8_t, ::SparseConvTransposeCUDA) +#else + PD_CHECK(false, + "SparseConvTranspose was not compiled with CUDA " + "support"); +#endif + } else { + CALL(float, float, int32_t, uint8_t, ::SparseConvTransposeCPU) + } +#undef FN_PARAMETERS +#undef CALL + + PD_CHECK(false, "SparseConv does not support " + + phi::DataTypeToString(inp_features.dtype()) + + " as input for inp_features and " + + phi::DataTypeToString(neighbors_index.dtype()) + + " as input for neighbors_index"); + return {paddle::Tensor()}; +} + +std::vector SparseConvTransposeBackward( + paddle::Tensor& filters, + paddle::Tensor& out_importance, + paddle::Tensor& inp_features, + paddle::Tensor& inp_neighbors_importance_sum, + paddle::Tensor& inp_neighbors_row_splits, + paddle::Tensor& neighbors_index, + paddle::Tensor& neighbors_kernel_index, + paddle::Tensor& neighbors_importance, + paddle::Tensor& neighbors_row_splits, + paddle::Tensor& out_features_gradient, + const bool normalize, + const int64_t max_temp_mem_MB) { + auto place = inp_features.place(); + const auto& feat_dtype = filters.dtype(); + const auto& index_dtype = neighbors_index.dtype(); + const auto& kernel_index_dtype = neighbors_kernel_index.dtype(); + CHECK_SAME_DTYPE(out_features_gradient, inp_features, filters); + CHECK_SAME_DEVICE_TYPE(out_features_gradient, inp_features, filters); + + // output vars + paddle::Tensor filters_backprop; + paddle::Tensor inp_features_backprop; + +#define CALL(feat_t, out_t, index_t, kernel_index_t, fn_suffix) \ + if (ComparePaddleDtype(feat_dtype) && \ + ComparePaddleDtype(index_dtype) && \ + ComparePaddleDtype(kernel_index_dtype)) { \ + filters_backprop = paddle::empty(filters.shape(), feat_dtype, place); \ + SparseConvTransposeBackpropFilter##fn_suffix( \ + filters, out_importance, inp_features, \ + inp_neighbors_importance_sum, inp_neighbors_row_splits, \ + neighbors_index, neighbors_kernel_index, neighbors_importance, \ + neighbors_row_splits, out_features_gradient, normalize, \ + max_temp_mem_MB, filters_backprop); \ + \ + paddle::Tensor inv_neighbors_index, _inv_neighbors_row_splits, \ + inv_neighbors_importance, inv_arange; \ + paddle::Tensor arange = Arange(neighbors_index.shape()[0], place); \ + auto inv = InvertNeighborsList(neighbors_index, neighbors_row_splits, \ + arange, inp_features.shape()[0]); \ + inv_neighbors_index = inv[0]; \ + _inv_neighbors_row_splits = inv[1]; \ + inv_arange = inv[2]; \ + paddle::Tensor inv_neighbors_kernel_index = \ + paddle::experimental::gather(neighbors_kernel_index, \ + inv_arange); \ + if (neighbors_importance.shape()[0] > 0) { \ + inv_neighbors_importance = paddle::experimental::gather( \ + neighbors_importance, inv_arange); \ + } else { \ + inv_neighbors_importance = paddle::empty({0}, feat_dtype, place); \ + } \ + inp_features_backprop = \ + paddle::ones(inp_features.shape(), feat_dtype, place); \ + auto filters_transposed = Transpose(filters, -1, -2).contiguous(); \ + \ + SparseConv##fn_suffix( \ + filters_transposed, out_features_gradient, out_importance, \ + inv_neighbors_index, inv_neighbors_kernel_index, \ + inv_neighbors_importance, inp_neighbors_row_splits, normalize, \ + max_temp_mem_MB, inp_features_backprop); \ + dispatch_success = true; \ + } + + bool dispatch_success = false; + if (inp_features.is_gpu()) { +#ifdef BUILD_CUDA_MODULE + CALL(float, float, int32_t, uint8_t, CUDA) +#else + PD_CHECK(false, + "SparseConvTranspose backward was not compiled " + "with CUDA support"); +#endif + } else { + CALL(float, float, int32_t, uint8_t, CPU) + } + PD_CHECK(dispatch_success, + "SparseConvTranspose backward does not support " + + phi::DataTypeToString(inp_features.dtype()) + + " as input for inp_features and " + + phi::DataTypeToString(neighbors_index.dtype()) + + " as input for neighbors_index"); + + return {filters_backprop, inp_features_backprop}; +} + +std::vector SparseConvTransposeInferDtype( + paddle::DataType inp_positions_dtype) { + return {inp_positions_dtype}; +} + +PD_BUILD_OP(open3d_sparse_conv_transpose) + .Inputs({"filters", "out_importance", "inp_features", + "inp_neighbors_index", "inp_neighbors_importance_sum", + "inp_neighbors_row_splits", "neighbors_index", + "neighbors_kernel_index", "neighbors_importance", + "neighbors_row_splits"}) + .Outputs({"out_features"}) + .Attrs({"normalize:bool", "max_temp_mem_MB:int64_t"}) + .SetKernelFn(PD_KERNEL(SparseConvTransposeForward)) + .SetInferDtypeFn(PD_INFER_DTYPE(SparseConvTransposeInferDtype)); + +PD_BUILD_GRAD_OP(open3d_sparse_conv_transpose) + .Inputs({"filters", "out_importance", "inp_features", + "inp_neighbors_importance_sum", "inp_neighbors_row_splits", + "neighbors_index", "neighbors_kernel_index", + "neighbors_importance", "neighbors_row_splits", + paddle::Grad("out_features")}) + .Outputs({paddle::Grad("filters"), paddle::Grad("inp_features")}) + .Attrs({"normalize:bool", "max_temp_mem_MB:int64_t"}) + .SetKernelFn(PD_KERNEL(SparseConvTransposeBackward)); \ No newline at end of file diff --git a/python/open3d/ml/paddle/python/layers/convolutions.py b/python/open3d/ml/paddle/python/layers/convolutions.py index 302a90f1bb0..7ea1ed24149 100644 --- a/python/open3d/ml/paddle/python/layers/convolutions.py +++ b/python/open3d/ml/paddle/python/layers/convolutions.py @@ -12,7 +12,7 @@ from paddle import create_parameter import numpy as np -__all__ = ['ContinuousConv'] +__all__ = ['ContinuousConv', 'SparseConv', 'SparseConvTranspose'] class ContinuousConv(paddle.nn.Layer): @@ -294,3 +294,408 @@ def forward(self, out_features = self.activation(out_features) return out_features + + +class SparseConv(paddle.nn.Layer): + """Sparse Convolution. + + This layer computes a convolution which is only evaluated at the specified output positions. + The layer assumes that input and output points lie on a regular grid. + + Example: + This shows a minimal example of how to use the layer:: + + import paddle + import open3d.ml.paddle as ml3d + + # +0.5 to move the points to the voxel center + inp_positions = paddle.randint(0, 10, [20,3]).to(paddle.float32) + 0.5 + inp_features = paddle.randn([20,8]) + out_positions = paddle.randint(0, 10, [20,3]).to(paddle.float32) + 0.5 + + conv = ml3d.layers.SparseConv(in_channels=8, filters=16, kernel_size=[3,3,3]) + out_features = conv(inp_features, inp_positions, out_positions, voxel_size=1.0) + + + Arguments: + in_channels: The number of input channels. + + filters: The number of filters/output channels. + + kernel_size: The spatial resolution of the filter, e.g. [3,3,3]. + + activation: The activation function to use. None means no activation. + + use_bias: If True adds an additive bias vector. + + kernel_initializer: Initializer for the kernel weights. + + bias_initializer: Initializer for the bias vector. + + normalize: If true then the result is normalized by the number of input points. + + offset: A single 3D vector used in the filter coordinate computation. + The shape is [3]. This can be used to control how the filters are + centered. It will be set automatically for kernels with even sizes. + """ + + def __init__(self, + in_channels, + filters, + kernel_size, + activation=None, + use_bias=True, + kernel_initializer=paddle.nn.initializer.Uniform(-0.05, 0.05), + bias_initializer=paddle.nn.initializer.Constant(), + normalize=False, + offset=None, + **kwargs): + super().__init__() + + self.in_channels = in_channels + self.filters = filters + self.kernel_size = kernel_size + self.activation = activation + self.use_bias = use_bias + self.kernel_initializer = kernel_initializer + self.bias_initializer = bias_initializer + self.normalize = normalize + + if not (np.asarray(kernel_size) == kernel_size[0]).all(): + raise ValueError("Only cubic kernel sizes are supported.") + + if offset is None: + if kernel_size[0] % 2: + offset = paddle.zeros(shape=(3,), dtype=paddle.float32) + else: + offset = paddle.full((3,), -0.5, dtype=paddle.float32) + self.register_buffer('offset', offset) + + self.fixed_radius_search = FixedRadiusSearch(metric='Linf', + ignore_query_point=False, + return_distances=False) + + kernel_shape = (*self.kernel_size, self.in_channels, self.filters) + self.kernel = create_parameter( + kernel_shape, + dtype=paddle.float32, + default_initializer=self.kernel_initializer) + + if self.use_bias: + self.bias = create_parameter((self.filters,), + dtype=paddle.float32, + is_bias=True, + default_initializer=bias_initializer) + + def forward(self, + inp_features, + inp_positions, + out_positions, + voxel_size, + inp_importance=None, + fixed_radius_search_hash_table=None): + """This function computes the output features. + + Arguments: + inp_features: A 2D tensor which stores a feature vector for each input + point. + + inp_positions: A 2D tensor with the 3D point positions of each input + point. The coordinates for each point is a vector with format [x,y,z]. + + out_positions: A 2D tensor with the 3D point positions of each output + point. The coordinates for each point is a vector with format [x,y,z]. + + voxel_size: A scalar float that defines the edge length of a voxel. + + inp_importance: Optional scalar importance value for each input point. + + fixed_radius_search_hash_table: A precomputed hash table generated with + build_spatial_hash_table(). This input can be used to explicitly force the + reuse of a hash table in special cases and is usually not needed. + Note that the hash table must have been generated with the same 'points' + array. Note that this parameter is only used if 'extents' is a scalar. + + Returns: A tensor of shape [num output points, filters] with the output + features. + """ + if isinstance(inp_features, classes.RaggedTensor): + if not (isinstance(inp_positions, classes.RaggedTensor) and + isinstance(out_positions, classes.RaggedTensor)): + raise ValueError( + "All of inp_positions, inp_features and out_positions must be paddle.Tensor, or ml3d.classes.RaggedTensor" + ) + + offset = self.offset + if isinstance(voxel_size, (float, int)): + voxel_size = paddle.to_tensor( + voxel_size, dtype=inp_positions.dtype).to(self.kernel.place) + if len(voxel_size.shape) != 0: + raise Exception("voxel_size must be a scalar") + + if inp_importance is None: + inp_importance = paddle.empty( + (0,), dtype=paddle.float32).to(self.kernel.place) + + hash_table_size_factor = 1 / 64 + self.nns = self.fixed_radius_search( + inp_positions, + queries=out_positions - offset * voxel_size, + radius=self.kernel_size[0] * voxel_size * 0.51, + hash_table_size_factor=hash_table_size_factor, + hash_table=fixed_radius_search_hash_table) + + out_positions_split = None + if isinstance(inp_positions, classes.RaggedTensor): + inp_positions = inp_positions.values + inp_features = inp_features.values + out_positions_split = out_positions.row_splits + out_positions = out_positions.values + + # for stats and debugging + num_pairs = self.nns.neighbors_index.shape[0] + self._avg_neighbors = num_pairs / out_positions.shape[0] + + extents_rank2 = paddle.full([1, 1], voxel_size * self.kernel_size[0]) + + self._conv_values = { + 'filters': self.kernel, + 'out_positions': out_positions, + 'extents': extents_rank2, + 'offset': offset, + 'inp_positions': inp_positions, + 'inp_features': inp_features, + 'inp_importance': inp_importance, + 'neighbors_index': self.nns.neighbors_index, + 'neighbors_importance': paddle.empty((0,), dtype=paddle.float32), + 'neighbors_row_splits': self.nns.neighbors_row_splits, + 'align_corners': False, + 'coordinate_mapping': 'identity', + 'interpolation': 'nearest_neighbor', + 'normalize': self.normalize, + 'max_temp_mem_mb': 64 + } + + out_features = ops.continuous_conv(**self._conv_values) + + self._conv_output = out_features + + if self.use_bias: + out_features += self.bias + if self.activation: + out_features = self.activation(out_features) + + if out_positions_split is not None: + out_features = classes.RaggedTensor.from_row_splits( + out_features, out_positions_split, validate=False, copy=False) + + return out_features + + +class SparseConvTranspose(paddle.nn.Layer): + """Sparse Transposed Convolution. + + This layer computes a transposed convolution which is only evaluated at the specified output positions. + The layer assumes that input and output points lie on a regular grid. + + Example: + This shows a minimal example of how to use the layer:: + + import paddle + import open3d.ml.paddle as ml3d + + # +0.5 to move the points to the voxel center + inp_positions = paddle.randint(0, 10, [20,3]).to(paddle.float32) + 0.5 + inp_features = paddle.randn([20,8]) + out_positions = paddle.randint(0, 10, [20,3]).to(paddle.float32) + 0.5 + + conv = ml3d.layers.SparseConv(in_channels=8, filters=16, kernel_size=[3,3,3]) + out_features = conv(inp_features, inp_positions, out_positions, voxel_size=1.0) + + + Arguments: + in_channels: The number of input channels. + + filters: The number of filters/output channels. + + kernel_size: The spatial resolution of the filter, e.g. [3,3,3]. + + activation: The activation function to use. None means no activation. + + use_bias: If True adds an additive bias vector. + + kernel_initializer: Initializer for the kernel weights. + + bias_initializer: Initializer for the bias vector. + + normalize: If true then the input features will be normalized with the number of + output points. + + offset: A single 3D vector used in the filter coordinate computation. + The shape is [3]. This can be used to control how the filters are + centered. It will be set automatically for kernels with even sizes. + """ + + def __init__(self, + in_channels, + filters, + kernel_size, + activation=None, + use_bias=True, + kernel_initializer=paddle.nn.initializer.Uniform(-0.05, 0.05), + bias_initializer=paddle.nn.initializer.Constant(), + normalize=False, + offset=None, + **kwargs): + super().__init__() + + self.in_channels = in_channels + self.filters = filters + self.kernel_size = kernel_size + self.activation = activation + self.use_bias = use_bias + self.kernel_initializer = kernel_initializer + self.bias_initializer = bias_initializer + self.normalize = normalize + + if not (np.asarray(kernel_size) == kernel_size[0]).all(): + raise ValueError("Only cubic kernel sizes are supported.") + + if offset is None: + if kernel_size[0] % 2: + offset = paddle.zeros(shape=(3,), dtype=paddle.float32) + else: + offset = paddle.full((3,), -0.5, dtype=paddle.float32) + self.register_buffer('offset', offset) + + self.fixed_radius_search = FixedRadiusSearch(metric='Linf', + ignore_query_point=False, + return_distances=False) + + kernel_shape = (*self.kernel_size, self.in_channels, self.filters) + self.kernel = create_parameter( + kernel_shape, + dtype=paddle.float32, + default_initializer=self.kernel_initializer) + + if self.use_bias: + self.bias = create_parameter((self.filters,), + dtype=paddle.float32, + is_bias=True, + default_initializer=bias_initializer) + + def forward(self, + inp_features, + inp_positions, + out_positions, + voxel_size, + out_importance=None, + fixed_radius_search_hash_table=None): + """This function computes the output features. + + Arguments: + inp_features: A 2D tensor which stores a feature vector for each input + point. + + inp_positions: A 2D tensor with the 3D point positions of each input + point. The coordinates for each point is a vector with format [x,y,z]. + + out_positions: A 2D tensor with the 3D point positions of each output + point. The coordinates for each point is a vector with format [x,y,z]. + + voxel_size: A scalar float that defines the edge length of a voxel. + + out_importance: Optional scalar importance value for each output point. + + fixed_radius_search_hash_table: A precomputed hash table generated with + build_spatial_hash_table(). This input can be used to explicitly force the + reuse of a hash table in special cases and is usually not needed. + Note that the hash table must have been generated with the same 'points' + array. Note that this parameter is only used if 'extents' is a scalar. + + Returns: A tensor of shape [num output points, filters] with the output + features. + """ + if isinstance(inp_features, classes.RaggedTensor): + if not (isinstance(inp_positions, classes.RaggedTensor) and + isinstance(out_positions, classes.RaggedTensor)): + raise ValueError( + "All of inp_positions, inp_features and out_positions must be paddle.Tensor, or ml3d.classes.RaggedTensor" + ) + + offset = self.offset + if isinstance(voxel_size, (float, int)): + voxel_size = paddle.to_tensor( + voxel_size, dtype=inp_positions.dtype).to(self.kernel.place) + if len(voxel_size.shape) != 0: + raise Exception("voxel_size must be a scalar") + + if out_importance is None: + out_importance = paddle.empty( + (0,), dtype=paddle.float32).to(self.kernel.place) + + empty_vec = paddle.empty((0,), + dtype=paddle.float32).to(self.kernel.place) + + hash_table_size_factor = 1 / 64 + self.nns_inp = self.fixed_radius_search( + out_positions, + queries=inp_positions - offset * voxel_size, + radius=self.kernel_size[0] * voxel_size * 0.51, + hash_table_size_factor=hash_table_size_factor, + hash_table=fixed_radius_search_hash_table) + + out_positions_split = None + if isinstance(inp_positions, classes.RaggedTensor): + inp_positions = inp_positions.values + inp_features = inp_features.values + out_positions_split = out_positions.row_splits + out_positions = out_positions.values + + num_out = out_positions.shape[0] + + neighbors_index, neighbors_row_splits, _ = ops.invert_neighbors_list( + self.nns_inp.neighbors_index, self.nns_inp.neighbors_row_splits, + empty_vec, num_out) + + # for stats and debugging + num_pairs = neighbors_index.shape[0] + self._avg_neighbors = num_pairs / out_positions.shape[0] + + extents_rank2 = paddle.full([1, 1], voxel_size * self.kernel_size[0]) + + self._conv_values = { + 'filters': self.kernel, + 'out_positions': out_positions, + 'extents': extents_rank2, + 'offset': offset, + 'inp_positions': inp_positions, + 'inp_features': inp_features, + 'out_importance': out_importance, + 'inp_neighbors_index': self.nns_inp.neighbors_index, + 'inp_neighbors_importance_sum': empty_vec, + 'inp_neighbors_row_splits': self.nns_inp.neighbors_row_splits, + 'neighbors_index': neighbors_index, + 'neighbors_importance': empty_vec, + 'neighbors_row_splits': neighbors_row_splits, + 'align_corners': False, + 'coordinate_mapping': 'identity', + 'interpolation': 'nearest_neighbor', + 'normalize': self.normalize, + 'max_temp_mem_mb': 64, + } + + out_features = ops.continuous_conv_transpose(**self._conv_values) + + self._conv_output = out_features + + if self.use_bias: + out_features += self.bias + if self.activation: + out_features = self.activation(out_features) + + if out_positions_split is not None: + out_features = classes.RaggedTensor.from_row_splits( + out_features, out_positions_split, validate=False, copy=False) + + return out_features diff --git a/python/test/ml_ops/test_general_sparseconv.py b/python/test/ml_ops/test_general_sparseconv.py index 923b6da9bca..28df9cd693c 100644 --- a/python/test/ml_ops/test_general_sparseconv.py +++ b/python/test/ml_ops/test_general_sparseconv.py @@ -39,9 +39,7 @@ def test_sparseconv_gradient(ml, dtype, kernel_size, out_channels, in_channels, rng = np.random.RandomState(123) - conv_attrs = { - 'normalize': with_normalization, - } + conv_attrs = {'normalize': with_normalization, 'max_temp_mem_MB': 64} filters = rng.random(size=(kernel_size, in_channels, out_channels)).astype(dtype) @@ -75,8 +73,14 @@ def test_sparseconv_gradient(ml, dtype, kernel_size, out_channels, in_channels, arange = np.arange(neighbors_index.shape[0]) inv_neighbors_index, inv_neighbors_row_splits, inv_arange = mltest.run_op( - ml, ml.device, False, ml.ops.invert_neighbors_list, num_inp, - neighbors_index, neighbors_row_splits, arange) + ml, + ml.device, + False, + ml.ops.invert_neighbors_list, + num_points=num_inp, + inp_neighbors_index=neighbors_index, + inp_neighbors_row_splits=neighbors_row_splits, + inp_neighbors_attributes=arange) inv_neighbors_kernel_index = neighbors_kernel_index[inv_arange] if with_neighbors_importance: diff --git a/python/test/ml_ops/test_sparseconv.py b/python/test/ml_ops/test_sparseconv.py index 1fd6ed5058b..272646c927a 100644 --- a/python/test/ml_ops/test_sparseconv.py +++ b/python/test/ml_ops/test_sparseconv.py @@ -76,6 +76,11 @@ def kernel_initializer(a): def bias_initializer(a): a.data = torch.from_numpy(bias) + elif ml.module.__name__ == 'paddle': + paddle = ml.module + + kernel_initializer = paddle.nn.initializer.Assign(filters) + bias_initializer = paddle.nn.initializer.Assign(bias) else: raise Exception('Unsupported ml framework {}'.format( ml.module.__name__)) @@ -88,6 +93,8 @@ def bias_initializer(a): bias_initializer=bias_initializer) if ml.module.__name__ == 'torch': sparse_conv.to(ml.device) + elif ml.module.__name__ == 'paddle': + sparse_conv.to('gpu' if ml.device == 'cuda' else 'cpu') y = mltest.run_op(ml, ml.device, True, sparse_conv, inp_features, inp_positions * voxel_size, out_positions * voxel_size, @@ -321,6 +328,11 @@ def kernel_initializer(a): def bias_initializer(a): a.data = torch.from_numpy(bias) + elif ml.module.__name__ == 'paddle': + paddle = ml.module + + kernel_initializer = paddle.nn.initializer.Assign(filters) + bias_initializer = paddle.nn.initializer.Assign(bias) else: raise Exception('Unsupported ml framework {}'.format( ml.module.__name__)) @@ -335,6 +347,8 @@ def bias_initializer(a): if ml.module.__name__ == 'torch': sparse_conv_transpose.to(ml.device) + elif ml.module.__name__ == 'paddle': + sparse_conv_transpose.to('gpu' if ml.device == 'cuda' else 'cpu') y = mltest.run_op(ml, ml.device, True, sparse_conv_transpose, inp_features, inp_positions * voxel_size, out_positions * voxel_size, From f824dc2bf183b6f2205a5e02b821724357cca1d4 Mon Sep 17 00:00:00 2001 From: RDIO <35186529+Woodman3@users.noreply.github.com> Date: Mon, 18 Nov 2024 18:22:08 +0800 Subject: [PATCH 10/19] [Doc] Add doc about paddle backend * [doc] add rst doc * [doc] add install commend * [doc] update install guide * [doc] add doc generate code * [doc] delete verify * [fix] add requirment as upstream * [doc] make install guide as reference --------- Signed-off-by: Woodman3 <1025760745@qq.com> --- README.md | 41 +++++++++++++++++++ docs/documented_modules.txt | 4 ++ docs/make_docs.py | 2 + .../python_api_in/open3d.ml.paddle.layers.rst | 29 +++++++++++++ docs/python_api_in/open3d.ml.paddle.ops.rst | 38 +++++++++++++++++ docs/requirements.txt | 7 +++- 6 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 docs/python_api_in/open3d.ml.paddle.layers.rst create mode 100644 docs/python_api_in/open3d.ml.paddle.ops.rst diff --git a/README.md b/README.md index 80767d4cb36..fde90b5c090 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,47 @@ > > It has verified on version v0.18.0 of Open3D. It is recommended to install **nightly-build(develop)** Paddle before running any code in this branch. +> ## How to build +> +> make sure cmake and pip have already installed +> +> ### Install dependencies +> +> ```bash +> util/install_deps_ubuntu.sh +> pip install yapf==0.30.0 +> ``` +> +> ### Install nightly-build paddlepaddle-gpu +> +> ```bash +> pip uninstall paddlepaddle-gpu +> python -m pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu118/ +> ``` +> ### Config +> +> ```bash +> mkdir build +> cd build +> cmake -DBUILD_CUDA_MODULE=ON \ +> -DBUILD_PADDLE_OPS=ON \ +> -DGLIBCXX_USE_CXX11_ABI=ON \ +> -DBUNDLE_OPEN3D_ML=OFF \ +> .. +> ``` +> +> ### Build +> +> ```bash +> make -j8 +> ``` +> +> ### Install +> +> ```bash +> make install-pip-package -j8 +> ``` +

Homepage | Docs | diff --git a/docs/documented_modules.txt b/docs/documented_modules.txt index 62748dfcd91..a521b7b1e66 100644 --- a/docs/documented_modules.txt +++ b/docs/documented_modules.txt @@ -45,6 +45,10 @@ open3d.ml.torch.modules open3d.ml.torch.modules.losses open3d.ml.torch.modules.metrics open3d.ml.torch.pipelines +open3d.ml.paddle +open3d.ml.paddle.layers +open3d.ml.paddle.ops +open3d.ml.paddle.classes open3d.pipelines open3d.pipelines.color_map open3d.pipelines.integration diff --git a/docs/make_docs.py b/docs/make_docs.py index 0803b36bba8..185410a5927 100644 --- a/docs/make_docs.py +++ b/docs/make_docs.py @@ -103,6 +103,8 @@ def _try_import_module(self, full_module_name): import open3d.ml.tf if open3d._build_config['BUILD_PYTORCH_OPS']: import open3d.ml.torch + if open3d._build_config['BUILD_PADDLE_OPS']: + import open3d.ml.paddle try: # Try to import directly. This will work for pure python submodules diff --git a/docs/python_api_in/open3d.ml.paddle.layers.rst b/docs/python_api_in/open3d.ml.paddle.layers.rst new file mode 100644 index 00000000000..4bd5af4a953 --- /dev/null +++ b/docs/python_api_in/open3d.ml.paddle.layers.rst @@ -0,0 +1,29 @@ +open3d.ml.paddle.layers +---------------------- + +.. currentmodule:: open3d.ml.paddle.layers + +.. automodule:: open3d.ml.paddle.layers + +**Classes** + +.. autosummary:: + + ContinuousConv + FixedRadiusSearch + KNNSearch + RadiusSearch + SparseConv + SparseConvTranspose + VoxelPooling + +.. toctree:: + :hidden: + + ContinuousConv + FixedRadiusSearch + KNNSearch + RadiusSearch + SparseConv + SparseConvTranspose + VoxelPooling diff --git a/docs/python_api_in/open3d.ml.paddle.ops.rst b/docs/python_api_in/open3d.ml.paddle.ops.rst new file mode 100644 index 00000000000..0a027448cd1 --- /dev/null +++ b/docs/python_api_in/open3d.ml.paddle.ops.rst @@ -0,0 +1,38 @@ +open3d.ml.paddle.ops +------------------- + +.. currentmodule:: open3d.ml.paddle.ops + +.. automodule:: open3d.ml.paddle.ops + +**Functions** + +.. autosummary:: + + build_spatial_hash_table + continuous_conv + continuous_conv_transpose + fixed_radius_search + invert_neighbors_list + knn_search + nms + radius_search + reduce_subarrays_sum + voxel_pooling + voxelize + +.. toctree:: + :hidden: + + build_spatial_hash_table + continuous_conv + continuous_conv_transpose + fixed_radius_search + invert_neighbors_list + knn_search + nms + radius_search + reduce_subarrays_sum + voxel_pooling + voxelize + diff --git a/docs/requirements.txt b/docs/requirements.txt index ab297f6eb30..461c2f19de4 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,7 +1,10 @@ docutils==0.20.1 furo==2023.9.10 -jinja2==3.1.2 +jinja2==3.1.4 m2r2==0.3.3.post2 matplotlib==3.7.3 nbsphinx==0.9.3 -sphinx==7.1.2 \ No newline at end of file +sphinx==7.1.2 +nbconvert==6.5.4 +lxml==5.2.1 +lxml_html_clean==0.2.2 \ No newline at end of file From 90462b6ffc4f1b81e1e258be5ec5133b1fba9d28 Mon Sep 17 00:00:00 2001 From: SecretXV <145354053+SecretXV@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:18:22 +0800 Subject: [PATCH 11/19] [CI] support paddle ci (#10) * [CI] support paddle ci * fix * fix --- docker/Dockerfile.paddle | 77 +++++++++++++++ docker/README.md | 14 ++- docker/docker_build.sh | 126 +++++++++++++++++------- python/open3d/ml/paddle/__init__.py | 8 +- python/open3d/ml/paddle/ops/__init__.py | 27 ++++- util/ci_utils.sh | 28 +++++- 6 files changed, 233 insertions(+), 47 deletions(-) create mode 100644 docker/Dockerfile.paddle diff --git a/docker/Dockerfile.paddle b/docker/Dockerfile.paddle new file mode 100644 index 00000000000..c9543e79439 --- /dev/null +++ b/docker/Dockerfile.paddle @@ -0,0 +1,77 @@ +# FROM must be called before other ARGS except for ARG BASE_IMAGE +ARG BASE_IMAGE +FROM ${BASE_IMAGE} + +# Customizable build arguments from cuda.yml +ARG DEVELOPER_BUILD +ARG CMAKE_VERSION +ARG PYTHON_VERSION +ARG BUILD_PADDLE_OPS + +# Forward all ARG to ENV +# ci_utils.sh requires these environment variables +ENV DEVELOPER_BUILD=${DEVELOPER_BUILD} +ENV CMAKE_VERSION=${CMAKE_VERSION} +ENV PYTHON_VERSION=${PYTHON_VERSION} +ENV BUILD_PYTORCH_OPS=OFF +ENV BUILD_TENSORFLOW_OPS=OFF +ENV BUILD_PADDLE_OPS=${BUILD_PADDLE_OPS} + +# Prevent interactive inputs when installing packages +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=America/Los_Angeles +ENV SUDO=command + +# Miniconda requires bash as the default shell. +SHELL ["/bin/bash", "-c"] + +# Dependencies: basic +RUN apt-get update && apt-get install -y \ + git \ + wget \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Dependencies: cmake +RUN CMAKE_VERSION_NUMBERS=$(echo "${CMAKE_VERSION}" | cut -d"-" -f2) \ + && wget -q https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION_NUMBERS}/${CMAKE_VERSION}.tar.gz \ + && tar -xf ${CMAKE_VERSION}.tar.gz \ + && cp -ar ${CMAKE_VERSION} ${HOME} +ENV PATH=${HOME}/${CMAKE_VERSION}/bin:${PATH} + +# Miniconda +ENV PATH="/root/miniconda3/bin:${PATH}" +RUN wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \ + && bash Miniconda3-latest-Linux-x86_64.sh -b \ + && rm Miniconda3-latest-Linux-x86_64.sh \ + && conda --version +ENV PATH="/root/miniconda3/envs/open3d/bin:${PATH}" +RUN conda create -y -n open3d python=${PYTHON_VERSION} \ + && source activate open3d +RUN which python \ + && python --version + +# Open3D C++ dependencies +# Done before copying the full Open3D directory for better Docker caching +COPY ./util/install_deps_ubuntu.sh /root/Open3D/util/ +RUN /root/Open3D/util/install_deps_ubuntu.sh assume-yes \ + && rm -rf /var/lib/apt/lists/* + +# Open3D Python dependencies +COPY ./util/ci_utils.sh /root/Open3D/util/ +COPY ./python/requirements.txt /root/Open3D/python/ +RUN source /root/Open3D/util/ci_utils.sh \ + && install_python_dependencies + +# Open3D repo +# Always keep /root/Open3D as the WORKDIR +COPY . /root/Open3D +WORKDIR /root/Open3D + +# # Build python wheel +RUN export NPROC=$(nproc) \ + && export BUILD_SHARED_LIBS=OFF \ + && source /root/Open3D/util/ci_utils.sh \ + && build_pip_package build_azure_kinect + +RUN echo "Docker build done." diff --git a/docker/README.md b/docker/README.md index d14d9521c19..1866846f6d8 100644 --- a/docker/README.md +++ b/docker/README.md @@ -65,4 +65,16 @@ cd docker ./docker_test.sh openblas-amd64-py38-dev ``` -See `./docker_build.sh` and `./docker_test.sh` for all available options. +Build Docker for Paddle backend: + +```bash +cd docker + +# Build Docker (dev). +BUILD_CUDA_MODULE=ON ./docker_build.sh paddle_cuda_wheel_py310_dev + +# Build Docker (release). +BUILD_CUDA_MODULE=ON ./docker_build.sh paddle_cuda_wheel_py310 +``` + +See `./docker_build.sh` and `./docker_test.sh` for all available options. \ No newline at end of file diff --git a/docker/docker_build.sh b/docker/docker_build.sh index 33ab6ad0115..988839621bd 100755 --- a/docker/docker_build.sh +++ b/docker/docker_build.sh @@ -23,53 +23,57 @@ __usage_docker_build="USAGE: OPTION: # OpenBLAS AMD64 (Dockerfile.openblas) - openblas-amd64-py38-dev : OpenBLAS AMD64 3.8 wheel, developer mode - openblas-amd64-py39-dev : OpenBLAS AMD64 3.9 wheel, developer mode - openblas-amd64-py310-dev : OpenBLAS AMD64 3.10 wheel, developer mode - openblas-amd64-py311-dev : OpenBLAS AMD64 3.11 wheel, developer mode - openblas-amd64-py38 : OpenBLAS AMD64 3.8 wheel, release mode - openblas-amd64-py39 : OpenBLAS AMD64 3.9 wheel, release mode - openblas-amd64-py310 : OpenBLAS AMD64 3.10 wheel, release mode - openblas-amd64-py311 : OpenBLAS AMD64 3.11 wheel, release mode + openblas-amd64-py38-dev : OpenBLAS AMD64 3.8 wheel, developer mode + openblas-amd64-py39-dev : OpenBLAS AMD64 3.9 wheel, developer mode + openblas-amd64-py310-dev : OpenBLAS AMD64 3.10 wheel, developer mode + openblas-amd64-py311-dev : OpenBLAS AMD64 3.11 wheel, developer mode + openblas-amd64-py38 : OpenBLAS AMD64 3.8 wheel, release mode + openblas-amd64-py39 : OpenBLAS AMD64 3.9 wheel, release mode + openblas-amd64-py310 : OpenBLAS AMD64 3.10 wheel, release mode + openblas-amd64-py311 : OpenBLAS AMD64 3.11 wheel, release mode # OpenBLAS ARM64 (Dockerfile.openblas) - openblas-arm64-py38-dev : OpenBLAS ARM64 3.8 wheel, developer mode - openblas-arm64-py39-dev : OpenBLAS ARM64 3.9 wheel, developer mode - openblas-arm64-py310-dev : OpenBLAS ARM64 3.10 wheel, developer mode - openblas-arm64-py311-dev : OpenBLAS ARM64 3.11 wheel, developer mode - openblas-arm64-py38 : OpenBLAS ARM64 3.8 wheel, release mode - openblas-arm64-py39 : OpenBLAS ARM64 3.9 wheel, release mode - openblas-arm64-py310 : OpenBLAS ARM64 3.10 wheel, release mode - openblas-arm64-py311 : OpenBLAS ARM64 3.11 wheel, release mode + openblas-arm64-py38-dev : OpenBLAS ARM64 3.8 wheel, developer mode + openblas-arm64-py39-dev : OpenBLAS ARM64 3.9 wheel, developer mode + openblas-arm64-py310-dev : OpenBLAS ARM64 3.10 wheel, developer mode + openblas-arm64-py311-dev : OpenBLAS ARM64 3.11 wheel, developer mode + openblas-arm64-py38 : OpenBLAS ARM64 3.8 wheel, release mode + openblas-arm64-py39 : OpenBLAS ARM64 3.9 wheel, release mode + openblas-arm64-py310 : OpenBLAS ARM64 3.10 wheel, release mode + openblas-arm64-py311 : OpenBLAS ARM64 3.11 wheel, release mode # Ubuntu CPU CI (Dockerfile.ci) - cpu-static : Ubuntu CPU static - cpu-shared : Ubuntu CPU shared (cxx11_abi) - cpu-shared-release : Ubuntu CPU shared (cxx11_abi), release mode - cpu-shared-ml : Ubuntu CPU shared with ML (pre_cxx11_abi) - cpu-shared-ml-release : Ubuntu CPU shared with ML (pre_cxx11_abi), release mode + cpu-static : Ubuntu CPU static + cpu-shared : Ubuntu CPU shared (cxx11_abi) + cpu-shared-release : Ubuntu CPU shared (cxx11_abi), release mode + cpu-shared-ml : Ubuntu CPU shared with ML (pre_cxx11_abi) + cpu-shared-ml-release : Ubuntu CPU shared with ML (pre_cxx11_abi), release mode # Sycl CPU CI (Dockerfile.ci) - sycl-shared : SYCL (oneAPI) with shared lib - sycl-static : SYCL (oneAPI) with static lib + sycl-shared : SYCL (oneAPI) with shared lib + sycl-static : SYCL (oneAPI) with static lib # ML CIs (Dockerfile.ci) - 2-bionic : CUDA CI, 2-bionic, developer mode - 3-ml-shared-bionic-release : CUDA CI, 3-ml-shared-bionic (pre_cxx11_abi), release mode - 3-ml-shared-bionic : CUDA CI, 3-ml-shared-bionic (pre_cxx11_abi), developer mode - 4-shared-bionic : CUDA CI, 4-shared-bionic (cxx11_abi), developer mode - 4-shared-bionic-release : CUDA CI, 4-shared-bionic (cxx11_abi), release mode - 5-ml-focal : CUDA CI, 5-ml-focal, developer mode + 2-bionic : CUDA CI, 2-bionic, developer mode + 3-ml-shared-bionic-release : CUDA CI, 3-ml-shared-bionic (pre_cxx11_abi), release mode + 3-ml-shared-bionic : CUDA CI, 3-ml-shared-bionic (pre_cxx11_abi), developer mode + 4-shared-bionic : CUDA CI, 4-shared-bionic (cxx11_abi), developer mode + 4-shared-bionic-release : CUDA CI, 4-shared-bionic (cxx11_abi), release mode + 5-ml-focal : CUDA CI, 5-ml-focal, developer mode # CUDA wheels (Dockerfile.wheel) - cuda_wheel_py38_dev : CUDA Python 3.8 wheel, developer mode - cuda_wheel_py39_dev : CUDA Python 3.9 wheel, developer mode - cuda_wheel_py310_dev : CUDA Python 3.10 wheel, developer mode - cuda_wheel_py311_dev : CUDA Python 3.11 wheel, developer mode - cuda_wheel_py38 : CUDA Python 3.8 wheel, release mode - cuda_wheel_py39 : CUDA Python 3.9 wheel, release mode - cuda_wheel_py310 : CUDA Python 3.10 wheel, release mode - cuda_wheel_py311 : CUDA Python 3.11 wheel, release mode + cuda_wheel_py38_dev : CUDA Python 3.8 wheel, developer mode + cuda_wheel_py39_dev : CUDA Python 3.9 wheel, developer mode + cuda_wheel_py310_dev : CUDA Python 3.10 wheel, developer mode + cuda_wheel_py311_dev : CUDA Python 3.11 wheel, developer mode + cuda_wheel_py38 : CUDA Python 3.8 wheel, release mode + cuda_wheel_py39 : CUDA Python 3.9 wheel, release mode + cuda_wheel_py310 : CUDA Python 3.10 wheel, release mode + cuda_wheel_py311 : CUDA Python 3.11 wheel, release mode + + # Paddle wheels (Dockerfile.paddle) + paddle_cuda_wheel_py310_dev : Paddle CUDA Python 3.10 wheel, developer mode + paddle_cuda_wheel_py310 : Paddle CUDA Python 3.10 wheel, release mode " HOST_OPEN3D_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. >/dev/null 2>&1 && pwd)" @@ -79,6 +83,7 @@ CCACHE_VERSION=4.3 CMAKE_VERSION=cmake-3.20.6-linux-x86_64 CMAKE_VERSION_AARCH64=cmake-3.20.6-linux-aarch64 CUDA_VERSION=11.7.1-cudnn8 +PADDLE_CUDA_VERSION=cuda11.8-cudnn8.6-trt8.5 print_usage_and_exit_docker_build() { echo "$__usage_docker_build" @@ -219,6 +224,45 @@ cuda_wheel_build() { && chown $(id -u):$(id -g) /opt/mount/${CCACHE_TAR_NAME}.tar.gz" } +paddle_cuda_wheel_build() { + BASE_IMAGE=registry.baidubce.com/paddlepaddle/paddle:3.0.0b1-gpu-${PADDLE_CUDA_VERSION} + BUILD_PADDLE_OPS=ON + + options="$(echo "$@" | tr ' ' '|')" + echo "[cuda_wheel_build()] options: ${options}" + if [[ "py310" =~ ^($options)$ ]]; then + PYTHON_VERSION=3.10 + else + echo "Invalid python version." + print_usage_and_exit_docker_build + fi + if [[ "dev" =~ ^($options)$ ]]; then + DEVELOPER_BUILD=ON + else + DEVELOPER_BUILD=OFF + fi + echo "[paddle_cuda_wheel_build()] PYTHON_VERSION: ${PYTHON_VERSION}" + echo "[paddle_cuda_wheel_build()] DEVELOPER_BUILD: ${DEVELOPER_BUILD}" + echo "[paddle_cuda_wheel_build()] BUILD_PADDLE_OPS=${BUILD_PADDLE_OPS:?'env var must be set.'}" + + pushd "${HOST_OPEN3D_ROOT}" + docker build \ + --progress plain \ + --build-arg BASE_IMAGE="${BASE_IMAGE}" \ + --build-arg DEVELOPER_BUILD="${DEVELOPER_BUILD}" \ + --build-arg CMAKE_VERSION="${CMAKE_VERSION}" \ + --build-arg PYTHON_VERSION="${PYTHON_VERSION}" \ + --build-arg BUILD_PADDLE_OPS="${BUILD_PADDLE_OPS}" \ + -t open3d-ci:wheel \ + -f docker/Dockerfile.paddle . + popd + + python_package_dir=/root/Open3D/build/lib/python_package + docker run -v "${PWD}:/opt/mount" --rm open3d-ci:wheel \ + bash -c "cp ${python_package_dir}/pip_package/open3d*.whl /opt/mount \ + && chown $(id -u):$(id -g) /opt/mount/open3d*.whl" +} + ci_build() { echo "[ci_build()] DOCKER_TAG=${DOCKER_TAG}" echo "[ci_build()] BASE_IMAGE=${BASE_IMAGE}" @@ -598,6 +642,14 @@ function main() { cuda_wheel_py311) cuda_wheel_build py311 ;; + + # Paddle CUDA wheels + paddle_cuda_wheel_py310_dev) + paddle_cuda_wheel_build py310 dev + ;; + paddle_cuda_wheel_py310) + paddle_cuda_wheel_build py310 + ;; # ML CIs 2-bionic) diff --git a/python/open3d/ml/paddle/__init__.py b/python/open3d/ml/paddle/__init__.py index 431d7f04004..df0ae41c41a 100644 --- a/python/open3d/ml/paddle/__init__.py +++ b/python/open3d/ml/paddle/__init__.py @@ -19,8 +19,14 @@ 'version {} is installed!'.format(match_paddle_ver, _paddle.__version__)) +_loaded = False +try: + from . import ops + _loaded = True +except Exception as e: + raise e + from . import layers -from . import ops from . import classes # put contrib at the same level diff --git a/python/open3d/ml/paddle/ops/__init__.py b/python/open3d/ml/paddle/ops/__init__.py index 7598d17a876..294bdbdf30d 100644 --- a/python/open3d/ml/paddle/ops/__init__.py +++ b/python/open3d/ml/paddle/ops/__init__.py @@ -46,11 +46,28 @@ for la in _lib_arch ]) -# only load first lib -_load_lib_path = _lib_path[0] -# load custom op shared library with abs path -_custom_ops = _paddle.utils.cpp_extension.load_op_meta_info_and_register_op( - _load_lib_path) +_loaded_lib = False +_loaded_except = None +for _lp in _lib_path: + try: + _load_lib_path = _lp + # load custom op shared library with abs path + _custom_ops = _paddle.utils.cpp_extension.load_op_meta_info_and_register_op( + _load_lib_path) + _loaded_lib = True + + break + + except Exception as e: + _loaded_except = e + + if not _os.path.isfile(_lp): + print('The op library at "{}" was not found. Make sure that ' + 'BUILD_PADDLE_OPS was enabled.'.format( + _os.path.realpath(_lp))) + +if not _loaded_lib: + raise _loaded_except try: _spec = _importlib_util.spec_from_file_location(__name__, _load_lib_path) diff --git a/util/ci_utils.sh b/util/ci_utils.sh index 38ff654880e..f3e3d5cd222 100644 --- a/util/ci_utils.sh +++ b/util/ci_utils.sh @@ -20,6 +20,7 @@ if [ -z "${BUILD_CUDA_MODULE:+x}" ]; then fi BUILD_TENSORFLOW_OPS=${BUILD_TENSORFLOW_OPS:-ON} BUILD_PYTORCH_OPS=${BUILD_PYTORCH_OPS:-ON} +BUILD_PADDLE_OPS=${BUILD_PADDLE_OPS:-ON} LOW_MEM_USAGE=${LOW_MEM_USAGE:-OFF} # Dependency versions: @@ -51,10 +52,14 @@ install_python_dependencies() { python -m pip install -U -r python/requirements_test.txt fi if [[ "with-cuda" =~ ^($options)$ ]]; then + PADDLE_GLNX=paddlepaddle-gpu + PADDLE_GLNX_PIP_INDEX=https://www.paddlepaddle.org.cn/packages/nightly/cu118/ TF_ARCH_NAME=tensorflow TF_ARCH_DISABLE_NAME=tensorflow-cpu TORCH_GLNX="torch==$TORCH_CUDA_GLNX_VER" else + PADDLE_GLNX=paddlepaddle + PADDLE_GLNX_PIP_INDEX=https://www.paddlepaddle.org.cn/packages/nightly/cpu/ TF_ARCH_NAME=tensorflow-cpu TF_ARCH_DISABLE_NAME=tensorflow TORCH_GLNX="torch==$TORCH_CPU_GLNX_VER" @@ -83,7 +88,16 @@ install_python_dependencies() { exit 1 fi fi - if [ "$BUILD_TENSORFLOW_OPS" == "ON" ] || [ "$BUILD_PYTORCH_OPS" == "ON" ]; then + if [ "$BUILD_PADDLE_OPS" == "ON" ]; then # ML/requirements-torch.txt + if [[ "$OSTYPE" == "linux-gnu"* ]]; then + python -m pip uninstall paddlepaddle paddlepaddle-gpu -y + python -m pip install --pre $PADDLE_GLNX -i $PADDLE_GLNX_PIP_INDEX + else + echo "unknown OS $OSTYPE" + exit 1 + fi + fi + if [ "$BUILD_TENSORFLOW_OPS" == "ON" ] || [ "$BUILD_PYTORCH_OPS" == "ON" ] || [ "$BUILD_PADDLE_OPS" == "ON" ]; then python -m pip install -U yapf=="$YAPF_VER" # Fix Protobuf compatibility issue # https://stackoverflow.com/a/72493690/1255535 @@ -116,6 +130,7 @@ build_all() { -DGLIBCXX_USE_CXX11_ABI=OFF -DBUILD_TENSORFLOW_OPS="$BUILD_TENSORFLOW_OPS" -DBUILD_PYTORCH_OPS="$BUILD_PYTORCH_OPS" + -DBUILD_PADDLE_OPS="$BUILD_ADDLE_OPS" -DCMAKE_INSTALL_PREFIX="$OPEN3D_INSTALL_DIR" -DBUILD_UNIT_TESTS=ON -DBUILD_BENCHMARKS=ON @@ -173,6 +188,8 @@ build_pip_package() { CXX11_ABI=$(python -c "import tensorflow as tf; print('ON' if tf.__cxx11_abi_flag__ else 'OFF')") elif [ "$BUILD_PYTORCH_OPS" == "ON" ]; then CXX11_ABI=$(python -c "import torch; print('ON' if torch._C._GLIBCXX_USE_CXX11_ABI else 'OFF')") + elif [ "$BUILD_PADDLE_OPS" == "ON" ]; then + CXX11_ABI="ON" fi echo Building with GLIBCXX_USE_CXX11_ABI="$CXX11_ABI" set -u @@ -189,6 +206,7 @@ build_pip_package() { "-DGLIBCXX_USE_CXX11_ABI=$CXX11_ABI" "-DBUILD_TENSORFLOW_OPS=$BUILD_TENSORFLOW_OPS" "-DBUILD_PYTORCH_OPS=$BUILD_PYTORCH_OPS" + "-DBUILD_PADDLE_OPS=$BUILD_PADDLE_OPS" "-DBUILD_FILAMENT_FROM_SOURCE=$BUILD_FILAMENT_FROM_SOURCE" "-DBUILD_JUPYTER_EXTENSION=$BUILD_JUPYTER_EXTENSION" "-DCMAKE_INSTALL_PREFIX=$OPEN3D_INSTALL_DIR" @@ -206,7 +224,7 @@ build_pip_package() { make VERBOSE=1 -j"$NPROC" pip-package mv lib/python_package/pip_package/open3d*.whl . # save CPU wheel - if [ "$BUILD_CUDA_MODULE" == ON ]; then + if [ "$BUILD_CUDA_MODULE" == "ON" ]; then echo echo Installing CUDA versions of TensorFlow and PyTorch... install_python_dependencies with-cuda purge-cache @@ -267,6 +285,10 @@ test_wheel() { python -c \ "import open3d.ml.torch; print('PyTorch Ops library loaded:', open3d.ml.torch._loaded)" fi + if [ "$BUILD_PADDLE_OPS" == ON ]; then + python -c \ + "import open3d.ml.paddle; print('Paddle Ops library loaded:', open3d.ml.paddle._loaded)" + fi if [ "$BUILD_TENSORFLOW_OPS" == ON ]; then # python -m pip install -r "$OPEN3D_ML_ROOT/requirements-tensorflow.txt" python -c \ @@ -288,7 +310,7 @@ run_python_tests() { python -m pip install -U -r python/requirements_test.txt echo Add --randomly-seed=SEED to the test command to reproduce test order. pytest_args=("$OPEN3D_SOURCE_ROOT"/python/test/) - if [ "$BUILD_PYTORCH_OPS" == "OFF" ] && [ "$BUILD_TENSORFLOW_OPS" == "OFF" ]; then + if [ "$BUILD_PYTORCH_OPS" == "OFF" ] && [ "$BUILD_TENSORFLOW_OPS" == "OFF" ] && [ "$BUILD_PADDLE_OPS" == "OFF" ]; then echo Testing ML Ops disabled pytest_args+=(--ignore "$OPEN3D_SOURCE_ROOT"/python/test/ml_ops/) fi From a87bb30686e98ad68e5865b0e8ae6fdb7a5e2dda Mon Sep 17 00:00:00 2001 From: SecretXV <145354053+SecretXV@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:53:07 +0800 Subject: [PATCH 12/19] Revert "[CI] support paddle ci (#10)" (#11) This reverts commit 90462b6ffc4f1b81e1e258be5ec5133b1fba9d28. --- docker/Dockerfile.paddle | 77 --------------- docker/README.md | 14 +-- docker/docker_build.sh | 126 +++++++----------------- python/open3d/ml/paddle/__init__.py | 8 +- python/open3d/ml/paddle/ops/__init__.py | 27 +---- util/ci_utils.sh | 28 +----- 6 files changed, 47 insertions(+), 233 deletions(-) delete mode 100644 docker/Dockerfile.paddle diff --git a/docker/Dockerfile.paddle b/docker/Dockerfile.paddle deleted file mode 100644 index c9543e79439..00000000000 --- a/docker/Dockerfile.paddle +++ /dev/null @@ -1,77 +0,0 @@ -# FROM must be called before other ARGS except for ARG BASE_IMAGE -ARG BASE_IMAGE -FROM ${BASE_IMAGE} - -# Customizable build arguments from cuda.yml -ARG DEVELOPER_BUILD -ARG CMAKE_VERSION -ARG PYTHON_VERSION -ARG BUILD_PADDLE_OPS - -# Forward all ARG to ENV -# ci_utils.sh requires these environment variables -ENV DEVELOPER_BUILD=${DEVELOPER_BUILD} -ENV CMAKE_VERSION=${CMAKE_VERSION} -ENV PYTHON_VERSION=${PYTHON_VERSION} -ENV BUILD_PYTORCH_OPS=OFF -ENV BUILD_TENSORFLOW_OPS=OFF -ENV BUILD_PADDLE_OPS=${BUILD_PADDLE_OPS} - -# Prevent interactive inputs when installing packages -ENV DEBIAN_FRONTEND=noninteractive -ENV TZ=America/Los_Angeles -ENV SUDO=command - -# Miniconda requires bash as the default shell. -SHELL ["/bin/bash", "-c"] - -# Dependencies: basic -RUN apt-get update && apt-get install -y \ - git \ - wget \ - curl \ - && rm -rf /var/lib/apt/lists/* - -# Dependencies: cmake -RUN CMAKE_VERSION_NUMBERS=$(echo "${CMAKE_VERSION}" | cut -d"-" -f2) \ - && wget -q https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION_NUMBERS}/${CMAKE_VERSION}.tar.gz \ - && tar -xf ${CMAKE_VERSION}.tar.gz \ - && cp -ar ${CMAKE_VERSION} ${HOME} -ENV PATH=${HOME}/${CMAKE_VERSION}/bin:${PATH} - -# Miniconda -ENV PATH="/root/miniconda3/bin:${PATH}" -RUN wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \ - && bash Miniconda3-latest-Linux-x86_64.sh -b \ - && rm Miniconda3-latest-Linux-x86_64.sh \ - && conda --version -ENV PATH="/root/miniconda3/envs/open3d/bin:${PATH}" -RUN conda create -y -n open3d python=${PYTHON_VERSION} \ - && source activate open3d -RUN which python \ - && python --version - -# Open3D C++ dependencies -# Done before copying the full Open3D directory for better Docker caching -COPY ./util/install_deps_ubuntu.sh /root/Open3D/util/ -RUN /root/Open3D/util/install_deps_ubuntu.sh assume-yes \ - && rm -rf /var/lib/apt/lists/* - -# Open3D Python dependencies -COPY ./util/ci_utils.sh /root/Open3D/util/ -COPY ./python/requirements.txt /root/Open3D/python/ -RUN source /root/Open3D/util/ci_utils.sh \ - && install_python_dependencies - -# Open3D repo -# Always keep /root/Open3D as the WORKDIR -COPY . /root/Open3D -WORKDIR /root/Open3D - -# # Build python wheel -RUN export NPROC=$(nproc) \ - && export BUILD_SHARED_LIBS=OFF \ - && source /root/Open3D/util/ci_utils.sh \ - && build_pip_package build_azure_kinect - -RUN echo "Docker build done." diff --git a/docker/README.md b/docker/README.md index 1866846f6d8..d14d9521c19 100644 --- a/docker/README.md +++ b/docker/README.md @@ -65,16 +65,4 @@ cd docker ./docker_test.sh openblas-amd64-py38-dev ``` -Build Docker for Paddle backend: - -```bash -cd docker - -# Build Docker (dev). -BUILD_CUDA_MODULE=ON ./docker_build.sh paddle_cuda_wheel_py310_dev - -# Build Docker (release). -BUILD_CUDA_MODULE=ON ./docker_build.sh paddle_cuda_wheel_py310 -``` - -See `./docker_build.sh` and `./docker_test.sh` for all available options. \ No newline at end of file +See `./docker_build.sh` and `./docker_test.sh` for all available options. diff --git a/docker/docker_build.sh b/docker/docker_build.sh index 988839621bd..33ab6ad0115 100755 --- a/docker/docker_build.sh +++ b/docker/docker_build.sh @@ -23,57 +23,53 @@ __usage_docker_build="USAGE: OPTION: # OpenBLAS AMD64 (Dockerfile.openblas) - openblas-amd64-py38-dev : OpenBLAS AMD64 3.8 wheel, developer mode - openblas-amd64-py39-dev : OpenBLAS AMD64 3.9 wheel, developer mode - openblas-amd64-py310-dev : OpenBLAS AMD64 3.10 wheel, developer mode - openblas-amd64-py311-dev : OpenBLAS AMD64 3.11 wheel, developer mode - openblas-amd64-py38 : OpenBLAS AMD64 3.8 wheel, release mode - openblas-amd64-py39 : OpenBLAS AMD64 3.9 wheel, release mode - openblas-amd64-py310 : OpenBLAS AMD64 3.10 wheel, release mode - openblas-amd64-py311 : OpenBLAS AMD64 3.11 wheel, release mode + openblas-amd64-py38-dev : OpenBLAS AMD64 3.8 wheel, developer mode + openblas-amd64-py39-dev : OpenBLAS AMD64 3.9 wheel, developer mode + openblas-amd64-py310-dev : OpenBLAS AMD64 3.10 wheel, developer mode + openblas-amd64-py311-dev : OpenBLAS AMD64 3.11 wheel, developer mode + openblas-amd64-py38 : OpenBLAS AMD64 3.8 wheel, release mode + openblas-amd64-py39 : OpenBLAS AMD64 3.9 wheel, release mode + openblas-amd64-py310 : OpenBLAS AMD64 3.10 wheel, release mode + openblas-amd64-py311 : OpenBLAS AMD64 3.11 wheel, release mode # OpenBLAS ARM64 (Dockerfile.openblas) - openblas-arm64-py38-dev : OpenBLAS ARM64 3.8 wheel, developer mode - openblas-arm64-py39-dev : OpenBLAS ARM64 3.9 wheel, developer mode - openblas-arm64-py310-dev : OpenBLAS ARM64 3.10 wheel, developer mode - openblas-arm64-py311-dev : OpenBLAS ARM64 3.11 wheel, developer mode - openblas-arm64-py38 : OpenBLAS ARM64 3.8 wheel, release mode - openblas-arm64-py39 : OpenBLAS ARM64 3.9 wheel, release mode - openblas-arm64-py310 : OpenBLAS ARM64 3.10 wheel, release mode - openblas-arm64-py311 : OpenBLAS ARM64 3.11 wheel, release mode + openblas-arm64-py38-dev : OpenBLAS ARM64 3.8 wheel, developer mode + openblas-arm64-py39-dev : OpenBLAS ARM64 3.9 wheel, developer mode + openblas-arm64-py310-dev : OpenBLAS ARM64 3.10 wheel, developer mode + openblas-arm64-py311-dev : OpenBLAS ARM64 3.11 wheel, developer mode + openblas-arm64-py38 : OpenBLAS ARM64 3.8 wheel, release mode + openblas-arm64-py39 : OpenBLAS ARM64 3.9 wheel, release mode + openblas-arm64-py310 : OpenBLAS ARM64 3.10 wheel, release mode + openblas-arm64-py311 : OpenBLAS ARM64 3.11 wheel, release mode # Ubuntu CPU CI (Dockerfile.ci) - cpu-static : Ubuntu CPU static - cpu-shared : Ubuntu CPU shared (cxx11_abi) - cpu-shared-release : Ubuntu CPU shared (cxx11_abi), release mode - cpu-shared-ml : Ubuntu CPU shared with ML (pre_cxx11_abi) - cpu-shared-ml-release : Ubuntu CPU shared with ML (pre_cxx11_abi), release mode + cpu-static : Ubuntu CPU static + cpu-shared : Ubuntu CPU shared (cxx11_abi) + cpu-shared-release : Ubuntu CPU shared (cxx11_abi), release mode + cpu-shared-ml : Ubuntu CPU shared with ML (pre_cxx11_abi) + cpu-shared-ml-release : Ubuntu CPU shared with ML (pre_cxx11_abi), release mode # Sycl CPU CI (Dockerfile.ci) - sycl-shared : SYCL (oneAPI) with shared lib - sycl-static : SYCL (oneAPI) with static lib + sycl-shared : SYCL (oneAPI) with shared lib + sycl-static : SYCL (oneAPI) with static lib # ML CIs (Dockerfile.ci) - 2-bionic : CUDA CI, 2-bionic, developer mode - 3-ml-shared-bionic-release : CUDA CI, 3-ml-shared-bionic (pre_cxx11_abi), release mode - 3-ml-shared-bionic : CUDA CI, 3-ml-shared-bionic (pre_cxx11_abi), developer mode - 4-shared-bionic : CUDA CI, 4-shared-bionic (cxx11_abi), developer mode - 4-shared-bionic-release : CUDA CI, 4-shared-bionic (cxx11_abi), release mode - 5-ml-focal : CUDA CI, 5-ml-focal, developer mode + 2-bionic : CUDA CI, 2-bionic, developer mode + 3-ml-shared-bionic-release : CUDA CI, 3-ml-shared-bionic (pre_cxx11_abi), release mode + 3-ml-shared-bionic : CUDA CI, 3-ml-shared-bionic (pre_cxx11_abi), developer mode + 4-shared-bionic : CUDA CI, 4-shared-bionic (cxx11_abi), developer mode + 4-shared-bionic-release : CUDA CI, 4-shared-bionic (cxx11_abi), release mode + 5-ml-focal : CUDA CI, 5-ml-focal, developer mode # CUDA wheels (Dockerfile.wheel) - cuda_wheel_py38_dev : CUDA Python 3.8 wheel, developer mode - cuda_wheel_py39_dev : CUDA Python 3.9 wheel, developer mode - cuda_wheel_py310_dev : CUDA Python 3.10 wheel, developer mode - cuda_wheel_py311_dev : CUDA Python 3.11 wheel, developer mode - cuda_wheel_py38 : CUDA Python 3.8 wheel, release mode - cuda_wheel_py39 : CUDA Python 3.9 wheel, release mode - cuda_wheel_py310 : CUDA Python 3.10 wheel, release mode - cuda_wheel_py311 : CUDA Python 3.11 wheel, release mode - - # Paddle wheels (Dockerfile.paddle) - paddle_cuda_wheel_py310_dev : Paddle CUDA Python 3.10 wheel, developer mode - paddle_cuda_wheel_py310 : Paddle CUDA Python 3.10 wheel, release mode + cuda_wheel_py38_dev : CUDA Python 3.8 wheel, developer mode + cuda_wheel_py39_dev : CUDA Python 3.9 wheel, developer mode + cuda_wheel_py310_dev : CUDA Python 3.10 wheel, developer mode + cuda_wheel_py311_dev : CUDA Python 3.11 wheel, developer mode + cuda_wheel_py38 : CUDA Python 3.8 wheel, release mode + cuda_wheel_py39 : CUDA Python 3.9 wheel, release mode + cuda_wheel_py310 : CUDA Python 3.10 wheel, release mode + cuda_wheel_py311 : CUDA Python 3.11 wheel, release mode " HOST_OPEN3D_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. >/dev/null 2>&1 && pwd)" @@ -83,7 +79,6 @@ CCACHE_VERSION=4.3 CMAKE_VERSION=cmake-3.20.6-linux-x86_64 CMAKE_VERSION_AARCH64=cmake-3.20.6-linux-aarch64 CUDA_VERSION=11.7.1-cudnn8 -PADDLE_CUDA_VERSION=cuda11.8-cudnn8.6-trt8.5 print_usage_and_exit_docker_build() { echo "$__usage_docker_build" @@ -224,45 +219,6 @@ cuda_wheel_build() { && chown $(id -u):$(id -g) /opt/mount/${CCACHE_TAR_NAME}.tar.gz" } -paddle_cuda_wheel_build() { - BASE_IMAGE=registry.baidubce.com/paddlepaddle/paddle:3.0.0b1-gpu-${PADDLE_CUDA_VERSION} - BUILD_PADDLE_OPS=ON - - options="$(echo "$@" | tr ' ' '|')" - echo "[cuda_wheel_build()] options: ${options}" - if [[ "py310" =~ ^($options)$ ]]; then - PYTHON_VERSION=3.10 - else - echo "Invalid python version." - print_usage_and_exit_docker_build - fi - if [[ "dev" =~ ^($options)$ ]]; then - DEVELOPER_BUILD=ON - else - DEVELOPER_BUILD=OFF - fi - echo "[paddle_cuda_wheel_build()] PYTHON_VERSION: ${PYTHON_VERSION}" - echo "[paddle_cuda_wheel_build()] DEVELOPER_BUILD: ${DEVELOPER_BUILD}" - echo "[paddle_cuda_wheel_build()] BUILD_PADDLE_OPS=${BUILD_PADDLE_OPS:?'env var must be set.'}" - - pushd "${HOST_OPEN3D_ROOT}" - docker build \ - --progress plain \ - --build-arg BASE_IMAGE="${BASE_IMAGE}" \ - --build-arg DEVELOPER_BUILD="${DEVELOPER_BUILD}" \ - --build-arg CMAKE_VERSION="${CMAKE_VERSION}" \ - --build-arg PYTHON_VERSION="${PYTHON_VERSION}" \ - --build-arg BUILD_PADDLE_OPS="${BUILD_PADDLE_OPS}" \ - -t open3d-ci:wheel \ - -f docker/Dockerfile.paddle . - popd - - python_package_dir=/root/Open3D/build/lib/python_package - docker run -v "${PWD}:/opt/mount" --rm open3d-ci:wheel \ - bash -c "cp ${python_package_dir}/pip_package/open3d*.whl /opt/mount \ - && chown $(id -u):$(id -g) /opt/mount/open3d*.whl" -} - ci_build() { echo "[ci_build()] DOCKER_TAG=${DOCKER_TAG}" echo "[ci_build()] BASE_IMAGE=${BASE_IMAGE}" @@ -642,14 +598,6 @@ function main() { cuda_wheel_py311) cuda_wheel_build py311 ;; - - # Paddle CUDA wheels - paddle_cuda_wheel_py310_dev) - paddle_cuda_wheel_build py310 dev - ;; - paddle_cuda_wheel_py310) - paddle_cuda_wheel_build py310 - ;; # ML CIs 2-bionic) diff --git a/python/open3d/ml/paddle/__init__.py b/python/open3d/ml/paddle/__init__.py index df0ae41c41a..431d7f04004 100644 --- a/python/open3d/ml/paddle/__init__.py +++ b/python/open3d/ml/paddle/__init__.py @@ -19,14 +19,8 @@ 'version {} is installed!'.format(match_paddle_ver, _paddle.__version__)) -_loaded = False -try: - from . import ops - _loaded = True -except Exception as e: - raise e - from . import layers +from . import ops from . import classes # put contrib at the same level diff --git a/python/open3d/ml/paddle/ops/__init__.py b/python/open3d/ml/paddle/ops/__init__.py index 294bdbdf30d..7598d17a876 100644 --- a/python/open3d/ml/paddle/ops/__init__.py +++ b/python/open3d/ml/paddle/ops/__init__.py @@ -46,28 +46,11 @@ for la in _lib_arch ]) -_loaded_lib = False -_loaded_except = None -for _lp in _lib_path: - try: - _load_lib_path = _lp - # load custom op shared library with abs path - _custom_ops = _paddle.utils.cpp_extension.load_op_meta_info_and_register_op( - _load_lib_path) - _loaded_lib = True - - break - - except Exception as e: - _loaded_except = e - - if not _os.path.isfile(_lp): - print('The op library at "{}" was not found. Make sure that ' - 'BUILD_PADDLE_OPS was enabled.'.format( - _os.path.realpath(_lp))) - -if not _loaded_lib: - raise _loaded_except +# only load first lib +_load_lib_path = _lib_path[0] +# load custom op shared library with abs path +_custom_ops = _paddle.utils.cpp_extension.load_op_meta_info_and_register_op( + _load_lib_path) try: _spec = _importlib_util.spec_from_file_location(__name__, _load_lib_path) diff --git a/util/ci_utils.sh b/util/ci_utils.sh index f3e3d5cd222..38ff654880e 100644 --- a/util/ci_utils.sh +++ b/util/ci_utils.sh @@ -20,7 +20,6 @@ if [ -z "${BUILD_CUDA_MODULE:+x}" ]; then fi BUILD_TENSORFLOW_OPS=${BUILD_TENSORFLOW_OPS:-ON} BUILD_PYTORCH_OPS=${BUILD_PYTORCH_OPS:-ON} -BUILD_PADDLE_OPS=${BUILD_PADDLE_OPS:-ON} LOW_MEM_USAGE=${LOW_MEM_USAGE:-OFF} # Dependency versions: @@ -52,14 +51,10 @@ install_python_dependencies() { python -m pip install -U -r python/requirements_test.txt fi if [[ "with-cuda" =~ ^($options)$ ]]; then - PADDLE_GLNX=paddlepaddle-gpu - PADDLE_GLNX_PIP_INDEX=https://www.paddlepaddle.org.cn/packages/nightly/cu118/ TF_ARCH_NAME=tensorflow TF_ARCH_DISABLE_NAME=tensorflow-cpu TORCH_GLNX="torch==$TORCH_CUDA_GLNX_VER" else - PADDLE_GLNX=paddlepaddle - PADDLE_GLNX_PIP_INDEX=https://www.paddlepaddle.org.cn/packages/nightly/cpu/ TF_ARCH_NAME=tensorflow-cpu TF_ARCH_DISABLE_NAME=tensorflow TORCH_GLNX="torch==$TORCH_CPU_GLNX_VER" @@ -88,16 +83,7 @@ install_python_dependencies() { exit 1 fi fi - if [ "$BUILD_PADDLE_OPS" == "ON" ]; then # ML/requirements-torch.txt - if [[ "$OSTYPE" == "linux-gnu"* ]]; then - python -m pip uninstall paddlepaddle paddlepaddle-gpu -y - python -m pip install --pre $PADDLE_GLNX -i $PADDLE_GLNX_PIP_INDEX - else - echo "unknown OS $OSTYPE" - exit 1 - fi - fi - if [ "$BUILD_TENSORFLOW_OPS" == "ON" ] || [ "$BUILD_PYTORCH_OPS" == "ON" ] || [ "$BUILD_PADDLE_OPS" == "ON" ]; then + if [ "$BUILD_TENSORFLOW_OPS" == "ON" ] || [ "$BUILD_PYTORCH_OPS" == "ON" ]; then python -m pip install -U yapf=="$YAPF_VER" # Fix Protobuf compatibility issue # https://stackoverflow.com/a/72493690/1255535 @@ -130,7 +116,6 @@ build_all() { -DGLIBCXX_USE_CXX11_ABI=OFF -DBUILD_TENSORFLOW_OPS="$BUILD_TENSORFLOW_OPS" -DBUILD_PYTORCH_OPS="$BUILD_PYTORCH_OPS" - -DBUILD_PADDLE_OPS="$BUILD_ADDLE_OPS" -DCMAKE_INSTALL_PREFIX="$OPEN3D_INSTALL_DIR" -DBUILD_UNIT_TESTS=ON -DBUILD_BENCHMARKS=ON @@ -188,8 +173,6 @@ build_pip_package() { CXX11_ABI=$(python -c "import tensorflow as tf; print('ON' if tf.__cxx11_abi_flag__ else 'OFF')") elif [ "$BUILD_PYTORCH_OPS" == "ON" ]; then CXX11_ABI=$(python -c "import torch; print('ON' if torch._C._GLIBCXX_USE_CXX11_ABI else 'OFF')") - elif [ "$BUILD_PADDLE_OPS" == "ON" ]; then - CXX11_ABI="ON" fi echo Building with GLIBCXX_USE_CXX11_ABI="$CXX11_ABI" set -u @@ -206,7 +189,6 @@ build_pip_package() { "-DGLIBCXX_USE_CXX11_ABI=$CXX11_ABI" "-DBUILD_TENSORFLOW_OPS=$BUILD_TENSORFLOW_OPS" "-DBUILD_PYTORCH_OPS=$BUILD_PYTORCH_OPS" - "-DBUILD_PADDLE_OPS=$BUILD_PADDLE_OPS" "-DBUILD_FILAMENT_FROM_SOURCE=$BUILD_FILAMENT_FROM_SOURCE" "-DBUILD_JUPYTER_EXTENSION=$BUILD_JUPYTER_EXTENSION" "-DCMAKE_INSTALL_PREFIX=$OPEN3D_INSTALL_DIR" @@ -224,7 +206,7 @@ build_pip_package() { make VERBOSE=1 -j"$NPROC" pip-package mv lib/python_package/pip_package/open3d*.whl . # save CPU wheel - if [ "$BUILD_CUDA_MODULE" == "ON" ]; then + if [ "$BUILD_CUDA_MODULE" == ON ]; then echo echo Installing CUDA versions of TensorFlow and PyTorch... install_python_dependencies with-cuda purge-cache @@ -285,10 +267,6 @@ test_wheel() { python -c \ "import open3d.ml.torch; print('PyTorch Ops library loaded:', open3d.ml.torch._loaded)" fi - if [ "$BUILD_PADDLE_OPS" == ON ]; then - python -c \ - "import open3d.ml.paddle; print('Paddle Ops library loaded:', open3d.ml.paddle._loaded)" - fi if [ "$BUILD_TENSORFLOW_OPS" == ON ]; then # python -m pip install -r "$OPEN3D_ML_ROOT/requirements-tensorflow.txt" python -c \ @@ -310,7 +288,7 @@ run_python_tests() { python -m pip install -U -r python/requirements_test.txt echo Add --randomly-seed=SEED to the test command to reproduce test order. pytest_args=("$OPEN3D_SOURCE_ROOT"/python/test/) - if [ "$BUILD_PYTORCH_OPS" == "OFF" ] && [ "$BUILD_TENSORFLOW_OPS" == "OFF" ] && [ "$BUILD_PADDLE_OPS" == "OFF" ]; then + if [ "$BUILD_PYTORCH_OPS" == "OFF" ] && [ "$BUILD_TENSORFLOW_OPS" == "OFF" ]; then echo Testing ML Ops disabled pytest_args+=(--ignore "$OPEN3D_SOURCE_ROOT"/python/test/ml_ops/) fi From 22ef23e84eee9798e5e3e40719d85562ccda29e1 Mon Sep 17 00:00:00 2001 From: SecretXV <145354053+SecretXV@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:57:53 +0800 Subject: [PATCH 13/19] [CI] support paddle ci (#12) --- README.md | 81 ++++++++------- docker/Dockerfile.paddle | 83 ++++++++++++++++ docker/README.md | 14 ++- docker/docker_build.sh | 126 +++++++++++++++++------- python/open3d/ml/paddle/__init__.py | 8 +- python/open3d/ml/paddle/ops/__init__.py | 27 ++++- util/ci_utils.sh | 41 +++++++- util/run_python_unittest.sh | 27 +++++ 8 files changed, 318 insertions(+), 89 deletions(-) create mode 100644 docker/Dockerfile.paddle create mode 100755 util/run_python_unittest.sh diff --git a/README.md b/README.md index fde90b5c090..922a7a0c8b3 100644 --- a/README.md +++ b/README.md @@ -9,48 +9,47 @@ > [!IMPORTANT] > This branch(paddle) experimentally integrates [Paddle backend](https://www.paddlepaddle.org.cn/en/install/quick?docurl=/documentation/docs/en/develop/install/pip/linux-pip_en.html) to Open3D meachine learning module. > -> It has verified on version v0.18.0 of Open3D. It is recommended to install **nightly-build(develop)** Paddle before running any code in this branch. +> It was developed base version v0.18.0 of Open3D. It is recommended to install **nightly-build(develop)** Paddle before running any code in this branch. +> +> It was verified on Ubuntu 20.04. It may meet some problems if you are using other environment. -> ## How to build -> -> make sure cmake and pip have already installed -> -> ### Install dependencies -> -> ```bash -> util/install_deps_ubuntu.sh -> pip install yapf==0.30.0 -> ``` -> -> ### Install nightly-build paddlepaddle-gpu -> -> ```bash -> pip uninstall paddlepaddle-gpu -> python -m pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu118/ -> ``` -> ### Config -> -> ```bash -> mkdir build -> cd build -> cmake -DBUILD_CUDA_MODULE=ON \ -> -DBUILD_PADDLE_OPS=ON \ -> -DGLIBCXX_USE_CXX11_ABI=ON \ -> -DBUNDLE_OPEN3D_ML=OFF \ -> .. -> ``` -> -> ### Build -> -> ```bash -> make -j8 -> ``` -> -> ### Install -> -> ```bash -> make install-pip-package -j8 -> ``` +## **Build and Install** + +```bash +# install dependencies +util/install_deps_ubuntu.sh +pip install yapf==0.30.0 + +# install nightly-build paddlepaddle-gpu +pip uninstall paddlepaddle-gpu +python -m pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu118/ + +# configure +mkdir build +cd build +cmake -DBUILD_CUDA_MODULE=ON \ + -DBUILD_PADDLE_OPS=ON \ + -DGLIBCXX_USE_CXX11_ABI=ON \ + -DBUNDLE_OPEN3D_ML=OFF \ + .. + +# install +make install-pip-package -j8 + +``` + +Open3D for paddle backend also provide [Dockerfile](docker/Dockerfile.paddle) to help build from docker. More details please refer to the [document](docker/README.md). + +## **Unit Test** + +Please make sure you have installed Open3D for paddle backend correctly before running unit tests + +```bash +util/run_python_unittest.sh +``` + + +# Below is Open3D's original README

Homepage | diff --git a/docker/Dockerfile.paddle b/docker/Dockerfile.paddle new file mode 100644 index 00000000000..1a4d71334d6 --- /dev/null +++ b/docker/Dockerfile.paddle @@ -0,0 +1,83 @@ +# FROM must be called before other ARGS except for ARG BASE_IMAGE +ARG BASE_IMAGE +FROM ${BASE_IMAGE} + +# Customizable build arguments from cuda.yml +ARG DEVELOPER_BUILD +ARG CMAKE_VERSION +ARG PYTHON_VERSION +ARG BUILD_PADDLE_OPS + +# Forward all ARG to ENV +# ci_utils.sh requires these environment variables +ENV DEVELOPER_BUILD=${DEVELOPER_BUILD} +ENV CMAKE_VERSION=${CMAKE_VERSION} +ENV PYTHON_VERSION=${PYTHON_VERSION} +ENV BUILD_PYTORCH_OPS=OFF +ENV BUILD_TENSORFLOW_OPS=OFF +ENV BUILD_PADDLE_OPS=${BUILD_PADDLE_OPS} + +# Prevent interactive inputs when installing packages +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=America/Los_Angeles +ENV SUDO=command + +# Miniconda requires bash as the default shell. +SHELL ["/bin/bash", "-c"] + +# Dependencies: basic +RUN apt-get update && apt-get install -y \ + git \ + wget \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Dependencies: cmake +RUN CMAKE_VERSION_NUMBERS=$(echo "${CMAKE_VERSION}" | cut -d"-" -f2) \ + && wget -q https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION_NUMBERS}/${CMAKE_VERSION}.tar.gz \ + && tar -xf ${CMAKE_VERSION}.tar.gz \ + && cp -ar ${CMAKE_VERSION} ${HOME} +ENV PATH=${HOME}/${CMAKE_VERSION}/bin:${PATH} + +# Dependencies: gcc +RUN rm /usr/bin/gcc && rm /usr/bin/g++ \ + && mv /usr/bin/gcc.bak /usr/bin/gcc \ + && mv /usr/bin/g++.bak /usr/bin/g++ +ENV PATH=/usr/bin:${PATH} + +# Miniconda +ENV PATH="/root/miniconda3/bin:${PATH}" +RUN wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \ + && bash Miniconda3-latest-Linux-x86_64.sh -b \ + && rm Miniconda3-latest-Linux-x86_64.sh \ + && conda --version +ENV PATH="/root/miniconda3/envs/open3d/bin:${PATH}" +RUN conda create -y -n open3d python=${PYTHON_VERSION} \ + && source activate open3d +RUN which python \ + && python --version + +# Open3D C++ dependencies +# Done before copying the full Open3D directory for better Docker caching +COPY ./util/install_deps_ubuntu.sh /root/Open3D/util/ +RUN /root/Open3D/util/install_deps_ubuntu.sh assume-yes \ + && rm -rf /var/lib/apt/lists/* + +# Open3D Python dependencies +COPY ./util/ci_utils.sh /root/Open3D/util/ +COPY ./python/requirements.txt /root/Open3D/python/ +RUN source /root/Open3D/util/ci_utils.sh \ + && install_python_dependencies + +# Open3D repo +# Always keep /root/Open3D as the WORKDIR +COPY . /root/Open3D +WORKDIR /root/Open3D + +# Build python wheel +RUN export NPROC=$(nproc) \ + && export BUILD_SHARED_LIBS=OFF \ + && source /root/Open3D/util/ci_utils.sh \ + && build_pip_package build_azure_kinect + +RUN echo "Docker build done." diff --git a/docker/README.md b/docker/README.md index d14d9521c19..1866846f6d8 100644 --- a/docker/README.md +++ b/docker/README.md @@ -65,4 +65,16 @@ cd docker ./docker_test.sh openblas-amd64-py38-dev ``` -See `./docker_build.sh` and `./docker_test.sh` for all available options. +Build Docker for Paddle backend: + +```bash +cd docker + +# Build Docker (dev). +BUILD_CUDA_MODULE=ON ./docker_build.sh paddle_cuda_wheel_py310_dev + +# Build Docker (release). +BUILD_CUDA_MODULE=ON ./docker_build.sh paddle_cuda_wheel_py310 +``` + +See `./docker_build.sh` and `./docker_test.sh` for all available options. \ No newline at end of file diff --git a/docker/docker_build.sh b/docker/docker_build.sh index 33ab6ad0115..988839621bd 100755 --- a/docker/docker_build.sh +++ b/docker/docker_build.sh @@ -23,53 +23,57 @@ __usage_docker_build="USAGE: OPTION: # OpenBLAS AMD64 (Dockerfile.openblas) - openblas-amd64-py38-dev : OpenBLAS AMD64 3.8 wheel, developer mode - openblas-amd64-py39-dev : OpenBLAS AMD64 3.9 wheel, developer mode - openblas-amd64-py310-dev : OpenBLAS AMD64 3.10 wheel, developer mode - openblas-amd64-py311-dev : OpenBLAS AMD64 3.11 wheel, developer mode - openblas-amd64-py38 : OpenBLAS AMD64 3.8 wheel, release mode - openblas-amd64-py39 : OpenBLAS AMD64 3.9 wheel, release mode - openblas-amd64-py310 : OpenBLAS AMD64 3.10 wheel, release mode - openblas-amd64-py311 : OpenBLAS AMD64 3.11 wheel, release mode + openblas-amd64-py38-dev : OpenBLAS AMD64 3.8 wheel, developer mode + openblas-amd64-py39-dev : OpenBLAS AMD64 3.9 wheel, developer mode + openblas-amd64-py310-dev : OpenBLAS AMD64 3.10 wheel, developer mode + openblas-amd64-py311-dev : OpenBLAS AMD64 3.11 wheel, developer mode + openblas-amd64-py38 : OpenBLAS AMD64 3.8 wheel, release mode + openblas-amd64-py39 : OpenBLAS AMD64 3.9 wheel, release mode + openblas-amd64-py310 : OpenBLAS AMD64 3.10 wheel, release mode + openblas-amd64-py311 : OpenBLAS AMD64 3.11 wheel, release mode # OpenBLAS ARM64 (Dockerfile.openblas) - openblas-arm64-py38-dev : OpenBLAS ARM64 3.8 wheel, developer mode - openblas-arm64-py39-dev : OpenBLAS ARM64 3.9 wheel, developer mode - openblas-arm64-py310-dev : OpenBLAS ARM64 3.10 wheel, developer mode - openblas-arm64-py311-dev : OpenBLAS ARM64 3.11 wheel, developer mode - openblas-arm64-py38 : OpenBLAS ARM64 3.8 wheel, release mode - openblas-arm64-py39 : OpenBLAS ARM64 3.9 wheel, release mode - openblas-arm64-py310 : OpenBLAS ARM64 3.10 wheel, release mode - openblas-arm64-py311 : OpenBLAS ARM64 3.11 wheel, release mode + openblas-arm64-py38-dev : OpenBLAS ARM64 3.8 wheel, developer mode + openblas-arm64-py39-dev : OpenBLAS ARM64 3.9 wheel, developer mode + openblas-arm64-py310-dev : OpenBLAS ARM64 3.10 wheel, developer mode + openblas-arm64-py311-dev : OpenBLAS ARM64 3.11 wheel, developer mode + openblas-arm64-py38 : OpenBLAS ARM64 3.8 wheel, release mode + openblas-arm64-py39 : OpenBLAS ARM64 3.9 wheel, release mode + openblas-arm64-py310 : OpenBLAS ARM64 3.10 wheel, release mode + openblas-arm64-py311 : OpenBLAS ARM64 3.11 wheel, release mode # Ubuntu CPU CI (Dockerfile.ci) - cpu-static : Ubuntu CPU static - cpu-shared : Ubuntu CPU shared (cxx11_abi) - cpu-shared-release : Ubuntu CPU shared (cxx11_abi), release mode - cpu-shared-ml : Ubuntu CPU shared with ML (pre_cxx11_abi) - cpu-shared-ml-release : Ubuntu CPU shared with ML (pre_cxx11_abi), release mode + cpu-static : Ubuntu CPU static + cpu-shared : Ubuntu CPU shared (cxx11_abi) + cpu-shared-release : Ubuntu CPU shared (cxx11_abi), release mode + cpu-shared-ml : Ubuntu CPU shared with ML (pre_cxx11_abi) + cpu-shared-ml-release : Ubuntu CPU shared with ML (pre_cxx11_abi), release mode # Sycl CPU CI (Dockerfile.ci) - sycl-shared : SYCL (oneAPI) with shared lib - sycl-static : SYCL (oneAPI) with static lib + sycl-shared : SYCL (oneAPI) with shared lib + sycl-static : SYCL (oneAPI) with static lib # ML CIs (Dockerfile.ci) - 2-bionic : CUDA CI, 2-bionic, developer mode - 3-ml-shared-bionic-release : CUDA CI, 3-ml-shared-bionic (pre_cxx11_abi), release mode - 3-ml-shared-bionic : CUDA CI, 3-ml-shared-bionic (pre_cxx11_abi), developer mode - 4-shared-bionic : CUDA CI, 4-shared-bionic (cxx11_abi), developer mode - 4-shared-bionic-release : CUDA CI, 4-shared-bionic (cxx11_abi), release mode - 5-ml-focal : CUDA CI, 5-ml-focal, developer mode + 2-bionic : CUDA CI, 2-bionic, developer mode + 3-ml-shared-bionic-release : CUDA CI, 3-ml-shared-bionic (pre_cxx11_abi), release mode + 3-ml-shared-bionic : CUDA CI, 3-ml-shared-bionic (pre_cxx11_abi), developer mode + 4-shared-bionic : CUDA CI, 4-shared-bionic (cxx11_abi), developer mode + 4-shared-bionic-release : CUDA CI, 4-shared-bionic (cxx11_abi), release mode + 5-ml-focal : CUDA CI, 5-ml-focal, developer mode # CUDA wheels (Dockerfile.wheel) - cuda_wheel_py38_dev : CUDA Python 3.8 wheel, developer mode - cuda_wheel_py39_dev : CUDA Python 3.9 wheel, developer mode - cuda_wheel_py310_dev : CUDA Python 3.10 wheel, developer mode - cuda_wheel_py311_dev : CUDA Python 3.11 wheel, developer mode - cuda_wheel_py38 : CUDA Python 3.8 wheel, release mode - cuda_wheel_py39 : CUDA Python 3.9 wheel, release mode - cuda_wheel_py310 : CUDA Python 3.10 wheel, release mode - cuda_wheel_py311 : CUDA Python 3.11 wheel, release mode + cuda_wheel_py38_dev : CUDA Python 3.8 wheel, developer mode + cuda_wheel_py39_dev : CUDA Python 3.9 wheel, developer mode + cuda_wheel_py310_dev : CUDA Python 3.10 wheel, developer mode + cuda_wheel_py311_dev : CUDA Python 3.11 wheel, developer mode + cuda_wheel_py38 : CUDA Python 3.8 wheel, release mode + cuda_wheel_py39 : CUDA Python 3.9 wheel, release mode + cuda_wheel_py310 : CUDA Python 3.10 wheel, release mode + cuda_wheel_py311 : CUDA Python 3.11 wheel, release mode + + # Paddle wheels (Dockerfile.paddle) + paddle_cuda_wheel_py310_dev : Paddle CUDA Python 3.10 wheel, developer mode + paddle_cuda_wheel_py310 : Paddle CUDA Python 3.10 wheel, release mode " HOST_OPEN3D_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. >/dev/null 2>&1 && pwd)" @@ -79,6 +83,7 @@ CCACHE_VERSION=4.3 CMAKE_VERSION=cmake-3.20.6-linux-x86_64 CMAKE_VERSION_AARCH64=cmake-3.20.6-linux-aarch64 CUDA_VERSION=11.7.1-cudnn8 +PADDLE_CUDA_VERSION=cuda11.8-cudnn8.6-trt8.5 print_usage_and_exit_docker_build() { echo "$__usage_docker_build" @@ -219,6 +224,45 @@ cuda_wheel_build() { && chown $(id -u):$(id -g) /opt/mount/${CCACHE_TAR_NAME}.tar.gz" } +paddle_cuda_wheel_build() { + BASE_IMAGE=registry.baidubce.com/paddlepaddle/paddle:3.0.0b1-gpu-${PADDLE_CUDA_VERSION} + BUILD_PADDLE_OPS=ON + + options="$(echo "$@" | tr ' ' '|')" + echo "[cuda_wheel_build()] options: ${options}" + if [[ "py310" =~ ^($options)$ ]]; then + PYTHON_VERSION=3.10 + else + echo "Invalid python version." + print_usage_and_exit_docker_build + fi + if [[ "dev" =~ ^($options)$ ]]; then + DEVELOPER_BUILD=ON + else + DEVELOPER_BUILD=OFF + fi + echo "[paddle_cuda_wheel_build()] PYTHON_VERSION: ${PYTHON_VERSION}" + echo "[paddle_cuda_wheel_build()] DEVELOPER_BUILD: ${DEVELOPER_BUILD}" + echo "[paddle_cuda_wheel_build()] BUILD_PADDLE_OPS=${BUILD_PADDLE_OPS:?'env var must be set.'}" + + pushd "${HOST_OPEN3D_ROOT}" + docker build \ + --progress plain \ + --build-arg BASE_IMAGE="${BASE_IMAGE}" \ + --build-arg DEVELOPER_BUILD="${DEVELOPER_BUILD}" \ + --build-arg CMAKE_VERSION="${CMAKE_VERSION}" \ + --build-arg PYTHON_VERSION="${PYTHON_VERSION}" \ + --build-arg BUILD_PADDLE_OPS="${BUILD_PADDLE_OPS}" \ + -t open3d-ci:wheel \ + -f docker/Dockerfile.paddle . + popd + + python_package_dir=/root/Open3D/build/lib/python_package + docker run -v "${PWD}:/opt/mount" --rm open3d-ci:wheel \ + bash -c "cp ${python_package_dir}/pip_package/open3d*.whl /opt/mount \ + && chown $(id -u):$(id -g) /opt/mount/open3d*.whl" +} + ci_build() { echo "[ci_build()] DOCKER_TAG=${DOCKER_TAG}" echo "[ci_build()] BASE_IMAGE=${BASE_IMAGE}" @@ -598,6 +642,14 @@ function main() { cuda_wheel_py311) cuda_wheel_build py311 ;; + + # Paddle CUDA wheels + paddle_cuda_wheel_py310_dev) + paddle_cuda_wheel_build py310 dev + ;; + paddle_cuda_wheel_py310) + paddle_cuda_wheel_build py310 + ;; # ML CIs 2-bionic) diff --git a/python/open3d/ml/paddle/__init__.py b/python/open3d/ml/paddle/__init__.py index 431d7f04004..df0ae41c41a 100644 --- a/python/open3d/ml/paddle/__init__.py +++ b/python/open3d/ml/paddle/__init__.py @@ -19,8 +19,14 @@ 'version {} is installed!'.format(match_paddle_ver, _paddle.__version__)) +_loaded = False +try: + from . import ops + _loaded = True +except Exception as e: + raise e + from . import layers -from . import ops from . import classes # put contrib at the same level diff --git a/python/open3d/ml/paddle/ops/__init__.py b/python/open3d/ml/paddle/ops/__init__.py index 7598d17a876..294bdbdf30d 100644 --- a/python/open3d/ml/paddle/ops/__init__.py +++ b/python/open3d/ml/paddle/ops/__init__.py @@ -46,11 +46,28 @@ for la in _lib_arch ]) -# only load first lib -_load_lib_path = _lib_path[0] -# load custom op shared library with abs path -_custom_ops = _paddle.utils.cpp_extension.load_op_meta_info_and_register_op( - _load_lib_path) +_loaded_lib = False +_loaded_except = None +for _lp in _lib_path: + try: + _load_lib_path = _lp + # load custom op shared library with abs path + _custom_ops = _paddle.utils.cpp_extension.load_op_meta_info_and_register_op( + _load_lib_path) + _loaded_lib = True + + break + + except Exception as e: + _loaded_except = e + + if not _os.path.isfile(_lp): + print('The op library at "{}" was not found. Make sure that ' + 'BUILD_PADDLE_OPS was enabled.'.format( + _os.path.realpath(_lp))) + +if not _loaded_lib: + raise _loaded_except try: _spec = _importlib_util.spec_from_file_location(__name__, _load_lib_path) diff --git a/util/ci_utils.sh b/util/ci_utils.sh index 38ff654880e..471acdbae2f 100644 --- a/util/ci_utils.sh +++ b/util/ci_utils.sh @@ -20,6 +20,7 @@ if [ -z "${BUILD_CUDA_MODULE:+x}" ]; then fi BUILD_TENSORFLOW_OPS=${BUILD_TENSORFLOW_OPS:-ON} BUILD_PYTORCH_OPS=${BUILD_PYTORCH_OPS:-ON} +BUILD_PADDLE_OPS=${BUILD_PADDLE_OPS:-ON} LOW_MEM_USAGE=${LOW_MEM_USAGE:-OFF} # Dependency versions: @@ -51,10 +52,14 @@ install_python_dependencies() { python -m pip install -U -r python/requirements_test.txt fi if [[ "with-cuda" =~ ^($options)$ ]]; then + PADDLE_GLNX=paddlepaddle-gpu + PADDLE_GLNX_PIP_INDEX=https://www.paddlepaddle.org.cn/packages/nightly/cu118/ TF_ARCH_NAME=tensorflow TF_ARCH_DISABLE_NAME=tensorflow-cpu TORCH_GLNX="torch==$TORCH_CUDA_GLNX_VER" else + PADDLE_GLNX=paddlepaddle + PADDLE_GLNX_PIP_INDEX=https://www.paddlepaddle.org.cn/packages/nightly/cpu/ TF_ARCH_NAME=tensorflow-cpu TF_ARCH_DISABLE_NAME=tensorflow TORCH_GLNX="torch==$TORCH_CPU_GLNX_VER" @@ -83,7 +88,16 @@ install_python_dependencies() { exit 1 fi fi - if [ "$BUILD_TENSORFLOW_OPS" == "ON" ] || [ "$BUILD_PYTORCH_OPS" == "ON" ]; then + if [ "$BUILD_PADDLE_OPS" == "ON" ]; then # ML/requirements-torch.txt + if [[ "$OSTYPE" == "linux-gnu"* ]]; then + python -m pip uninstall paddlepaddle paddlepaddle-gpu -y + python -m pip install --pre $PADDLE_GLNX -i $PADDLE_GLNX_PIP_INDEX + else + echo "unknown OS $OSTYPE" + exit 1 + fi + fi + if [ "$BUILD_TENSORFLOW_OPS" == "ON" ] || [ "$BUILD_PYTORCH_OPS" == "ON" ] || [ "$BUILD_PADDLE_OPS" == "ON" ]; then python -m pip install -U yapf=="$YAPF_VER" # Fix Protobuf compatibility issue # https://stackoverflow.com/a/72493690/1255535 @@ -116,6 +130,7 @@ build_all() { -DGLIBCXX_USE_CXX11_ABI=OFF -DBUILD_TENSORFLOW_OPS="$BUILD_TENSORFLOW_OPS" -DBUILD_PYTORCH_OPS="$BUILD_PYTORCH_OPS" + -DBUILD_PADDLE_OPS="$BUILD_ADDLE_OPS" -DCMAKE_INSTALL_PREFIX="$OPEN3D_INSTALL_DIR" -DBUILD_UNIT_TESTS=ON -DBUILD_BENCHMARKS=ON @@ -173,6 +188,8 @@ build_pip_package() { CXX11_ABI=$(python -c "import tensorflow as tf; print('ON' if tf.__cxx11_abi_flag__ else 'OFF')") elif [ "$BUILD_PYTORCH_OPS" == "ON" ]; then CXX11_ABI=$(python -c "import torch; print('ON' if torch._C._GLIBCXX_USE_CXX11_ABI else 'OFF')") + elif [ "$BUILD_PADDLE_OPS" == "ON" ]; then + CXX11_ABI="ON" fi echo Building with GLIBCXX_USE_CXX11_ABI="$CXX11_ABI" set -u @@ -189,6 +206,7 @@ build_pip_package() { "-DGLIBCXX_USE_CXX11_ABI=$CXX11_ABI" "-DBUILD_TENSORFLOW_OPS=$BUILD_TENSORFLOW_OPS" "-DBUILD_PYTORCH_OPS=$BUILD_PYTORCH_OPS" + "-DBUILD_PADDLE_OPS=$BUILD_PADDLE_OPS" "-DBUILD_FILAMENT_FROM_SOURCE=$BUILD_FILAMENT_FROM_SOURCE" "-DBUILD_JUPYTER_EXTENSION=$BUILD_JUPYTER_EXTENSION" "-DCMAKE_INSTALL_PREFIX=$OPEN3D_INSTALL_DIR" @@ -206,7 +224,11 @@ build_pip_package() { make VERBOSE=1 -j"$NPROC" pip-package mv lib/python_package/pip_package/open3d*.whl . # save CPU wheel - if [ "$BUILD_CUDA_MODULE" == ON ]; then + if [ "$BUILD_CUDA_MODULE" == "ON" ]; then + if [ "$BUILD_PADDLE_OPS" == "ON" ]; then + export LD_LIBRARY_PATH=/usr/local/cuda/compat/:${LD_LIBRARY_PATH} + fi + echo echo Installing CUDA versions of TensorFlow and PyTorch... install_python_dependencies with-cuda purge-cache @@ -244,7 +266,7 @@ test_wheel() { echo -n "Using pip: " python -m pip --version echo "Installing Open3D wheel $wheel_path in virtual environment..." - python -m pip install "$wheel_path" + python -m pip install "$wheel_path" --force python -c "import open3d; print('Installed:', open3d); print('BUILD_CUDA_MODULE: ', open3d._build_config['BUILD_CUDA_MODULE'])" python -c "import open3d; print('CUDA available: ', open3d.core.cuda.is_available())" echo @@ -267,6 +289,10 @@ test_wheel() { python -c \ "import open3d.ml.torch; print('PyTorch Ops library loaded:', open3d.ml.torch._loaded)" fi + if [ "$BUILD_PADDLE_OPS" == ON ]; then + python -c \ + "import open3d.ml.paddle; print('Paddle Ops library loaded:', open3d.ml.paddle._loaded)" + fi if [ "$BUILD_TENSORFLOW_OPS" == ON ]; then # python -m pip install -r "$OPEN3D_ML_ROOT/requirements-tensorflow.txt" python -c \ @@ -288,10 +314,17 @@ run_python_tests() { python -m pip install -U -r python/requirements_test.txt echo Add --randomly-seed=SEED to the test command to reproduce test order. pytest_args=("$OPEN3D_SOURCE_ROOT"/python/test/) - if [ "$BUILD_PYTORCH_OPS" == "OFF" ] && [ "$BUILD_TENSORFLOW_OPS" == "OFF" ]; then + if [ "$BUILD_PYTORCH_OPS" == "OFF" ] && [ "$BUILD_TENSORFLOW_OPS" == "OFF" ] && [ "$BUILD_PADDLE_OPS" == "OFF" ]; then echo Testing ML Ops disabled pytest_args+=(--ignore "$OPEN3D_SOURCE_ROOT"/python/test/ml_ops/) fi + + if [ "$BUILD_PADDLE_OPS" == "OFF" ]; then + pytest_args+=(--ignore "$OPEN3D_SOURCE_ROOT"/python/test/ml_ops/test_ragged_tensor_paddle.py) + elif [ "$BUILD_PYTORCH_OPS" == "OFF" ]; then + pytest_args+=(--ignore "$OPEN3D_SOURCE_ROOT"/python/test/ml_ops/test_ragged_tensor.py) + fi + python -m pytest "${pytest_args[@]}" deactivate open3d_test.venv # argument prevents unbound variable error rm -rf open3d_test.venv # cleanup for testing the next wheel diff --git a/util/run_python_unittest.sh b/util/run_python_unittest.sh new file mode 100755 index 00000000000..8a44295d647 --- /dev/null +++ b/util/run_python_unittest.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -euo pipefail + +PWD="$(cd $(dirname $0); pwd)" +OPEN3D_ROOT="${PWD}/../" + +# Get build scripts and control environment variables +# shellcheck source=ci_utils.sh +source "${PWD}/ci_utils.sh" + +# # Run on CPU versions +echo "Try importing Open3D CPU Python package" +cpu_wheel_path=$(ls ${OPEN3D_ROOT}/build/lib/python_package/pip_package/open3d_cpu*.whl) +test_wheel $cpu_wheel_path +echo "Running Open3D CPU Python tests..." +run_python_tests +echo + +if nvidia-smi >/dev/null 2>&1; then + # Run on GPU versions + echo "Try importing Open3D GPU Python package" + gpu_wheel_path=$(ls ${OPEN3D_ROOT}/build/lib/python_package/pip_package/open3d*.whl | grep -v $cpu_wheel_path) + test_wheel $gpu_wheel_path + echo "Running Open3D GPU Python tests..." + run_python_tests + echo +fi From 2e3b186e6348b61e1904eb99fab93b8685cddd88 Mon Sep 17 00:00:00 2001 From: SecretXV <145354053+SecretXV@users.noreply.github.com> Date: Mon, 18 Nov 2024 23:13:11 +0800 Subject: [PATCH 14/19] [Doc] Fix doc generate (#13) * [Doc] fix docs * fix --------- Signed-off-by: SecretXV --- docs/make_docs.py | 3 +- .../ml/paddle/python/layers/convolutions.py | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/docs/make_docs.py b/docs/make_docs.py index 185410a5927..cc8f7f1a640 100644 --- a/docs/make_docs.py +++ b/docs/make_docs.py @@ -141,7 +141,8 @@ def _generate_class_doc(self, full_module_name, class_name, output_path): out_string += "\n :members:" out_string += "\n :undoc-members:" if not (full_module_name.startswith("open3d.ml.tf") or - full_module_name.startswith("open3d.ml.torch")): + full_module_name.startswith("open3d.ml.torch") or + full_module_name.startswith("open3d.ml.paddle")): out_string += "\n :inherited-members:" out_string += "\n" diff --git a/python/open3d/ml/paddle/python/layers/convolutions.py b/python/open3d/ml/paddle/python/layers/convolutions.py index 7ea1ed24149..2526e77624c 100644 --- a/python/open3d/ml/paddle/python/layers/convolutions.py +++ b/python/open3d/ml/paddle/python/layers/convolutions.py @@ -200,6 +200,49 @@ def forward(self, user_neighbors_index=None, user_neighbors_row_splits=None, user_neighbors_importance=None): + """This function computes the output features. + + Arguments: + inp_features: A 2D tensor which stores a feature vector for each input + point. + + inp_positions: A 2D tensor with the 3D point positions of each input + point. The coordinates for each point is a vector with format [x,y,z]. + + out_positions: A 2D tensor with the 3D point positions of each output + point. The coordinates for each point is a vector with format [x,y,z]. + + extents: The extent defines the spatial size of the filter for each + output point. + For 'ball to cube' coordinate mappings the extent defines the + bounding box of the ball. + The shape of the tensor is either [1] or [num output points]. + + inp_importance: Optional scalar importance value for each input point. + + fixed_radius_search_hash_table: A precomputed hash table generated with + build_spatial_hash_table(). + This input can be used to explicitly force the reuse of a hash table in + special cases and is usually not needed. + Note that the hash table must have been generated with the same 'points' + array. Note that this parameter is only used if 'extents' is a scalar. + + user_neighbors_index: This parameter together with 'user_neighbors_row_splits' + and 'user_neighbors_importance' allows to override the automatic neighbor + search. This is the list of neighbor indices for each output point. + This is a nested list for which the start and end of each sublist is + defined by 'user_neighbors_row_splits'. + + user_neighbors_row_splits: Defines the start and end of each neighbors + list in 'user_neighbors_index'. + + user_neighbors_importance: Defines a scalar importance value for each + element in 'user_neighbors_index'. + + + Returns: A tensor of shape [num output points, filters] with the output + features. + """ offset = self.offset if isinstance(extents, (float, int)): extents = paddle.to_tensor(extents, dtype=inp_positions.dtype) From 6b192037ace333c9be02081cf31552fcac566a20 Mon Sep 17 00:00:00 2001 From: SecretXV <145354053+SecretXV@users.noreply.github.com> Date: Mon, 18 Nov 2024 23:34:18 +0800 Subject: [PATCH 15/19] [CodeStyle] update license year from 2023 to 2024 (#14) Signed-off-by: SecretXV --- LICENSE | 2 +- cmake/ShaderEncoder.cpp | 2 +- cmake/ShaderLinker.cpp | 4 ++-- cmake/ispc_isas/ISADispatcher.c | 2 +- cmake/ispc_isas/ISADispatcher.ispc | 2 +- cpp/apps/CMakeLists.txt | 2 +- cpp/apps/OfflineReconstruction/Config.h | 2 +- cpp/apps/OfflineReconstruction/DebugUtil.h | 2 +- cpp/apps/OfflineReconstruction/FileSystemUtil.h | 2 +- cpp/apps/OfflineReconstruction/LegacyReconstructionUtil.h | 2 +- cpp/apps/OfflineReconstruction/OfflineReconstruction.cpp | 2 +- cpp/apps/Open3DViewer/Open3DViewer.cpp | 2 +- cpp/apps/Open3DViewer/Open3DViewer.h | 2 +- cpp/apps/Open3DViewer/Open3DViewer_mac.mm | 2 +- cpp/benchmarks/Main.cpp | 2 +- cpp/benchmarks/benchmark_utilities/Rand.cpp | 2 +- cpp/benchmarks/benchmark_utilities/Rand.h | 2 +- cpp/benchmarks/core/BinaryEW.cpp | 2 +- cpp/benchmarks/core/HashMap.cpp | 2 +- cpp/benchmarks/core/Linalg.cpp | 2 +- cpp/benchmarks/core/MemoryManager.cpp | 2 +- cpp/benchmarks/core/ParallelFor.cpp | 2 +- cpp/benchmarks/core/ParallelFor.ispc | 2 +- cpp/benchmarks/core/Reduction.cpp | 2 +- cpp/benchmarks/core/UnaryEW.cpp | 2 +- cpp/benchmarks/core/Zeros.cpp | 2 +- cpp/benchmarks/geometry/KDTreeFlann.cpp | 2 +- cpp/benchmarks/geometry/SamplePoints.cpp | 2 +- cpp/benchmarks/geometry/TriangleMesh.cpp | 2 +- cpp/benchmarks/io/PointCloudIO.cpp | 2 +- cpp/benchmarks/pipelines/registration/Registration.cpp | 2 +- cpp/benchmarks/t/geometry/PointCloud.cpp | 2 +- cpp/benchmarks/t/io/PointCloudIO.cpp | 2 +- cpp/benchmarks/t/io/TriangleMeshIO.cpp | 2 +- cpp/benchmarks/t/pipelines/odometry/RGBDOdometry.cpp | 2 +- cpp/benchmarks/t/pipelines/registration/Feature.cpp | 2 +- cpp/benchmarks/t/pipelines/registration/Registration.cpp | 2 +- cpp/open3d/Macro.h | 2 +- cpp/open3d/Open3D.h.in | 2 +- cpp/open3d/Open3DConfig.cpp | 2 +- cpp/open3d/Open3DConfig.h.in | 2 +- cpp/open3d/camera/PinholeCameraIntrinsic.cpp | 2 +- cpp/open3d/camera/PinholeCameraIntrinsic.h | 2 +- cpp/open3d/camera/PinholeCameraParameters.cpp | 2 +- cpp/open3d/camera/PinholeCameraParameters.h | 2 +- cpp/open3d/camera/PinholeCameraTrajectory.cpp | 2 +- cpp/open3d/camera/PinholeCameraTrajectory.h | 2 +- cpp/open3d/core/AdvancedIndexing.cpp | 2 +- cpp/open3d/core/AdvancedIndexing.h | 2 +- cpp/open3d/core/Atomic.h | 2 +- cpp/open3d/core/Blob.h | 2 +- cpp/open3d/core/CUDAUtils.cpp | 2 +- cpp/open3d/core/CUDAUtils.h | 2 +- cpp/open3d/core/DLPack.h | 2 +- cpp/open3d/core/Device.cpp | 2 +- cpp/open3d/core/Device.h | 2 +- cpp/open3d/core/Dispatch.h | 2 +- cpp/open3d/core/Dtype.cpp | 2 +- cpp/open3d/core/Dtype.h | 2 +- cpp/open3d/core/EigenConverter.cpp | 2 +- cpp/open3d/core/EigenConverter.h | 2 +- cpp/open3d/core/FunctionTraits.h | 2 +- cpp/open3d/core/Indexer.cpp | 2 +- cpp/open3d/core/Indexer.h | 2 +- cpp/open3d/core/Indexer.ispc | 2 +- cpp/open3d/core/Indexer.isph | 2 +- cpp/open3d/core/MemoryManager.cpp | 2 +- cpp/open3d/core/MemoryManager.h | 2 +- cpp/open3d/core/MemoryManagerCPU.cpp | 2 +- cpp/open3d/core/MemoryManagerCUDA.cpp | 2 +- cpp/open3d/core/MemoryManagerCached.cpp | 2 +- cpp/open3d/core/MemoryManagerSYCL.cpp | 2 +- cpp/open3d/core/MemoryManagerStatistic.cpp | 2 +- cpp/open3d/core/MemoryManagerStatistic.h | 2 +- cpp/open3d/core/ParallelFor.h | 2 +- cpp/open3d/core/ParallelFor.isph | 2 +- cpp/open3d/core/SYCLContext.cpp | 2 +- cpp/open3d/core/SYCLContext.h | 2 +- cpp/open3d/core/SYCLUtils.cpp | 2 +- cpp/open3d/core/SYCLUtils.h | 2 +- cpp/open3d/core/Scalar.h | 2 +- cpp/open3d/core/ShapeUtil.cpp | 2 +- cpp/open3d/core/ShapeUtil.h | 2 +- cpp/open3d/core/SizeVector.cpp | 2 +- cpp/open3d/core/SizeVector.h | 2 +- cpp/open3d/core/SmallVector.cpp | 2 +- cpp/open3d/core/SmallVector.h | 2 +- cpp/open3d/core/StdAllocator.h | 2 +- cpp/open3d/core/Tensor.cpp | 2 +- cpp/open3d/core/Tensor.h | 2 +- cpp/open3d/core/TensorCheck.cpp | 2 +- cpp/open3d/core/TensorCheck.h | 2 +- cpp/open3d/core/TensorFunction.cpp | 2 +- cpp/open3d/core/TensorFunction.h | 2 +- cpp/open3d/core/TensorInit.h | 2 +- cpp/open3d/core/TensorKey.cpp | 2 +- cpp/open3d/core/TensorKey.h | 2 +- cpp/open3d/core/TensorList.cpp | 2 +- cpp/open3d/core/TensorList.h | 2 +- cpp/open3d/core/hashmap/CPU/CPUHashBackendBuffer.cpp | 2 +- .../core/hashmap/CPU/CPUHashBackendBufferAccessor.hpp | 2 +- cpp/open3d/core/hashmap/CPU/CreateCPUHashBackend.cpp | 2 +- cpp/open3d/core/hashmap/CPU/TBBHashBackend.h | 2 +- cpp/open3d/core/hashmap/CUDA/CUDAHashBackendBuffer.cu | 2 +- .../core/hashmap/CUDA/CUDAHashBackendBufferAccessor.h | 2 +- cpp/open3d/core/hashmap/CUDA/CreateCUDAHashBackend.cu | 2 +- cpp/open3d/core/hashmap/CUDA/SlabHashBackend.h | 2 +- cpp/open3d/core/hashmap/CUDA/SlabHashBackendImpl.h | 2 +- cpp/open3d/core/hashmap/CUDA/SlabMacros.h | 2 +- cpp/open3d/core/hashmap/CUDA/SlabNodeManager.cu | 2 +- cpp/open3d/core/hashmap/CUDA/SlabNodeManager.h | 2 +- cpp/open3d/core/hashmap/CUDA/SlabTraits.h | 2 +- cpp/open3d/core/hashmap/CUDA/StdGPUHashBackend.h | 2 +- cpp/open3d/core/hashmap/DeviceHashBackend.cpp | 2 +- cpp/open3d/core/hashmap/DeviceHashBackend.h | 2 +- cpp/open3d/core/hashmap/Dispatch.h | 2 +- cpp/open3d/core/hashmap/HashBackendBuffer.cpp | 2 +- cpp/open3d/core/hashmap/HashBackendBuffer.h | 2 +- cpp/open3d/core/hashmap/HashMap.cpp | 2 +- cpp/open3d/core/hashmap/HashMap.h | 2 +- cpp/open3d/core/hashmap/HashSet.cpp | 2 +- cpp/open3d/core/hashmap/HashSet.h | 2 +- cpp/open3d/core/kernel/Arange.cpp | 2 +- cpp/open3d/core/kernel/Arange.h | 2 +- cpp/open3d/core/kernel/ArangeCPU.cpp | 2 +- cpp/open3d/core/kernel/ArangeCUDA.cu | 2 +- cpp/open3d/core/kernel/BinaryEW.cpp | 2 +- cpp/open3d/core/kernel/BinaryEW.h | 2 +- cpp/open3d/core/kernel/BinaryEWCPU.cpp | 2 +- cpp/open3d/core/kernel/BinaryEWCPU.ispc | 2 +- cpp/open3d/core/kernel/BinaryEWCUDA.cu | 2 +- cpp/open3d/core/kernel/IndexGetSet.cpp | 2 +- cpp/open3d/core/kernel/IndexGetSet.h | 2 +- cpp/open3d/core/kernel/IndexGetSetCPU.cpp | 2 +- cpp/open3d/core/kernel/IndexGetSetCUDA.cu | 2 +- cpp/open3d/core/kernel/IndexReduction.cpp | 2 +- cpp/open3d/core/kernel/IndexReduction.h | 2 +- cpp/open3d/core/kernel/IndexReductionCPU.cpp | 2 +- cpp/open3d/core/kernel/IndexReductionCUDA.cu | 2 +- cpp/open3d/core/kernel/Kernel.cpp | 2 +- cpp/open3d/core/kernel/Kernel.h | 2 +- cpp/open3d/core/kernel/NonZero.cpp | 2 +- cpp/open3d/core/kernel/NonZero.h | 2 +- cpp/open3d/core/kernel/NonZeroCPU.cpp | 2 +- cpp/open3d/core/kernel/NonZeroCUDA.cu | 2 +- cpp/open3d/core/kernel/Reduction.cpp | 2 +- cpp/open3d/core/kernel/Reduction.h | 2 +- cpp/open3d/core/kernel/ReductionCPU.cpp | 2 +- cpp/open3d/core/kernel/ReductionCUDA.cu | 2 +- cpp/open3d/core/kernel/UnaryEW.cpp | 2 +- cpp/open3d/core/kernel/UnaryEW.h | 2 +- cpp/open3d/core/kernel/UnaryEWCPU.cpp | 2 +- cpp/open3d/core/kernel/UnaryEWCPU.ispc | 2 +- cpp/open3d/core/kernel/UnaryEWCUDA.cu | 2 +- cpp/open3d/core/linalg/AddMM.cpp | 2 +- cpp/open3d/core/linalg/AddMM.h | 2 +- cpp/open3d/core/linalg/AddMMCPU.cpp | 2 +- cpp/open3d/core/linalg/AddMMCUDA.cpp | 2 +- cpp/open3d/core/linalg/BlasWrapper.h | 2 +- cpp/open3d/core/linalg/Det.cpp | 2 +- cpp/open3d/core/linalg/Det.h | 2 +- cpp/open3d/core/linalg/Inverse.cpp | 2 +- cpp/open3d/core/linalg/Inverse.h | 2 +- cpp/open3d/core/linalg/InverseCPU.cpp | 2 +- cpp/open3d/core/linalg/InverseCUDA.cpp | 2 +- cpp/open3d/core/linalg/LU.cpp | 2 +- cpp/open3d/core/linalg/LU.h | 2 +- cpp/open3d/core/linalg/LUCPU.cpp | 2 +- cpp/open3d/core/linalg/LUCUDA.cpp | 2 +- cpp/open3d/core/linalg/LUImpl.h | 2 +- cpp/open3d/core/linalg/LapackWrapper.h | 2 +- cpp/open3d/core/linalg/LeastSquares.cpp | 2 +- cpp/open3d/core/linalg/LeastSquares.h | 2 +- cpp/open3d/core/linalg/LeastSquaresCPU.cpp | 2 +- cpp/open3d/core/linalg/LeastSquaresCUDA.cpp | 2 +- cpp/open3d/core/linalg/LinalgHeadersCPU.h | 2 +- cpp/open3d/core/linalg/LinalgHeadersCUDA.h | 2 +- cpp/open3d/core/linalg/LinalgUtils.cpp | 2 +- cpp/open3d/core/linalg/LinalgUtils.h | 2 +- cpp/open3d/core/linalg/Matmul.cpp | 2 +- cpp/open3d/core/linalg/Matmul.h | 2 +- cpp/open3d/core/linalg/MatmulCPU.cpp | 2 +- cpp/open3d/core/linalg/MatmulCUDA.cpp | 2 +- cpp/open3d/core/linalg/SVD.cpp | 2 +- cpp/open3d/core/linalg/SVD.h | 2 +- cpp/open3d/core/linalg/SVDCPU.cpp | 2 +- cpp/open3d/core/linalg/SVDCUDA.cpp | 2 +- cpp/open3d/core/linalg/Solve.cpp | 2 +- cpp/open3d/core/linalg/Solve.h | 2 +- cpp/open3d/core/linalg/SolveCPU.cpp | 2 +- cpp/open3d/core/linalg/SolveCUDA.cpp | 2 +- cpp/open3d/core/linalg/Tri.cpp | 2 +- cpp/open3d/core/linalg/Tri.h | 2 +- cpp/open3d/core/linalg/TriCPU.cpp | 2 +- cpp/open3d/core/linalg/TriCUDA.cu | 2 +- cpp/open3d/core/linalg/TriImpl.h | 2 +- cpp/open3d/core/linalg/kernel/Matrix.h | 2 +- cpp/open3d/core/linalg/kernel/SVD3x3.h | 2 +- cpp/open3d/core/nns/FixedRadiusIndex.cpp | 2 +- cpp/open3d/core/nns/FixedRadiusIndex.h | 2 +- cpp/open3d/core/nns/FixedRadiusSearchImpl.cuh | 2 +- cpp/open3d/core/nns/FixedRadiusSearchImpl.h | 2 +- cpp/open3d/core/nns/FixedRadiusSearchOps.cpp | 2 +- cpp/open3d/core/nns/FixedRadiusSearchOps.cu | 2 +- cpp/open3d/core/nns/KnnIndex.cpp | 2 +- cpp/open3d/core/nns/KnnIndex.h | 2 +- cpp/open3d/core/nns/KnnSearchImpl.cuh | 2 +- cpp/open3d/core/nns/KnnSearchOps.cu | 2 +- cpp/open3d/core/nns/MemoryAllocation.h | 2 +- cpp/open3d/core/nns/NNSIndex.cpp | 2 +- cpp/open3d/core/nns/NNSIndex.h | 2 +- cpp/open3d/core/nns/NanoFlannImpl.h | 2 +- cpp/open3d/core/nns/NanoFlannIndex.cpp | 2 +- cpp/open3d/core/nns/NanoFlannIndex.h | 2 +- cpp/open3d/core/nns/NearestNeighborSearch.cpp | 2 +- cpp/open3d/core/nns/NearestNeighborSearch.h | 2 +- cpp/open3d/core/nns/NeighborSearchAllocator.h | 2 +- cpp/open3d/core/nns/NeighborSearchCommon.h | 2 +- cpp/open3d/core/nns/kernel/BlockMerge.cuh | 2 +- cpp/open3d/core/nns/kernel/BlockSelect.cuh | 2 +- cpp/open3d/core/nns/kernel/BlockSelectFloat32.cu | 2 +- cpp/open3d/core/nns/kernel/BlockSelectFloat64.cu | 2 +- cpp/open3d/core/nns/kernel/BlockSelectImpl.cuh | 2 +- cpp/open3d/core/nns/kernel/DeviceDefs.cuh | 2 +- cpp/open3d/core/nns/kernel/DistancesUtils.cuh | 2 +- cpp/open3d/core/nns/kernel/L2Select.cuh | 2 +- cpp/open3d/core/nns/kernel/Limits.cuh | 2 +- cpp/open3d/core/nns/kernel/MergeNetwork.cuh | 2 +- cpp/open3d/core/nns/kernel/Pair.cuh | 2 +- cpp/open3d/core/nns/kernel/PtxUtils.cuh | 2 +- cpp/open3d/core/nns/kernel/Reduction.cuh | 2 +- cpp/open3d/core/nns/kernel/ReductionOps.cuh | 2 +- cpp/open3d/core/nns/kernel/Select.cuh | 2 +- cpp/open3d/core/nns/kernel/StaticUtils.cuh | 2 +- cpp/open3d/core/nns/kernel/WarpShuffle.cuh | 2 +- cpp/open3d/data/Dataset.cpp | 2 +- cpp/open3d/data/Dataset.h | 2 +- cpp/open3d/data/dataset/ArmadilloMesh.cpp | 2 +- cpp/open3d/data/dataset/AvocadoModel.cpp | 2 +- cpp/open3d/data/dataset/BedroomRGBDImages.cpp | 2 +- cpp/open3d/data/dataset/BunnyMesh.cpp | 2 +- cpp/open3d/data/dataset/CrateModel.cpp | 2 +- cpp/open3d/data/dataset/DamagedHelmetModel.cpp | 2 +- cpp/open3d/data/dataset/DemoColoredICPPointClouds.cpp | 2 +- cpp/open3d/data/dataset/DemoCropPointCloud.cpp | 2 +- cpp/open3d/data/dataset/DemoCustomVisualization.cpp | 2 +- cpp/open3d/data/dataset/DemoDopplerICPSequence.cpp | 2 +- cpp/open3d/data/dataset/DemoFeatureMatchingPointClouds.cpp | 2 +- cpp/open3d/data/dataset/DemoICPPointClouds.cpp | 2 +- cpp/open3d/data/dataset/DemoPoseGraphOptimization.cpp | 2 +- cpp/open3d/data/dataset/EaglePointCloud.cpp | 2 +- cpp/open3d/data/dataset/FlightHelmetModel.cpp | 2 +- cpp/open3d/data/dataset/JackJackL515Bag.cpp | 2 +- cpp/open3d/data/dataset/JuneauImage.cpp | 2 +- cpp/open3d/data/dataset/KnotMesh.cpp | 2 +- cpp/open3d/data/dataset/LivingRoomPointClouds.cpp | 2 +- cpp/open3d/data/dataset/LoungeRGBDImages.cpp | 2 +- cpp/open3d/data/dataset/MetalTexture.cpp | 2 +- cpp/open3d/data/dataset/MonkeyModel.cpp | 2 +- cpp/open3d/data/dataset/OfficePointClouds.cpp | 2 +- cpp/open3d/data/dataset/PCDPointCloud.cpp | 2 +- cpp/open3d/data/dataset/PLYPointCloud.cpp | 2 +- cpp/open3d/data/dataset/PTSPointCloud.cpp | 2 +- cpp/open3d/data/dataset/PaintedPlasterTexture.cpp | 2 +- cpp/open3d/data/dataset/RedwoodIndoorLivingRoom1.cpp | 2 +- cpp/open3d/data/dataset/RedwoodIndoorLivingRoom2.cpp | 2 +- cpp/open3d/data/dataset/RedwoodIndoorOffice1.cpp | 2 +- cpp/open3d/data/dataset/RedwoodIndoorOffice2.cpp | 2 +- cpp/open3d/data/dataset/SampleFountainRGBDImages.cpp | 2 +- cpp/open3d/data/dataset/SampleICPPointClouds.cpp | 2 +- cpp/open3d/data/dataset/SampleL515Bag.cpp | 2 +- cpp/open3d/data/dataset/SampleNYURGBDImage.cpp | 2 +- cpp/open3d/data/dataset/SampleRedwoodRGBDImages.cpp | 2 +- cpp/open3d/data/dataset/SampleSUNRGBDImage.cpp | 2 +- cpp/open3d/data/dataset/SampleTUMRGBDImage.cpp | 2 +- cpp/open3d/data/dataset/SwordModel.cpp | 2 +- cpp/open3d/data/dataset/TerrazzoTexture.cpp | 2 +- cpp/open3d/data/dataset/TilesTexture.cpp | 2 +- cpp/open3d/data/dataset/WoodFloorTexture.cpp | 2 +- cpp/open3d/data/dataset/WoodTexture.cpp | 2 +- cpp/open3d/geometry/BoundingVolume.cpp | 2 +- cpp/open3d/geometry/BoundingVolume.h | 2 +- cpp/open3d/geometry/EstimateNormals.cpp | 2 +- cpp/open3d/geometry/Geometry.h | 2 +- cpp/open3d/geometry/Geometry2D.h | 2 +- cpp/open3d/geometry/Geometry3D.cpp | 2 +- cpp/open3d/geometry/Geometry3D.h | 2 +- cpp/open3d/geometry/HalfEdgeTriangleMesh.cpp | 2 +- cpp/open3d/geometry/HalfEdgeTriangleMesh.h | 2 +- cpp/open3d/geometry/ISSKeypoints.cpp | 2 +- cpp/open3d/geometry/Image.cpp | 2 +- cpp/open3d/geometry/Image.h | 2 +- cpp/open3d/geometry/ImageFactory.cpp | 2 +- cpp/open3d/geometry/IntersectionTest.cpp | 2 +- cpp/open3d/geometry/IntersectionTest.h | 2 +- cpp/open3d/geometry/KDTreeFlann.cpp | 2 +- cpp/open3d/geometry/KDTreeFlann.h | 2 +- cpp/open3d/geometry/KDTreeSearchParam.h | 2 +- cpp/open3d/geometry/Keypoint.h | 2 +- cpp/open3d/geometry/Line3D.cpp | 2 +- cpp/open3d/geometry/Line3D.h | 2 +- cpp/open3d/geometry/LineSet.cpp | 2 +- cpp/open3d/geometry/LineSet.h | 2 +- cpp/open3d/geometry/LineSetFactory.cpp | 2 +- cpp/open3d/geometry/MeshBase.cpp | 2 +- cpp/open3d/geometry/MeshBase.h | 2 +- cpp/open3d/geometry/Octree.cpp | 2 +- cpp/open3d/geometry/Octree.h | 2 +- cpp/open3d/geometry/PointCloud.cpp | 2 +- cpp/open3d/geometry/PointCloud.h | 2 +- cpp/open3d/geometry/PointCloudCluster.cpp | 2 +- cpp/open3d/geometry/PointCloudFactory.cpp | 2 +- cpp/open3d/geometry/PointCloudPlanarPatchDetection.cpp | 2 +- cpp/open3d/geometry/PointCloudSegmentation.cpp | 2 +- cpp/open3d/geometry/Qhull.cpp | 2 +- cpp/open3d/geometry/Qhull.h | 2 +- cpp/open3d/geometry/RGBDImage.cpp | 2 +- cpp/open3d/geometry/RGBDImage.h | 2 +- cpp/open3d/geometry/RGBDImageFactory.cpp | 2 +- cpp/open3d/geometry/SurfaceReconstructionAlphaShape.cpp | 2 +- cpp/open3d/geometry/SurfaceReconstructionBallPivoting.cpp | 2 +- cpp/open3d/geometry/SurfaceReconstructionPoisson.cpp | 2 +- cpp/open3d/geometry/TetraMesh.cpp | 2 +- cpp/open3d/geometry/TetraMesh.h | 2 +- cpp/open3d/geometry/TetraMeshFactory.cpp | 2 +- cpp/open3d/geometry/TriangleMesh.cpp | 2 +- cpp/open3d/geometry/TriangleMesh.h | 2 +- cpp/open3d/geometry/TriangleMeshDeformation.cpp | 2 +- cpp/open3d/geometry/TriangleMeshFactory.cpp | 2 +- cpp/open3d/geometry/TriangleMeshSimplification.cpp | 2 +- cpp/open3d/geometry/TriangleMeshSubdivide.cpp | 2 +- cpp/open3d/geometry/VoxelGrid.cpp | 2 +- cpp/open3d/geometry/VoxelGrid.h | 2 +- cpp/open3d/geometry/VoxelGridFactory.cpp | 2 +- cpp/open3d/io/FeatureIO.cpp | 2 +- cpp/open3d/io/FeatureIO.h | 2 +- cpp/open3d/io/FileFormatIO.cpp | 2 +- cpp/open3d/io/FileFormatIO.h | 2 +- cpp/open3d/io/IJsonConvertibleIO.cpp | 2 +- cpp/open3d/io/IJsonConvertibleIO.h | 2 +- cpp/open3d/io/ImageIO.cpp | 2 +- cpp/open3d/io/ImageIO.h | 2 +- cpp/open3d/io/ImageWarpingFieldIO.cpp | 2 +- cpp/open3d/io/ImageWarpingFieldIO.h | 2 +- cpp/open3d/io/LineSetIO.cpp | 2 +- cpp/open3d/io/LineSetIO.h | 2 +- cpp/open3d/io/ModelIO.cpp | 2 +- cpp/open3d/io/ModelIO.h | 2 +- cpp/open3d/io/OctreeIO.cpp | 2 +- cpp/open3d/io/OctreeIO.h | 2 +- cpp/open3d/io/PinholeCameraTrajectoryIO.cpp | 2 +- cpp/open3d/io/PinholeCameraTrajectoryIO.h | 2 +- cpp/open3d/io/PointCloudIO.cpp | 2 +- cpp/open3d/io/PointCloudIO.h | 2 +- cpp/open3d/io/PoseGraphIO.cpp | 2 +- cpp/open3d/io/PoseGraphIO.h | 2 +- cpp/open3d/io/TriangleMeshIO.cpp | 2 +- cpp/open3d/io/TriangleMeshIO.h | 2 +- cpp/open3d/io/VoxelGridIO.cpp | 2 +- cpp/open3d/io/VoxelGridIO.h | 2 +- cpp/open3d/io/file_format/FileASSIMP.cpp | 2 +- cpp/open3d/io/file_format/FileBIN.cpp | 2 +- cpp/open3d/io/file_format/FileGLTF.cpp | 2 +- cpp/open3d/io/file_format/FileJPG.cpp | 2 +- cpp/open3d/io/file_format/FileJSON.cpp | 2 +- cpp/open3d/io/file_format/FileLOG.cpp | 2 +- cpp/open3d/io/file_format/FileOBJ.cpp | 2 +- cpp/open3d/io/file_format/FileOFF.cpp | 2 +- cpp/open3d/io/file_format/FilePCD.cpp | 2 +- cpp/open3d/io/file_format/FilePLY.cpp | 2 +- cpp/open3d/io/file_format/FilePNG.cpp | 2 +- cpp/open3d/io/file_format/FilePTS.cpp | 2 +- cpp/open3d/io/file_format/FileSTL.cpp | 2 +- cpp/open3d/io/file_format/FileTUM.cpp | 2 +- cpp/open3d/io/file_format/FileXYZ.cpp | 2 +- cpp/open3d/io/file_format/FileXYZN.cpp | 2 +- cpp/open3d/io/file_format/FileXYZRGB.cpp | 2 +- cpp/open3d/io/rpc/BufferConnection.cpp | 2 +- cpp/open3d/io/rpc/BufferConnection.h | 2 +- cpp/open3d/io/rpc/Connection.cpp | 2 +- cpp/open3d/io/rpc/Connection.h | 2 +- cpp/open3d/io/rpc/ConnectionBase.h | 2 +- cpp/open3d/io/rpc/DummyMessageProcessor.h | 2 +- cpp/open3d/io/rpc/DummyReceiver.cpp | 2 +- cpp/open3d/io/rpc/DummyReceiver.h | 2 +- cpp/open3d/io/rpc/MessageProcessorBase.cpp | 2 +- cpp/open3d/io/rpc/MessageProcessorBase.h | 2 +- cpp/open3d/io/rpc/MessageUtils.cpp | 2 +- cpp/open3d/io/rpc/MessageUtils.h | 2 +- cpp/open3d/io/rpc/Messages.h | 2 +- cpp/open3d/io/rpc/RemoteFunctions.cpp | 2 +- cpp/open3d/io/rpc/RemoteFunctions.h | 2 +- cpp/open3d/io/rpc/ZMQContext.cpp | 2 +- cpp/open3d/io/rpc/ZMQContext.h | 2 +- cpp/open3d/io/rpc/ZMQReceiver.cpp | 2 +- cpp/open3d/io/rpc/ZMQReceiver.h | 2 +- cpp/open3d/io/sensor/RGBDRecorder.h | 2 +- cpp/open3d/io/sensor/RGBDSensor.h | 2 +- cpp/open3d/io/sensor/RGBDSensorConfig.h | 2 +- cpp/open3d/io/sensor/azure_kinect/AzureKinectRecorder.cpp | 2 +- cpp/open3d/io/sensor/azure_kinect/AzureKinectRecorder.h | 2 +- cpp/open3d/io/sensor/azure_kinect/AzureKinectSensor.cpp | 2 +- cpp/open3d/io/sensor/azure_kinect/AzureKinectSensor.h | 2 +- .../io/sensor/azure_kinect/AzureKinectSensorConfig.cpp | 2 +- cpp/open3d/io/sensor/azure_kinect/AzureKinectSensorConfig.h | 2 +- cpp/open3d/io/sensor/azure_kinect/K4aPlugin.cpp | 2 +- cpp/open3d/io/sensor/azure_kinect/K4aPlugin.h | 2 +- cpp/open3d/io/sensor/azure_kinect/MKVMetadata.cpp | 2 +- cpp/open3d/io/sensor/azure_kinect/MKVMetadata.h | 2 +- cpp/open3d/io/sensor/azure_kinect/MKVReader.cpp | 2 +- cpp/open3d/io/sensor/azure_kinect/MKVReader.h | 2 +- cpp/open3d/io/sensor/azure_kinect/MKVWriter.cpp | 2 +- cpp/open3d/io/sensor/azure_kinect/MKVWriter.h | 2 +- cpp/open3d/io/sensor/azure_kinect/PluginMacros.h | 2 +- cpp/open3d/ml/Helper.h | 2 +- cpp/open3d/ml/ShapeChecking.h | 2 +- cpp/open3d/ml/contrib/BallQuery.cu | 2 +- cpp/open3d/ml/contrib/BallQuery.cuh | 2 +- cpp/open3d/ml/contrib/Cloud.cpp | 2 +- cpp/open3d/ml/contrib/Cloud.h | 2 +- cpp/open3d/ml/contrib/GridSubsampling.cpp | 2 +- cpp/open3d/ml/contrib/GridSubsampling.h | 2 +- cpp/open3d/ml/contrib/InterpolatePoints.cu | 2 +- cpp/open3d/ml/contrib/InterpolatePoints.cuh | 2 +- cpp/open3d/ml/contrib/IoU.cpp | 2 +- cpp/open3d/ml/contrib/IoU.cu | 2 +- cpp/open3d/ml/contrib/IoU.h | 2 +- cpp/open3d/ml/contrib/IoUImpl.h | 2 +- cpp/open3d/ml/contrib/Nms.cpp | 2 +- cpp/open3d/ml/contrib/Nms.cu | 2 +- cpp/open3d/ml/contrib/Nms.h | 2 +- cpp/open3d/ml/contrib/PointSampling.cuh | 2 +- cpp/open3d/ml/contrib/RoiPoolKernel.cu | 2 +- cpp/open3d/ml/contrib/RoiPoolKernel.h | 2 +- cpp/open3d/ml/contrib/TrilinearDevoxelize.cu | 2 +- cpp/open3d/ml/contrib/TrilinearDevoxelize.cuh | 2 +- cpp/open3d/ml/contrib/cuda_utils.h | 2 +- cpp/open3d/ml/impl/continuous_conv/ContinuousConv.cuh | 2 +- cpp/open3d/ml/impl/continuous_conv/ContinuousConv.h | 2 +- .../impl/continuous_conv/ContinuousConvBackpropFilter.cuh | 2 +- .../ml/impl/continuous_conv/ContinuousConvBackpropFilter.h | 2 +- .../ml/impl/continuous_conv/ContinuousConvCUDAKernels.cu | 2 +- .../ml/impl/continuous_conv/ContinuousConvCUDAKernels.h | 2 +- .../ml/impl/continuous_conv/ContinuousConvTranspose.cuh | 2 +- .../ml/impl/continuous_conv/ContinuousConvTranspose.h | 2 +- .../ContinuousConvTransposeBackpropFilter.cuh | 2 +- .../continuous_conv/ContinuousConvTransposeBackpropFilter.h | 2 +- cpp/open3d/ml/impl/continuous_conv/ContinuousConvTypes.h | 2 +- .../ml/impl/continuous_conv/CoordinateTransformation.cuh | 2 +- .../ml/impl/continuous_conv/CoordinateTransformation.h | 2 +- cpp/open3d/ml/impl/misc/InvertNeighborsList.cuh | 2 +- cpp/open3d/ml/impl/misc/InvertNeighborsList.h | 2 +- cpp/open3d/ml/impl/misc/MemoryAllocation.h | 2 +- cpp/open3d/ml/impl/misc/NeighborSearchCommon.h | 2 +- cpp/open3d/ml/impl/misc/RaggedToDense.cuh | 2 +- cpp/open3d/ml/impl/misc/RaggedToDense.h | 2 +- cpp/open3d/ml/impl/misc/ReduceSubarraysSum.cuh | 2 +- cpp/open3d/ml/impl/misc/ReduceSubarraysSum.h | 2 +- cpp/open3d/ml/impl/misc/VoxelPooling.h | 2 +- cpp/open3d/ml/impl/misc/Voxelize.cuh | 2 +- cpp/open3d/ml/impl/misc/Voxelize.h | 2 +- cpp/open3d/ml/impl/sparse_conv/SparseConv.cuh | 2 +- cpp/open3d/ml/impl/sparse_conv/SparseConv.h | 2 +- cpp/open3d/ml/impl/sparse_conv/SparseConvBackpropFilter.cuh | 2 +- cpp/open3d/ml/impl/sparse_conv/SparseConvBackpropFilter.h | 2 +- cpp/open3d/ml/impl/sparse_conv/SparseConvCUDAKernels.cu | 2 +- cpp/open3d/ml/impl/sparse_conv/SparseConvCUDAKernels.h | 2 +- cpp/open3d/ml/impl/sparse_conv/SparseConvTranspose.cuh | 2 +- cpp/open3d/ml/impl/sparse_conv/SparseConvTranspose.h | 2 +- .../impl/sparse_conv/SparseConvTransposeBackpropFilter.cuh | 2 +- .../ml/impl/sparse_conv/SparseConvTransposeBackpropFilter.h | 2 +- cpp/open3d/ml/paddle/PaddleHelper.cpp | 2 +- cpp/open3d/ml/paddle/PaddleHelper.h | 2 +- .../ContinuousConvBackpropFilterOpKernel.cpp | 2 +- .../continuous_conv/ContinuousConvBackpropFilterOpKernel.cu | 2 +- .../continuous_conv/ContinuousConvBackpropFilterOpKernel.h | 2 +- cpp/open3d/ml/paddle/continuous_conv/ContinuousConvHelper.h | 2 +- .../ml/paddle/continuous_conv/ContinuousConvOpKernel.cpp | 2 +- .../ml/paddle/continuous_conv/ContinuousConvOpKernel.cu | 2 +- .../ml/paddle/continuous_conv/ContinuousConvOpKernel.h | 2 +- cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOps.cpp | 2 +- .../ContinuousConvTransposeBackpropFilterOpKernel.cpp | 2 +- .../ContinuousConvTransposeBackpropFilterOpKernel.cu | 2 +- .../ContinuousConvTransposeBackpropFilterOpKernel.h | 2 +- .../continuous_conv/ContinuousConvTransposeOpKernel.cpp | 2 +- .../continuous_conv/ContinuousConvTransposeOpKernel.cu | 2 +- .../continuous_conv/ContinuousConvTransposeOpKernel.h | 2 +- .../paddle/continuous_conv/ContinuousConvTransposeOps.cpp | 2 +- cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cpp | 2 +- cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cu | 2 +- cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOps.cpp | 2 +- cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cpp | 2 +- cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu | 2 +- cpp/open3d/ml/paddle/misc/FixedRadiusSearchOps.cpp | 2 +- cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cpp | 2 +- cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu | 2 +- cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.h | 2 +- cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp | 2 +- cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h | 2 +- cpp/open3d/ml/paddle/misc/KnnSearchOpKernel.cpp | 2 +- cpp/open3d/ml/paddle/misc/KnnSearchOps.cpp | 2 +- cpp/open3d/ml/paddle/misc/NeighborSearchAllocator.h | 2 +- cpp/open3d/ml/paddle/misc/NmsOps.cpp | 2 +- cpp/open3d/ml/paddle/misc/RadiusSearchOpKernel.cpp | 2 +- cpp/open3d/ml/paddle/misc/RadiusSearchOps.cpp | 2 +- cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cpp | 2 +- cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cu | 2 +- cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.h | 2 +- cpp/open3d/ml/paddle/misc/RaggedToDenseOps.cpp | 2 +- cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cpp | 2 +- cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cu | 2 +- cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.h | 2 +- cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.cpp | 2 +- cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.h | 2 +- cpp/open3d/ml/paddle/misc/RoiPoolOps.cpp | 2 +- cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp | 2 +- cpp/open3d/ml/paddle/misc/VoxelPoolingOps.cpp | 2 +- cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cpp | 2 +- cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cu | 2 +- cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.h | 2 +- cpp/open3d/ml/paddle/misc/VoxelizeOps.cpp | 2 +- cpp/open3d/ml/paddle/pointnet/BallQueryKernel.cu | 2 +- cpp/open3d/ml/paddle/pointnet/BallQueryKernel.h | 2 +- cpp/open3d/ml/paddle/pointnet/BallQueryOps.cpp | 2 +- cpp/open3d/ml/paddle/pointnet/InterpolateKernel.cu | 2 +- cpp/open3d/ml/paddle/pointnet/InterpolateKernel.h | 2 +- cpp/open3d/ml/paddle/pointnet/InterpolateOps.cpp | 2 +- cpp/open3d/ml/paddle/pointnet/SamplingKernel.cu | 2 +- cpp/open3d/ml/paddle/pointnet/SamplingKernel.h | 2 +- cpp/open3d/ml/paddle/pointnet/SamplingOps.cpp | 2 +- .../paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cpp | 2 +- .../paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cu | 2 +- .../paddle/sparse_conv/SparseConvBackpropFilterOpKernel.h | 2 +- cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cpp | 2 +- cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cu | 2 +- cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.h | 2 +- cpp/open3d/ml/paddle/sparse_conv/SparseConvOps.cpp | 2 +- .../SparseConvTransposeBackpropFilterOpKernel.cpp | 2 +- .../SparseConvTransposeBackpropFilterOpKernel.cu | 2 +- .../sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h | 2 +- .../ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cpp | 2 +- .../ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cu | 2 +- .../ml/paddle/sparse_conv/SparseConvTransposeOpKernel.h | 2 +- cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOps.cpp | 2 +- cpp/open3d/ml/pytorch/TorchHelper.h | 2 +- .../ContinuousConvBackpropFilterOpKernel.cpp | 2 +- .../continuous_conv/ContinuousConvBackpropFilterOpKernel.cu | 2 +- .../continuous_conv/ContinuousConvBackpropFilterOpKernel.h | 2 +- .../ml/pytorch/continuous_conv/ContinuousConvHelper.h | 2 +- .../ml/pytorch/continuous_conv/ContinuousConvOpKernel.cpp | 2 +- .../ml/pytorch/continuous_conv/ContinuousConvOpKernel.cu | 2 +- .../ml/pytorch/continuous_conv/ContinuousConvOpKernel.h | 2 +- cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOps.cpp | 2 +- .../ContinuousConvTransposeBackpropFilterOpKernel.cpp | 2 +- .../ContinuousConvTransposeBackpropFilterOpKernel.cu | 2 +- .../ContinuousConvTransposeBackpropFilterOpKernel.h | 2 +- .../continuous_conv/ContinuousConvTransposeOpKernel.cpp | 2 +- .../continuous_conv/ContinuousConvTransposeOpKernel.cu | 2 +- .../continuous_conv/ContinuousConvTransposeOpKernel.h | 2 +- .../pytorch/continuous_conv/ContinuousConvTransposeOps.cpp | 2 +- .../ml/pytorch/misc/BuildSpatialHashTableOpKernel.cpp | 2 +- cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOpKernel.cu | 2 +- cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOps.cpp | 2 +- cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOpKernel.cpp | 2 +- cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOpKernel.cu | 2 +- cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOps.cpp | 2 +- cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.cpp | 2 +- cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.cu | 2 +- cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.h | 2 +- cpp/open3d/ml/pytorch/misc/InvertNeighborsListOps.cpp | 2 +- cpp/open3d/ml/pytorch/misc/InvertNeighborsListOps.h | 2 +- cpp/open3d/ml/pytorch/misc/KnnSearchOpKernel.cpp | 2 +- cpp/open3d/ml/pytorch/misc/KnnSearchOps.cpp | 2 +- cpp/open3d/ml/pytorch/misc/NeighborSearchAllocator.h | 2 +- cpp/open3d/ml/pytorch/misc/NmsOps.cpp | 2 +- cpp/open3d/ml/pytorch/misc/RadiusSearchOpKernel.cpp | 2 +- cpp/open3d/ml/pytorch/misc/RadiusSearchOps.cpp | 2 +- cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.cpp | 2 +- cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.cu | 2 +- cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.h | 2 +- cpp/open3d/ml/pytorch/misc/RaggedToDenseOps.cpp | 2 +- cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.cpp | 2 +- cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.cu | 2 +- cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.h | 2 +- cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOps.cpp | 2 +- cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOps.h | 2 +- cpp/open3d/ml/pytorch/misc/RoiPoolOps.cpp | 2 +- cpp/open3d/ml/pytorch/misc/VoxelPoolingOpKernel.cpp | 2 +- cpp/open3d/ml/pytorch/misc/VoxelPoolingOps.cpp | 2 +- cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.cpp | 2 +- cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.cu | 2 +- cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.h | 2 +- cpp/open3d/ml/pytorch/misc/VoxelizeOps.cpp | 2 +- cpp/open3d/ml/pytorch/pointnet/BallQueryKernel.cu | 2 +- cpp/open3d/ml/pytorch/pointnet/BallQueryKernel.h | 2 +- cpp/open3d/ml/pytorch/pointnet/BallQueryOps.cpp | 2 +- cpp/open3d/ml/pytorch/pointnet/InterpolateKernel.cu | 2 +- cpp/open3d/ml/pytorch/pointnet/InterpolateKernel.h | 2 +- cpp/open3d/ml/pytorch/pointnet/InterpolateOps.cpp | 2 +- cpp/open3d/ml/pytorch/pointnet/SamplingKernel.cu | 2 +- cpp/open3d/ml/pytorch/pointnet/SamplingKernel.h | 2 +- cpp/open3d/ml/pytorch/pointnet/SamplingOps.cpp | 2 +- cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeKernel.cu | 2 +- cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeKernel.h | 2 +- cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeOps.cpp | 2 +- cpp/open3d/ml/pytorch/ragged_tensor/RaggedTensor.cpp | 2 +- cpp/open3d/ml/pytorch/ragged_tensor/RaggedTensor.h | 2 +- .../sparse_conv/SparseConvBackpropFilterOpKernel.cpp | 2 +- .../pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.cu | 2 +- .../pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.h | 2 +- cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.cpp | 2 +- cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.cu | 2 +- cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.h | 2 +- cpp/open3d/ml/pytorch/sparse_conv/SparseConvOps.cpp | 2 +- .../SparseConvTransposeBackpropFilterOpKernel.cpp | 2 +- .../SparseConvTransposeBackpropFilterOpKernel.cu | 2 +- .../sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h | 2 +- .../ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.cpp | 2 +- .../ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.cu | 2 +- .../ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.h | 2 +- .../ml/pytorch/sparse_conv/SparseConvTransposeOps.cpp | 2 +- cpp/open3d/ml/tensorflow/TensorFlowHelper.h | 2 +- .../ContinuousConvBackpropFilterOpKernel.cpp | 2 +- .../continuous_conv/ContinuousConvBackpropFilterOpKernel.cu | 2 +- .../continuous_conv/ContinuousConvBackpropFilterOpKernel.h | 2 +- .../continuous_conv/ContinuousConvBackpropFilterOps.cpp | 2 +- .../tensorflow/continuous_conv/ContinuousConvOpKernel.cpp | 2 +- .../ml/tensorflow/continuous_conv/ContinuousConvOpKernel.cu | 2 +- .../ml/tensorflow/continuous_conv/ContinuousConvOpKernel.h | 2 +- .../ml/tensorflow/continuous_conv/ContinuousConvOps.cpp | 2 +- .../ContinuousConvTransposeBackpropFilterOpKernel.cpp | 2 +- .../ContinuousConvTransposeBackpropFilterOpKernel.cu | 2 +- .../ContinuousConvTransposeBackpropFilterOpKernel.h | 2 +- .../ContinuousConvTransposeBackpropFilterOps.cpp | 2 +- .../continuous_conv/ContinuousConvTransposeOpKernel.cpp | 2 +- .../continuous_conv/ContinuousConvTransposeOpKernel.cu | 2 +- .../continuous_conv/ContinuousConvTransposeOpKernel.h | 2 +- .../continuous_conv/ContinuousConvTransposeOps.cpp | 2 +- .../ml/tensorflow/misc/BuildSpatialHashTableOpKernel.cpp | 2 +- .../ml/tensorflow/misc/BuildSpatialHashTableOpKernel.cu | 2 +- .../ml/tensorflow/misc/BuildSpatialHashTableOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOps.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.cu | 2 +- cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOps.cpp | 2 +- .../ml/tensorflow/misc/InvertNeighborsListOpKernel.cpp | 2 +- .../ml/tensorflow/misc/InvertNeighborsListOpKernel.cu | 2 +- cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOps.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/KnnSearchOpKernel.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/KnnSearchOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/misc/KnnSearchOps.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/NmsOpKernel.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/NmsOpKernel.cu | 2 +- cpp/open3d/ml/tensorflow/misc/NmsOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/misc/NmsOps.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/RadiusSearchOpKernel.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/RadiusSearchOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/misc/RadiusSearchOps.cpp | 2 +- .../ml/tensorflow/misc/ReduceSubarraysSumOpKernel.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.cu | 2 +- cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOps.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/VoxelPoolingGradOpKernel.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/VoxelPoolingGradOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/misc/VoxelPoolingOpKernel.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/VoxelPoolingOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/misc/VoxelPoolingOps.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.cpp | 2 +- cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.cu | 2 +- cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/misc/VoxelizeOps.cpp | 2 +- cpp/open3d/ml/tensorflow/pointnet/BallQueryOpKernel.cu | 2 +- cpp/open3d/ml/tensorflow/pointnet/BallQueryOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/pointnet/BallQueryOps.cpp | 2 +- cpp/open3d/ml/tensorflow/pointnet/InterpolateOpKernel.cu | 2 +- cpp/open3d/ml/tensorflow/pointnet/InterpolateOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/pointnet/InterpolateOps.cpp | 2 +- cpp/open3d/ml/tensorflow/pointnet/RoiPoolOpKernel.cu | 2 +- cpp/open3d/ml/tensorflow/pointnet/RoiPoolOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/pointnet/RoiPoolOps.cpp | 2 +- cpp/open3d/ml/tensorflow/pointnet/SamplingOpKernel.cu | 2 +- cpp/open3d/ml/tensorflow/pointnet/SamplingOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/pointnet/SamplingOps.cpp | 2 +- cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeKernel.cu | 2 +- cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeKernel.h | 2 +- cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeOps.cpp | 2 +- .../sparse_conv/SparseConvBackpropFilterOpKernel.cpp | 2 +- .../sparse_conv/SparseConvBackpropFilterOpKernel.cu | 2 +- .../sparse_conv/SparseConvBackpropFilterOpKernel.h | 2 +- .../tensorflow/sparse_conv/SparseConvBackpropFilterOps.cpp | 2 +- cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.cpp | 2 +- cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.cu | 2 +- cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.h | 2 +- cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOps.cpp | 2 +- .../SparseConvTransposeBackpropFilterOpKernel.cpp | 2 +- .../SparseConvTransposeBackpropFilterOpKernel.cu | 2 +- .../sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h | 2 +- .../sparse_conv/SparseConvTransposeBackpropFilterOps.cpp | 2 +- .../tensorflow/sparse_conv/SparseConvTransposeOpKernel.cpp | 2 +- .../tensorflow/sparse_conv/SparseConvTransposeOpKernel.cu | 2 +- .../ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.h | 2 +- .../ml/tensorflow/sparse_conv/SparseConvTransposeOps.cpp | 2 +- .../ml/tensorflow/tf_subsampling/tf_batch_subsampling.cpp | 2 +- cpp/open3d/ml/tensorflow/tf_subsampling/tf_subsampling.cpp | 2 +- cpp/open3d/pipelines/color_map/ColorMapUtils.cpp | 2 +- cpp/open3d/pipelines/color_map/ColorMapUtils.h | 2 +- cpp/open3d/pipelines/color_map/ImageWarpingField.cpp | 2 +- cpp/open3d/pipelines/color_map/ImageWarpingField.h | 2 +- cpp/open3d/pipelines/color_map/NonRigidOptimizer.cpp | 2 +- cpp/open3d/pipelines/color_map/NonRigidOptimizer.h | 2 +- cpp/open3d/pipelines/color_map/RigidOptimizer.cpp | 2 +- cpp/open3d/pipelines/color_map/RigidOptimizer.h | 2 +- cpp/open3d/pipelines/integration/MarchingCubesConst.h | 2 +- cpp/open3d/pipelines/integration/ScalableTSDFVolume.cpp | 2 +- cpp/open3d/pipelines/integration/ScalableTSDFVolume.h | 2 +- cpp/open3d/pipelines/integration/TSDFVolume.h | 2 +- cpp/open3d/pipelines/integration/UniformTSDFVolume.cpp | 2 +- cpp/open3d/pipelines/integration/UniformTSDFVolume.h | 2 +- cpp/open3d/pipelines/odometry/Odometry.cpp | 2 +- cpp/open3d/pipelines/odometry/Odometry.h | 2 +- cpp/open3d/pipelines/odometry/OdometryOption.h | 2 +- cpp/open3d/pipelines/odometry/RGBDOdometryJacobian.cpp | 2 +- cpp/open3d/pipelines/odometry/RGBDOdometryJacobian.h | 2 +- cpp/open3d/pipelines/registration/ColoredICP.cpp | 2 +- cpp/open3d/pipelines/registration/ColoredICP.h | 2 +- cpp/open3d/pipelines/registration/CorrespondenceChecker.cpp | 2 +- cpp/open3d/pipelines/registration/CorrespondenceChecker.h | 2 +- .../pipelines/registration/FastGlobalRegistration.cpp | 2 +- cpp/open3d/pipelines/registration/FastGlobalRegistration.h | 2 +- cpp/open3d/pipelines/registration/Feature.cpp | 2 +- cpp/open3d/pipelines/registration/Feature.h | 2 +- cpp/open3d/pipelines/registration/GeneralizedICP.cpp | 2 +- cpp/open3d/pipelines/registration/GeneralizedICP.h | 2 +- cpp/open3d/pipelines/registration/GlobalOptimization.cpp | 2 +- cpp/open3d/pipelines/registration/GlobalOptimization.h | 2 +- .../registration/GlobalOptimizationConvergenceCriteria.h | 2 +- .../pipelines/registration/GlobalOptimizationMethod.h | 2 +- cpp/open3d/pipelines/registration/PoseGraph.cpp | 2 +- cpp/open3d/pipelines/registration/PoseGraph.h | 2 +- cpp/open3d/pipelines/registration/Registration.cpp | 2 +- cpp/open3d/pipelines/registration/Registration.h | 2 +- cpp/open3d/pipelines/registration/RobustKernel.cpp | 2 +- cpp/open3d/pipelines/registration/RobustKernel.h | 2 +- .../pipelines/registration/TransformationEstimation.cpp | 2 +- .../pipelines/registration/TransformationEstimation.h | 2 +- cpp/open3d/t/geometry/BoundingVolume.cpp | 2 +- cpp/open3d/t/geometry/BoundingVolume.h | 2 +- cpp/open3d/t/geometry/DrawableGeometry.h | 2 +- cpp/open3d/t/geometry/Geometry.h | 2 +- cpp/open3d/t/geometry/Image.cpp | 2 +- cpp/open3d/t/geometry/Image.h | 2 +- cpp/open3d/t/geometry/LineSet.cpp | 2 +- cpp/open3d/t/geometry/LineSet.h | 2 +- cpp/open3d/t/geometry/PointCloud.cpp | 2 +- cpp/open3d/t/geometry/PointCloud.h | 2 +- cpp/open3d/t/geometry/RGBDImage.cpp | 2 +- cpp/open3d/t/geometry/RGBDImage.h | 2 +- cpp/open3d/t/geometry/RaycastingScene.cpp | 2 +- cpp/open3d/t/geometry/RaycastingScene.h | 2 +- cpp/open3d/t/geometry/TensorMap.cpp | 2 +- cpp/open3d/t/geometry/TensorMap.h | 2 +- cpp/open3d/t/geometry/TriangleMesh.cpp | 2 +- cpp/open3d/t/geometry/TriangleMesh.h | 2 +- cpp/open3d/t/geometry/TriangleMeshFactory.cpp | 2 +- cpp/open3d/t/geometry/Utility.h | 2 +- cpp/open3d/t/geometry/VoxelBlockGrid.cpp | 2 +- cpp/open3d/t/geometry/VoxelBlockGrid.h | 2 +- cpp/open3d/t/geometry/VtkUtils.cpp | 2 +- cpp/open3d/t/geometry/VtkUtils.h | 2 +- cpp/open3d/t/geometry/kernel/GeometryIndexer.h | 2 +- cpp/open3d/t/geometry/kernel/GeometryMacros.h | 2 +- cpp/open3d/t/geometry/kernel/IPPImage.cpp | 2 +- cpp/open3d/t/geometry/kernel/IPPImage.h | 2 +- cpp/open3d/t/geometry/kernel/Image.cpp | 2 +- cpp/open3d/t/geometry/kernel/Image.h | 2 +- cpp/open3d/t/geometry/kernel/ImageCPU.cpp | 2 +- cpp/open3d/t/geometry/kernel/ImageCUDA.cu | 2 +- cpp/open3d/t/geometry/kernel/ImageImpl.h | 2 +- cpp/open3d/t/geometry/kernel/NPPImage.cpp | 2 +- cpp/open3d/t/geometry/kernel/NPPImage.h | 2 +- cpp/open3d/t/geometry/kernel/PCAPartition.cpp | 2 +- cpp/open3d/t/geometry/kernel/PCAPartition.h | 2 +- cpp/open3d/t/geometry/kernel/PointCloud.cpp | 2 +- cpp/open3d/t/geometry/kernel/PointCloud.h | 2 +- cpp/open3d/t/geometry/kernel/PointCloudCPU.cpp | 2 +- cpp/open3d/t/geometry/kernel/PointCloudCUDA.cu | 2 +- cpp/open3d/t/geometry/kernel/PointCloudImpl.h | 2 +- cpp/open3d/t/geometry/kernel/Transform.cpp | 2 +- cpp/open3d/t/geometry/kernel/Transform.h | 2 +- cpp/open3d/t/geometry/kernel/TransformCPU.cpp | 2 +- cpp/open3d/t/geometry/kernel/TransformCUDA.cu | 2 +- cpp/open3d/t/geometry/kernel/TransformImpl.h | 2 +- cpp/open3d/t/geometry/kernel/TriangleMesh.cpp | 2 +- cpp/open3d/t/geometry/kernel/TriangleMesh.h | 2 +- cpp/open3d/t/geometry/kernel/TriangleMeshCPU.cpp | 2 +- cpp/open3d/t/geometry/kernel/TriangleMeshCUDA.cu | 2 +- cpp/open3d/t/geometry/kernel/TriangleMeshImpl.h | 2 +- cpp/open3d/t/geometry/kernel/UVUnwrapping.cpp | 2 +- cpp/open3d/t/geometry/kernel/UVUnwrapping.h | 2 +- cpp/open3d/t/geometry/kernel/VoxelBlockGrid.cpp | 2 +- cpp/open3d/t/geometry/kernel/VoxelBlockGrid.h | 2 +- cpp/open3d/t/geometry/kernel/VoxelBlockGridCPU.cpp | 2 +- cpp/open3d/t/geometry/kernel/VoxelBlockGridCUDA.cu | 2 +- cpp/open3d/t/geometry/kernel/VoxelBlockGridImpl.h | 2 +- cpp/open3d/t/io/HashMapIO.cpp | 2 +- cpp/open3d/t/io/HashMapIO.h | 2 +- cpp/open3d/t/io/ImageIO.cpp | 2 +- cpp/open3d/t/io/ImageIO.h | 2 +- cpp/open3d/t/io/NumpyIO.cpp | 2 +- cpp/open3d/t/io/NumpyIO.h | 2 +- cpp/open3d/t/io/PointCloudIO.cpp | 2 +- cpp/open3d/t/io/PointCloudIO.h | 2 +- cpp/open3d/t/io/TriangleMeshIO.cpp | 2 +- cpp/open3d/t/io/TriangleMeshIO.h | 2 +- cpp/open3d/t/io/file_format/FileASSIMP.cpp | 2 +- cpp/open3d/t/io/file_format/FileJPG.cpp | 2 +- cpp/open3d/t/io/file_format/FilePCD.cpp | 2 +- cpp/open3d/t/io/file_format/FilePLY.cpp | 2 +- cpp/open3d/t/io/file_format/FilePNG.cpp | 2 +- cpp/open3d/t/io/file_format/FilePTS.cpp | 2 +- cpp/open3d/t/io/file_format/FileTXT.cpp | 2 +- cpp/open3d/t/io/sensor/RGBDSensor.h | 2 +- cpp/open3d/t/io/sensor/RGBDVideoMetadata.cpp | 2 +- cpp/open3d/t/io/sensor/RGBDVideoMetadata.h | 2 +- cpp/open3d/t/io/sensor/RGBDVideoReader.cpp | 2 +- cpp/open3d/t/io/sensor/RGBDVideoReader.h | 2 +- cpp/open3d/t/io/sensor/realsense/RSBagReader.cpp | 2 +- cpp/open3d/t/io/sensor/realsense/RSBagReader.h | 2 +- cpp/open3d/t/io/sensor/realsense/RealSensePrivate.h | 2 +- cpp/open3d/t/io/sensor/realsense/RealSenseSensor.cpp | 2 +- cpp/open3d/t/io/sensor/realsense/RealSenseSensor.h | 2 +- cpp/open3d/t/io/sensor/realsense/RealSenseSensorConfig.cpp | 2 +- cpp/open3d/t/io/sensor/realsense/RealSenseSensorConfig.h | 2 +- cpp/open3d/t/pipelines/kernel/Feature.cpp | 2 +- cpp/open3d/t/pipelines/kernel/Feature.h | 2 +- cpp/open3d/t/pipelines/kernel/FeatureCPU.cpp | 2 +- cpp/open3d/t/pipelines/kernel/FeatureCUDA.cu | 2 +- cpp/open3d/t/pipelines/kernel/FeatureImpl.h | 2 +- cpp/open3d/t/pipelines/kernel/FillInLinearSystem.cpp | 2 +- cpp/open3d/t/pipelines/kernel/FillInLinearSystem.h | 2 +- cpp/open3d/t/pipelines/kernel/FillInLinearSystemCPU.cpp | 2 +- cpp/open3d/t/pipelines/kernel/FillInLinearSystemCUDA.cu | 2 +- cpp/open3d/t/pipelines/kernel/FillInLinearSystemImpl.h | 2 +- cpp/open3d/t/pipelines/kernel/RGBDOdometry.cpp | 2 +- cpp/open3d/t/pipelines/kernel/RGBDOdometry.h | 2 +- cpp/open3d/t/pipelines/kernel/RGBDOdometryCPU.cpp | 2 +- cpp/open3d/t/pipelines/kernel/RGBDOdometryCUDA.cu | 2 +- cpp/open3d/t/pipelines/kernel/RGBDOdometryImpl.h | 2 +- cpp/open3d/t/pipelines/kernel/RGBDOdometryJacobianImpl.h | 2 +- cpp/open3d/t/pipelines/kernel/Registration.cpp | 2 +- cpp/open3d/t/pipelines/kernel/Registration.h | 2 +- cpp/open3d/t/pipelines/kernel/RegistrationCPU.cpp | 2 +- cpp/open3d/t/pipelines/kernel/RegistrationCUDA.cu | 2 +- cpp/open3d/t/pipelines/kernel/RegistrationImpl.h | 2 +- cpp/open3d/t/pipelines/kernel/TransformationConverter.cpp | 2 +- cpp/open3d/t/pipelines/kernel/TransformationConverter.cu | 2 +- cpp/open3d/t/pipelines/kernel/TransformationConverter.h | 2 +- cpp/open3d/t/pipelines/kernel/TransformationConverterImpl.h | 2 +- cpp/open3d/t/pipelines/odometry/RGBDOdometry.cpp | 2 +- cpp/open3d/t/pipelines/odometry/RGBDOdometry.h | 2 +- cpp/open3d/t/pipelines/registration/Feature.cpp | 2 +- cpp/open3d/t/pipelines/registration/Feature.h | 2 +- cpp/open3d/t/pipelines/registration/Registration.cpp | 2 +- cpp/open3d/t/pipelines/registration/Registration.h | 2 +- cpp/open3d/t/pipelines/registration/RobustKernel.h | 2 +- cpp/open3d/t/pipelines/registration/RobustKernelImpl.h | 2 +- .../t/pipelines/registration/TransformationEstimation.cpp | 2 +- .../t/pipelines/registration/TransformationEstimation.h | 2 +- cpp/open3d/t/pipelines/slac/ControlGrid.cpp | 2 +- cpp/open3d/t/pipelines/slac/ControlGrid.h | 2 +- cpp/open3d/t/pipelines/slac/FillInLinearSystemImpl.h | 2 +- cpp/open3d/t/pipelines/slac/SLACOptimizer.cpp | 2 +- cpp/open3d/t/pipelines/slac/SLACOptimizer.h | 2 +- cpp/open3d/t/pipelines/slac/Visualization.cpp | 2 +- cpp/open3d/t/pipelines/slac/Visualization.h | 2 +- cpp/open3d/t/pipelines/slam/Frame.h | 2 +- cpp/open3d/t/pipelines/slam/Model.cpp | 2 +- cpp/open3d/t/pipelines/slam/Model.h | 2 +- cpp/open3d/utility/CPUInfo.cpp | 2 +- cpp/open3d/utility/CPUInfo.h | 2 +- cpp/open3d/utility/CompilerInfo.cpp | 2 +- cpp/open3d/utility/CompilerInfo.h | 2 +- cpp/open3d/utility/Console.cpp | 2 +- cpp/open3d/utility/Console.h | 2 +- cpp/open3d/utility/Download.cpp | 2 +- cpp/open3d/utility/Download.h | 2 +- cpp/open3d/utility/Eigen.cpp | 2 +- cpp/open3d/utility/Eigen.h | 2 +- cpp/open3d/utility/Extract.cpp | 2 +- cpp/open3d/utility/Extract.h | 2 +- cpp/open3d/utility/ExtractZIP.cpp | 2 +- cpp/open3d/utility/ExtractZIP.h | 2 +- cpp/open3d/utility/FileSystem.cpp | 2 +- cpp/open3d/utility/FileSystem.h | 2 +- cpp/open3d/utility/Helper.cpp | 2 +- cpp/open3d/utility/Helper.h | 2 +- cpp/open3d/utility/Helper.isph | 2 +- cpp/open3d/utility/IJsonConvertible.cpp | 2 +- cpp/open3d/utility/IJsonConvertible.h | 2 +- cpp/open3d/utility/ISAInfo.cpp | 2 +- cpp/open3d/utility/ISAInfo.h | 2 +- cpp/open3d/utility/ISAInfo.ispc | 2 +- cpp/open3d/utility/ISAInfo.isph | 2 +- cpp/open3d/utility/Logging.cpp | 2 +- cpp/open3d/utility/Logging.h | 2 +- cpp/open3d/utility/MiniVec.h | 2 +- cpp/open3d/utility/Optional.h | 2 +- cpp/open3d/utility/Overload.h | 2 +- cpp/open3d/utility/Parallel.cpp | 2 +- cpp/open3d/utility/Parallel.h | 2 +- cpp/open3d/utility/ParallelScan.h | 2 +- cpp/open3d/utility/Preprocessor.h | 2 +- cpp/open3d/utility/ProgressBar.cpp | 2 +- cpp/open3d/utility/ProgressBar.h | 2 +- cpp/open3d/utility/ProgressReporters.h | 2 +- cpp/open3d/utility/Random.cpp | 2 +- cpp/open3d/utility/Random.h | 2 +- cpp/open3d/utility/Timer.cpp | 2 +- cpp/open3d/utility/Timer.h | 2 +- cpp/open3d/visualization/app/Viewer.cpp | 2 +- cpp/open3d/visualization/app/Viewer.h | 2 +- cpp/open3d/visualization/gui/Application.cpp | 2 +- cpp/open3d/visualization/gui/Application.h | 2 +- cpp/open3d/visualization/gui/BitmapWindowSystem.cpp | 2 +- cpp/open3d/visualization/gui/BitmapWindowSystem.h | 2 +- cpp/open3d/visualization/gui/Button.cpp | 2 +- cpp/open3d/visualization/gui/Button.h | 2 +- cpp/open3d/visualization/gui/Checkbox.cpp | 2 +- cpp/open3d/visualization/gui/Checkbox.h | 2 +- cpp/open3d/visualization/gui/Color.cpp | 2 +- cpp/open3d/visualization/gui/Color.h | 2 +- cpp/open3d/visualization/gui/ColorEdit.cpp | 2 +- cpp/open3d/visualization/gui/ColorEdit.h | 2 +- cpp/open3d/visualization/gui/Combobox.cpp | 2 +- cpp/open3d/visualization/gui/Combobox.h | 2 +- cpp/open3d/visualization/gui/Dialog.cpp | 2 +- cpp/open3d/visualization/gui/Dialog.h | 2 +- cpp/open3d/visualization/gui/Events.cpp | 2 +- cpp/open3d/visualization/gui/Events.h | 2 +- cpp/open3d/visualization/gui/FileDialog.cpp | 2 +- cpp/open3d/visualization/gui/FileDialog.h | 2 +- cpp/open3d/visualization/gui/FileDialogNative.cpp | 2 +- cpp/open3d/visualization/gui/Font.cpp | 2 +- cpp/open3d/visualization/gui/Font.h | 2 +- cpp/open3d/visualization/gui/GLFWWindowSystem.cpp | 2 +- cpp/open3d/visualization/gui/GLFWWindowSystem.h | 2 +- cpp/open3d/visualization/gui/Gui.cpp | 2 +- cpp/open3d/visualization/gui/Gui.h | 2 +- cpp/open3d/visualization/gui/ImageWidget.cpp | 2 +- cpp/open3d/visualization/gui/ImageWidget.h | 2 +- cpp/open3d/visualization/gui/ImguiFilamentBridge.cpp | 2 +- cpp/open3d/visualization/gui/ImguiFilamentBridge.h | 2 +- cpp/open3d/visualization/gui/Label.cpp | 2 +- cpp/open3d/visualization/gui/Label.h | 2 +- cpp/open3d/visualization/gui/Label3D.cpp | 2 +- cpp/open3d/visualization/gui/Label3D.h | 2 +- cpp/open3d/visualization/gui/Layout.cpp | 2 +- cpp/open3d/visualization/gui/Layout.h | 2 +- cpp/open3d/visualization/gui/ListView.cpp | 2 +- cpp/open3d/visualization/gui/ListView.h | 2 +- cpp/open3d/visualization/gui/Menu.cpp | 2 +- cpp/open3d/visualization/gui/Menu.h | 2 +- cpp/open3d/visualization/gui/MenuBase.h | 2 +- cpp/open3d/visualization/gui/MenuImgui.cpp | 2 +- cpp/open3d/visualization/gui/MenuImgui.h | 2 +- cpp/open3d/visualization/gui/MenuMacOS.h | 2 +- cpp/open3d/visualization/gui/MenuMacOS.mm | 2 +- cpp/open3d/visualization/gui/Native.h | 2 +- cpp/open3d/visualization/gui/NativeLinux.cpp | 2 +- cpp/open3d/visualization/gui/NativeMacOS.mm | 2 +- cpp/open3d/visualization/gui/NativeWin32.cpp | 2 +- cpp/open3d/visualization/gui/NumberEdit.cpp | 2 +- cpp/open3d/visualization/gui/NumberEdit.h | 2 +- cpp/open3d/visualization/gui/PickPointsInteractor.cpp | 2 +- cpp/open3d/visualization/gui/PickPointsInteractor.h | 2 +- cpp/open3d/visualization/gui/ProgressBar.cpp | 2 +- cpp/open3d/visualization/gui/ProgressBar.h | 2 +- cpp/open3d/visualization/gui/RadioButton.cpp | 2 +- cpp/open3d/visualization/gui/RadioButton.h | 2 +- cpp/open3d/visualization/gui/SceneWidget.cpp | 2 +- cpp/open3d/visualization/gui/SceneWidget.h | 2 +- cpp/open3d/visualization/gui/Slider.cpp | 2 +- cpp/open3d/visualization/gui/Slider.h | 2 +- cpp/open3d/visualization/gui/StackedWidget.cpp | 2 +- cpp/open3d/visualization/gui/StackedWidget.h | 2 +- cpp/open3d/visualization/gui/TabControl.cpp | 2 +- cpp/open3d/visualization/gui/TabControl.h | 2 +- cpp/open3d/visualization/gui/Task.cpp | 2 +- cpp/open3d/visualization/gui/Task.h | 2 +- cpp/open3d/visualization/gui/TextEdit.cpp | 2 +- cpp/open3d/visualization/gui/TextEdit.h | 2 +- cpp/open3d/visualization/gui/Theme.cpp | 2 +- cpp/open3d/visualization/gui/Theme.h | 2 +- cpp/open3d/visualization/gui/ToggleSwitch.cpp | 2 +- cpp/open3d/visualization/gui/ToggleSwitch.h | 2 +- cpp/open3d/visualization/gui/TreeView.cpp | 2 +- cpp/open3d/visualization/gui/TreeView.h | 2 +- cpp/open3d/visualization/gui/UIImage.cpp | 2 +- cpp/open3d/visualization/gui/UIImage.h | 2 +- cpp/open3d/visualization/gui/Util.cpp | 2 +- cpp/open3d/visualization/gui/Util.h | 2 +- cpp/open3d/visualization/gui/VectorEdit.cpp | 2 +- cpp/open3d/visualization/gui/VectorEdit.h | 2 +- cpp/open3d/visualization/gui/Widget.cpp | 2 +- cpp/open3d/visualization/gui/Widget.h | 2 +- cpp/open3d/visualization/gui/WidgetProxy.cpp | 2 +- cpp/open3d/visualization/gui/WidgetProxy.h | 2 +- cpp/open3d/visualization/gui/WidgetStack.cpp | 2 +- cpp/open3d/visualization/gui/WidgetStack.h | 2 +- cpp/open3d/visualization/gui/Window.cpp | 2 +- cpp/open3d/visualization/gui/Window.h | 2 +- cpp/open3d/visualization/gui/WindowSystem.h | 2 +- cpp/open3d/visualization/rendering/Camera.cpp | 2 +- cpp/open3d/visualization/rendering/Camera.h | 2 +- .../visualization/rendering/CameraInteractorLogic.cpp | 2 +- cpp/open3d/visualization/rendering/CameraInteractorLogic.h | 2 +- .../visualization/rendering/CameraSphereInteractorLogic.cpp | 2 +- .../visualization/rendering/CameraSphereInteractorLogic.h | 2 +- cpp/open3d/visualization/rendering/ColorGrading.cpp | 2 +- cpp/open3d/visualization/rendering/ColorGrading.h | 2 +- cpp/open3d/visualization/rendering/Gradient.cpp | 2 +- cpp/open3d/visualization/rendering/Gradient.h | 2 +- .../visualization/rendering/IBLRotationInteractorLogic.cpp | 2 +- .../visualization/rendering/IBLRotationInteractorLogic.h | 2 +- cpp/open3d/visualization/rendering/Light.h | 2 +- .../rendering/LightDirectionInteractorLogic.cpp | 2 +- .../visualization/rendering/LightDirectionInteractorLogic.h | 2 +- cpp/open3d/visualization/rendering/Material.cpp | 2 +- cpp/open3d/visualization/rendering/Material.h | 2 +- cpp/open3d/visualization/rendering/MaterialModifier.cpp | 2 +- cpp/open3d/visualization/rendering/MaterialModifier.h | 2 +- cpp/open3d/visualization/rendering/MaterialRecord.h | 2 +- .../visualization/rendering/MatrixInteractorLogic.cpp | 2 +- cpp/open3d/visualization/rendering/MatrixInteractorLogic.h | 2 +- cpp/open3d/visualization/rendering/Model.h | 2 +- cpp/open3d/visualization/rendering/ModelInteractorLogic.cpp | 2 +- cpp/open3d/visualization/rendering/ModelInteractorLogic.h | 2 +- cpp/open3d/visualization/rendering/Open3DScene.cpp | 2 +- cpp/open3d/visualization/rendering/Open3DScene.h | 2 +- cpp/open3d/visualization/rendering/RenderToBuffer.h | 2 +- cpp/open3d/visualization/rendering/Renderer.cpp | 2 +- cpp/open3d/visualization/rendering/Renderer.h | 2 +- cpp/open3d/visualization/rendering/RendererHandle.cpp | 2 +- cpp/open3d/visualization/rendering/RendererHandle.h | 2 +- cpp/open3d/visualization/rendering/RendererStructs.h | 2 +- .../visualization/rendering/RotationInteractorLogic.cpp | 2 +- .../visualization/rendering/RotationInteractorLogic.h | 2 +- cpp/open3d/visualization/rendering/Scene.h | 2 +- cpp/open3d/visualization/rendering/View.h | 2 +- .../visualization/rendering/filament/FilamentCamera.cpp | 2 +- .../visualization/rendering/filament/FilamentCamera.h | 2 +- .../visualization/rendering/filament/FilamentEngine.cpp | 2 +- .../visualization/rendering/filament/FilamentEngine.h | 2 +- .../rendering/filament/FilamentEntitiesMods.cpp | 2 +- .../visualization/rendering/filament/FilamentEntitiesMods.h | 2 +- .../rendering/filament/FilamentGeometryBuffersBuilder.cpp | 2 +- .../rendering/filament/FilamentGeometryBuffersBuilder.h | 2 +- .../rendering/filament/FilamentRenderToBuffer.cpp | 2 +- .../rendering/filament/FilamentRenderToBuffer.h | 2 +- .../visualization/rendering/filament/FilamentRenderer.cpp | 2 +- .../visualization/rendering/filament/FilamentRenderer.h | 2 +- .../rendering/filament/FilamentResourceManager.cpp | 2 +- .../rendering/filament/FilamentResourceManager.h | 2 +- .../visualization/rendering/filament/FilamentScene.cpp | 2 +- cpp/open3d/visualization/rendering/filament/FilamentScene.h | 2 +- .../visualization/rendering/filament/FilamentView.cpp | 2 +- cpp/open3d/visualization/rendering/filament/FilamentView.h | 2 +- .../visualization/rendering/filament/LineSetBuffers.cpp | 2 +- .../visualization/rendering/filament/PointCloudBuffers.cpp | 2 +- .../rendering/filament/TriangleMeshBuffers.cpp | 2 +- cpp/open3d/visualization/shader/GeometryRenderer.cpp | 2 +- cpp/open3d/visualization/shader/GeometryRenderer.h | 2 +- cpp/open3d/visualization/shader/ImageMaskShader.cpp | 2 +- cpp/open3d/visualization/shader/ImageMaskShader.h | 2 +- cpp/open3d/visualization/shader/ImageShader.cpp | 2 +- cpp/open3d/visualization/shader/ImageShader.h | 2 +- cpp/open3d/visualization/shader/NormalShader.cpp | 2 +- cpp/open3d/visualization/shader/NormalShader.h | 2 +- cpp/open3d/visualization/shader/PhongShader.cpp | 2 +- cpp/open3d/visualization/shader/PhongShader.h | 2 +- cpp/open3d/visualization/shader/PickingShader.cpp | 2 +- cpp/open3d/visualization/shader/PickingShader.h | 2 +- cpp/open3d/visualization/shader/RGBDImageShader.cpp | 2 +- cpp/open3d/visualization/shader/RGBDImageShader.h | 2 +- cpp/open3d/visualization/shader/ShaderWrapper.cpp | 2 +- cpp/open3d/visualization/shader/ShaderWrapper.h | 2 +- cpp/open3d/visualization/shader/Simple2DShader.cpp | 2 +- cpp/open3d/visualization/shader/Simple2DShader.h | 2 +- cpp/open3d/visualization/shader/SimpleBlackShader.cpp | 2 +- cpp/open3d/visualization/shader/SimpleBlackShader.h | 2 +- cpp/open3d/visualization/shader/SimpleShader.cpp | 2 +- cpp/open3d/visualization/shader/SimpleShader.h | 2 +- cpp/open3d/visualization/shader/TexturePhongShader.cpp | 2 +- cpp/open3d/visualization/shader/TexturePhongShader.h | 2 +- cpp/open3d/visualization/shader/TextureSimpleShader.cpp | 2 +- cpp/open3d/visualization/shader/TextureSimpleShader.h | 2 +- cpp/open3d/visualization/utility/ColorMap.cpp | 2 +- cpp/open3d/visualization/utility/ColorMap.h | 2 +- cpp/open3d/visualization/utility/Draw.cpp | 2 +- cpp/open3d/visualization/utility/Draw.h | 2 +- cpp/open3d/visualization/utility/DrawGeometry.cpp | 2 +- cpp/open3d/visualization/utility/DrawGeometry.h | 2 +- cpp/open3d/visualization/utility/GLHelper.cpp | 2 +- cpp/open3d/visualization/utility/GLHelper.h | 2 +- cpp/open3d/visualization/utility/PointCloudPicker.cpp | 2 +- cpp/open3d/visualization/utility/PointCloudPicker.h | 2 +- cpp/open3d/visualization/utility/SelectionPolygon.cpp | 2 +- cpp/open3d/visualization/utility/SelectionPolygon.h | 2 +- cpp/open3d/visualization/utility/SelectionPolygonVolume.cpp | 2 +- cpp/open3d/visualization/utility/SelectionPolygonVolume.h | 2 +- cpp/open3d/visualization/visualizer/GuiSettingsModel.cpp | 2 +- cpp/open3d/visualization/visualizer/GuiSettingsModel.h | 2 +- cpp/open3d/visualization/visualizer/GuiSettingsView.cpp | 2 +- cpp/open3d/visualization/visualizer/GuiSettingsView.h | 2 +- cpp/open3d/visualization/visualizer/GuiVisualizer.cpp | 4 ++-- cpp/open3d/visualization/visualizer/GuiVisualizer.h | 2 +- cpp/open3d/visualization/visualizer/GuiWidgets.cpp | 2 +- cpp/open3d/visualization/visualizer/GuiWidgets.h | 2 +- cpp/open3d/visualization/visualizer/MessageProcessor.cpp | 2 +- cpp/open3d/visualization/visualizer/MessageProcessor.h | 2 +- cpp/open3d/visualization/visualizer/O3DVisualizer.cpp | 4 ++-- cpp/open3d/visualization/visualizer/O3DVisualizer.h | 2 +- .../visualization/visualizer/O3DVisualizerSelections.cpp | 2 +- .../visualization/visualizer/O3DVisualizerSelections.h | 2 +- cpp/open3d/visualization/visualizer/RenderOption.cpp | 2 +- cpp/open3d/visualization/visualizer/RenderOption.h | 2 +- .../visualization/visualizer/RenderOptionWithEditing.cpp | 2 +- .../visualization/visualizer/RenderOptionWithEditing.h | 2 +- cpp/open3d/visualization/visualizer/ViewControl.cpp | 2 +- cpp/open3d/visualization/visualizer/ViewControl.h | 2 +- .../visualizer/ViewControlWithCustomAnimation.cpp | 2 +- .../visualizer/ViewControlWithCustomAnimation.h | 2 +- .../visualization/visualizer/ViewControlWithEditing.cpp | 2 +- .../visualization/visualizer/ViewControlWithEditing.h | 2 +- cpp/open3d/visualization/visualizer/ViewParameters.cpp | 2 +- cpp/open3d/visualization/visualizer/ViewParameters.h | 2 +- cpp/open3d/visualization/visualizer/ViewTrajectory.cpp | 2 +- cpp/open3d/visualization/visualizer/ViewTrajectory.h | 2 +- cpp/open3d/visualization/visualizer/Visualizer.cpp | 2 +- cpp/open3d/visualization/visualizer/Visualizer.h | 2 +- cpp/open3d/visualization/visualizer/VisualizerCallback.cpp | 2 +- cpp/open3d/visualization/visualizer/VisualizerRender.cpp | 2 +- .../visualizer/VisualizerWithCustomAnimation.cpp | 2 +- .../visualizer/VisualizerWithCustomAnimation.h | 2 +- .../visualization/visualizer/VisualizerWithEditing.cpp | 2 +- cpp/open3d/visualization/visualizer/VisualizerWithEditing.h | 2 +- .../visualization/visualizer/VisualizerWithKeyCallback.cpp | 2 +- .../visualization/visualizer/VisualizerWithKeyCallback.h | 2 +- .../visualizer/VisualizerWithVertexSelection.cpp | 2 +- .../visualizer/VisualizerWithVertexSelection.h | 2 +- .../visualization/webrtc_server/BitmapTrackSource.cpp | 2 +- cpp/open3d/visualization/webrtc_server/BitmapTrackSource.h | 2 +- .../webrtc_server/HttpServerRequestHandler.cpp | 2 +- .../visualization/webrtc_server/HttpServerRequestHandler.h | 2 +- cpp/open3d/visualization/webrtc_server/ImageCapturer.cpp | 2 +- cpp/open3d/visualization/webrtc_server/ImageCapturer.h | 2 +- .../visualization/webrtc_server/PeerConnectionManager.cpp | 2 +- .../visualization/webrtc_server/PeerConnectionManager.h | 2 +- cpp/open3d/visualization/webrtc_server/VideoFilter.h | 2 +- cpp/open3d/visualization/webrtc_server/VideoScaler.h | 2 +- .../visualization/webrtc_server/WebRTCWindowSystem.cpp | 2 +- cpp/open3d/visualization/webrtc_server/WebRTCWindowSystem.h | 2 +- .../visualization/webrtc_server/html/webrtcstreamer.js | 2 +- cpp/pybind/camera/camera.cpp | 2 +- cpp/pybind/camera/camera.h | 2 +- cpp/pybind/core/blob.cpp | 2 +- cpp/pybind/core/core.cpp | 2 +- cpp/pybind/core/core.h | 2 +- cpp/pybind/core/cuda_utils.cpp | 2 +- cpp/pybind/core/device.cpp | 2 +- cpp/pybind/core/dtype.cpp | 2 +- cpp/pybind/core/hashmap.cpp | 2 +- cpp/pybind/core/kernel.cpp | 2 +- cpp/pybind/core/linalg.cpp | 2 +- cpp/pybind/core/nns/nearest_neighbor_search.cpp | 2 +- cpp/pybind/core/nns/nearest_neighbor_search.h | 2 +- cpp/pybind/core/scalar.cpp | 2 +- cpp/pybind/core/size_vector.cpp | 2 +- cpp/pybind/core/sycl_utils.cpp | 2 +- cpp/pybind/core/tensor.cpp | 2 +- cpp/pybind/core/tensor_accessor.cpp | 2 +- cpp/pybind/core/tensor_converter.cpp | 2 +- cpp/pybind/core/tensor_converter.h | 2 +- cpp/pybind/core/tensor_function.cpp | 2 +- cpp/pybind/core/tensor_type_caster.cpp | 2 +- cpp/pybind/core/tensor_type_caster.h | 2 +- cpp/pybind/data/dataset.cpp | 2 +- cpp/pybind/data/dataset.h | 2 +- cpp/pybind/docstring.cpp | 2 +- cpp/pybind/docstring.h | 2 +- cpp/pybind/generate_paddle_ops_wrapper.py | 2 +- cpp/pybind/generate_tf_ops_wrapper.py | 2 +- cpp/pybind/generate_torch_ops_wrapper.py | 2 +- cpp/pybind/geometry/boundingvolume.cpp | 2 +- cpp/pybind/geometry/geometry.cpp | 2 +- cpp/pybind/geometry/geometry.h | 2 +- cpp/pybind/geometry/geometry_trampoline.h | 2 +- cpp/pybind/geometry/halfedgetrianglemesh.cpp | 2 +- cpp/pybind/geometry/image.cpp | 2 +- cpp/pybind/geometry/kdtreeflann.cpp | 2 +- cpp/pybind/geometry/keypoint.cpp | 2 +- cpp/pybind/geometry/lineset.cpp | 2 +- cpp/pybind/geometry/meshbase.cpp | 2 +- cpp/pybind/geometry/octree.cpp | 2 +- cpp/pybind/geometry/octree.h | 2 +- cpp/pybind/geometry/pointcloud.cpp | 2 +- cpp/pybind/geometry/tetramesh.cpp | 2 +- cpp/pybind/geometry/trianglemesh.cpp | 2 +- cpp/pybind/geometry/voxelgrid.cpp | 2 +- cpp/pybind/io/class_io.cpp | 2 +- cpp/pybind/io/io.cpp | 2 +- cpp/pybind/io/io.h | 2 +- cpp/pybind/io/rpc.cpp | 2 +- cpp/pybind/io/sensor.cpp | 2 +- cpp/pybind/ml/contrib/contrib.cpp | 2 +- cpp/pybind/ml/contrib/contrib.h | 2 +- cpp/pybind/ml/contrib/contrib_subsample.cpp | 2 +- cpp/pybind/ml/contrib/iou.cpp | 2 +- cpp/pybind/ml/ml.cpp | 2 +- cpp/pybind/ml/ml.h | 2 +- cpp/pybind/open3d_pybind.cpp | 2 +- cpp/pybind/open3d_pybind.h | 2 +- cpp/pybind/pipelines/color_map/color_map.cpp | 2 +- cpp/pybind/pipelines/color_map/color_map.h | 2 +- cpp/pybind/pipelines/integration/integration.cpp | 2 +- cpp/pybind/pipelines/integration/integration.h | 2 +- cpp/pybind/pipelines/odometry/odometry.cpp | 2 +- cpp/pybind/pipelines/odometry/odometry.h | 2 +- cpp/pybind/pipelines/pipelines.cpp | 2 +- cpp/pybind/pipelines/pipelines.h | 2 +- cpp/pybind/pipelines/registration/feature.cpp | 2 +- cpp/pybind/pipelines/registration/global_optimization.cpp | 2 +- cpp/pybind/pipelines/registration/registration.cpp | 2 +- cpp/pybind/pipelines/registration/registration.h | 2 +- cpp/pybind/pipelines/registration/robust_kernels.cpp | 2 +- cpp/pybind/pybind_utils.cpp | 2 +- cpp/pybind/pybind_utils.h | 2 +- cpp/pybind/t/geometry/boundingvolume.cpp | 2 +- cpp/pybind/t/geometry/drawablegeometry.cpp | 2 +- cpp/pybind/t/geometry/geometry.cpp | 2 +- cpp/pybind/t/geometry/geometry.h | 2 +- cpp/pybind/t/geometry/image.cpp | 2 +- cpp/pybind/t/geometry/lineset.cpp | 2 +- cpp/pybind/t/geometry/pointcloud.cpp | 2 +- cpp/pybind/t/geometry/raycasting_scene.cpp | 2 +- cpp/pybind/t/geometry/tensormap.cpp | 2 +- cpp/pybind/t/geometry/trianglemesh.cpp | 2 +- cpp/pybind/t/geometry/voxel_block_grid.cpp | 2 +- cpp/pybind/t/io/class_io.cpp | 2 +- cpp/pybind/t/io/io.cpp | 2 +- cpp/pybind/t/io/io.h | 2 +- cpp/pybind/t/io/sensor.cpp | 2 +- cpp/pybind/t/pipelines/odometry/odometry.cpp | 2 +- cpp/pybind/t/pipelines/odometry/odometry.h | 2 +- cpp/pybind/t/pipelines/pipelines.cpp | 2 +- cpp/pybind/t/pipelines/pipelines.h | 2 +- cpp/pybind/t/pipelines/registration/feature.cpp | 2 +- cpp/pybind/t/pipelines/registration/registration.cpp | 2 +- cpp/pybind/t/pipelines/registration/registration.h | 2 +- cpp/pybind/t/pipelines/registration/robust_kernel.cpp | 2 +- cpp/pybind/t/pipelines/slac/slac.cpp | 2 +- cpp/pybind/t/pipelines/slac/slac.h | 2 +- cpp/pybind/t/pipelines/slam/slam.cpp | 2 +- cpp/pybind/t/pipelines/slam/slam.h | 2 +- cpp/pybind/t/t.cpp | 2 +- cpp/pybind/t/t.h | 2 +- cpp/pybind/utility/eigen.cpp | 2 +- cpp/pybind/utility/logging.cpp | 2 +- cpp/pybind/utility/random.cpp | 2 +- cpp/pybind/utility/utility.cpp | 2 +- cpp/pybind/utility/utility.h | 2 +- cpp/pybind/visualization/app/viewer.cpp | 2 +- cpp/pybind/visualization/app/viewer.h | 2 +- cpp/pybind/visualization/gui/events.cpp | 2 +- cpp/pybind/visualization/gui/gui.cpp | 2 +- cpp/pybind/visualization/gui/gui.h | 2 +- cpp/pybind/visualization/o3dvisualizer.cpp | 2 +- cpp/pybind/visualization/rendering/material.cpp | 2 +- cpp/pybind/visualization/rendering/material.h | 2 +- cpp/pybind/visualization/rendering/rendering.cpp | 2 +- cpp/pybind/visualization/rendering/rendering.h | 2 +- cpp/pybind/visualization/renderoption.cpp | 2 +- cpp/pybind/visualization/utility.cpp | 2 +- cpp/pybind/visualization/viewcontrol.cpp | 2 +- cpp/pybind/visualization/visualization.cpp | 2 +- cpp/pybind/visualization/visualization.h | 2 +- cpp/pybind/visualization/visualization_trampoline.h | 2 +- cpp/pybind/visualization/visualizer.cpp | 2 +- .../visualization/webrtc_server/webrtc_window_system.cpp | 2 +- .../visualization/webrtc_server/webrtc_window_system.h | 2 +- cpp/tests/Main.cpp | 2 +- cpp/tests/Tests.cpp | 2 +- cpp/tests/Tests.h | 2 +- cpp/tests/camera/PinholeCameraIntrinsic.cpp | 2 +- cpp/tests/camera/PinholeCameraParameters.cpp | 2 +- cpp/tests/camera/PinholeCameraTrajectory.cpp | 2 +- cpp/tests/core/Blob.cpp | 2 +- cpp/tests/core/CUDAUtils.cpp | 2 +- cpp/tests/core/CoreTest.cpp | 2 +- cpp/tests/core/CoreTest.h | 2 +- cpp/tests/core/Device.cpp | 2 +- cpp/tests/core/EigenConverter.cpp | 2 +- cpp/tests/core/FixedRadiusIndex.cpp | 2 +- cpp/tests/core/HashMap.cpp | 2 +- cpp/tests/core/Indexer.cpp | 2 +- cpp/tests/core/Indexer.ispc | 2 +- cpp/tests/core/KnnIndex.cpp | 2 +- cpp/tests/core/Linalg.cpp | 2 +- cpp/tests/core/MemoryManager.cpp | 2 +- cpp/tests/core/NanoFlannIndex.cpp | 2 +- cpp/tests/core/NearestNeighborSearch.cpp | 2 +- cpp/tests/core/ParallelFor.cpp | 2 +- cpp/tests/core/ParallelFor.cu | 2 +- cpp/tests/core/ParallelFor.ispc | 2 +- cpp/tests/core/SYCLUtils.cpp | 2 +- cpp/tests/core/Scalar.cpp | 2 +- cpp/tests/core/ShapeUtil.cpp | 2 +- cpp/tests/core/SizeVector.cpp | 2 +- cpp/tests/core/Tensor.cpp | 2 +- cpp/tests/core/TensorCheck.cpp | 2 +- cpp/tests/core/TensorFunction.cpp | 2 +- cpp/tests/core/TensorList.cpp | 2 +- cpp/tests/core/TensorObject.cpp | 2 +- cpp/tests/data/Dataset.cpp | 2 +- cpp/tests/geometry/AccumulatedPoint.cpp | 2 +- cpp/tests/geometry/AxisAlignedBoundingBox.cpp | 2 +- cpp/tests/geometry/EstimateNormals.cpp | 2 +- cpp/tests/geometry/HalfEdgeTriangleMesh.cpp | 2 +- cpp/tests/geometry/Image.cpp | 2 +- cpp/tests/geometry/IntersectionTest.cpp | 2 +- cpp/tests/geometry/KDTreeFlann.cpp | 2 +- cpp/tests/geometry/Line3D.cpp | 2 +- cpp/tests/geometry/LineSet.cpp | 2 +- cpp/tests/geometry/Octree.cpp | 2 +- cpp/tests/geometry/PointCloud.cpp | 2 +- cpp/tests/geometry/RGBDImage.cpp | 2 +- cpp/tests/geometry/TetraMesh.cpp | 2 +- cpp/tests/geometry/TriangleMesh.cpp | 2 +- cpp/tests/geometry/VoxelGrid.cpp | 2 +- cpp/tests/io/FeatureIO.cpp | 2 +- cpp/tests/io/IJsonConvertibleIO.cpp | 2 +- cpp/tests/io/ImageIO.cpp | 2 +- cpp/tests/io/OctreeIO.cpp | 2 +- cpp/tests/io/PinholeCameraTrajectoryIO.cpp | 2 +- cpp/tests/io/PointCloudIO.cpp | 2 +- cpp/tests/io/PoseGraphIO.cpp | 2 +- cpp/tests/io/TriangleMeshIO.cpp | 2 +- cpp/tests/io/VoxelGridIO.cpp | 2 +- cpp/tests/io/file_format/FileBIN.cpp | 2 +- cpp/tests/io/file_format/FileGLTF.cpp | 2 +- cpp/tests/io/file_format/FileJPG.cpp | 2 +- cpp/tests/io/file_format/FileJSON.cpp | 2 +- cpp/tests/io/file_format/FileLOG.cpp | 2 +- cpp/tests/io/file_format/FilePCD.cpp | 2 +- cpp/tests/io/file_format/FilePLY.cpp | 2 +- cpp/tests/io/file_format/FilePNG.cpp | 2 +- cpp/tests/io/file_format/FilePTS.cpp | 2 +- cpp/tests/io/file_format/FileSTL.cpp | 2 +- cpp/tests/io/file_format/FileXYZ.cpp | 2 +- cpp/tests/io/file_format/FileXYZN.cpp | 2 +- cpp/tests/io/file_format/FileXYZRGB.cpp | 2 +- cpp/tests/io/rpc/RemoteFunctions.cpp | 2 +- cpp/tests/io/sensor/AzureKinect/AzureKinectSensorConfig.cpp | 2 +- cpp/tests/ml/ShapeChecking.cpp | 2 +- cpp/tests/pipelines/integration/ScalableTSDFVolume.cpp | 2 +- cpp/tests/pipelines/integration/UniformTSDFVolume.cpp | 2 +- cpp/tests/pipelines/odometry/Odometry.cpp | 2 +- cpp/tests/pipelines/odometry/OdometryOption.cpp | 2 +- cpp/tests/pipelines/odometry/OdometryTools.cpp | 2 +- cpp/tests/pipelines/odometry/OdometryTools.h | 2 +- .../odometry/RGBDOdometryJacobianFromColorTerm.cpp | 2 +- .../odometry/RGBDOdometryJacobianFromHybridTerm.cpp | 2 +- cpp/tests/pipelines/registration/CorrespondenceChecker.cpp | 2 +- cpp/tests/pipelines/registration/FastGlobalRegistration.cpp | 2 +- cpp/tests/pipelines/registration/Feature.cpp | 2 +- cpp/tests/pipelines/registration/GeneralizedICP.cpp | 2 +- cpp/tests/pipelines/registration/GlobalOptimization.cpp | 2 +- .../registration/GlobalOptimizationConvergenceCriteria.cpp | 2 +- cpp/tests/pipelines/registration/PoseGraph.cpp | 2 +- cpp/tests/pipelines/registration/Registration.cpp | 2 +- .../pipelines/registration/TransformationEstimation.cpp | 2 +- cpp/tests/t/geometry/AxisAlignedBoundingBox.cpp | 2 +- cpp/tests/t/geometry/Image.cpp | 2 +- cpp/tests/t/geometry/LineSet.cpp | 2 +- cpp/tests/t/geometry/OrientedBoundingBox.cpp | 2 +- cpp/tests/t/geometry/PointCloud.cpp | 2 +- cpp/tests/t/geometry/TensorMap.cpp | 2 +- cpp/tests/t/geometry/TriangleMesh.cpp | 2 +- cpp/tests/t/geometry/VoxelBlockGrid.cpp | 2 +- cpp/tests/t/geometry/VtkUtils.cpp | 2 +- cpp/tests/t/io/ImageIO.cpp | 2 +- cpp/tests/t/io/NumpyIO.cpp | 2 +- cpp/tests/t/io/PointCloudIO.cpp | 2 +- cpp/tests/t/io/TriangleMeshIO.cpp | 2 +- cpp/tests/t/pipelines/TransformationConverter.cpp | 2 +- cpp/tests/t/pipelines/odometry/RGBDOdometry.cpp | 2 +- cpp/tests/t/pipelines/registration/Feature.cpp | 2 +- cpp/tests/t/pipelines/registration/Registration.cpp | 2 +- .../t/pipelines/registration/TransformationEstimation.cpp | 2 +- cpp/tests/t/pipelines/slac/ControlGrid.cpp | 2 +- cpp/tests/t/pipelines/slac/SLAC.cpp | 2 +- cpp/tests/test_utility/Compare.cpp | 2 +- cpp/tests/test_utility/Compare.h | 2 +- cpp/tests/test_utility/Print.h | 2 +- cpp/tests/test_utility/Rand.cpp | 2 +- cpp/tests/test_utility/Rand.h | 2 +- cpp/tests/test_utility/Raw.cpp | 2 +- cpp/tests/test_utility/Raw.h | 2 +- cpp/tests/test_utility/Sort.cpp | 2 +- cpp/tests/test_utility/Sort.h | 2 +- cpp/tests/utility/Download.cpp | 2 +- cpp/tests/utility/Eigen.cpp | 2 +- cpp/tests/utility/Extract.cpp | 2 +- cpp/tests/utility/FileSystem.cpp | 2 +- cpp/tests/utility/Helper.cpp | 2 +- cpp/tests/utility/Helper.ispc | 2 +- cpp/tests/utility/IJsonConvertible.cpp | 2 +- cpp/tests/utility/ISAInfo.cpp | 2 +- cpp/tests/utility/Logging.cpp | 2 +- cpp/tests/utility/Preprocessor.cpp | 2 +- cpp/tests/utility/ProgressBar.cpp | 2 +- cpp/tests/utility/Random.cpp | 2 +- cpp/tests/utility/Timer.cpp | 2 +- cpp/tests/visualization/rendering/MaterialModifier.cpp | 2 +- cpp/tools/ConvertPointCloud.cpp | 2 +- cpp/tools/GLInfo.cpp | 2 +- cpp/tools/ManuallyAlignPointCloud/AlignmentSession.cpp | 2 +- cpp/tools/ManuallyAlignPointCloud/AlignmentSession.h | 2 +- .../ManuallyAlignPointCloud/ManuallyAlignPointCloud.cpp | 2 +- .../ManuallyAlignPointCloud/VisualizerForAlignment.cpp | 2 +- cpp/tools/ManuallyAlignPointCloud/VisualizerForAlignment.h | 2 +- cpp/tools/ManuallyCropGeometry.cpp | 2 +- cpp/tools/MergeMesh.cpp | 2 +- cpp/tools/ViewGeometry.cpp | 2 +- docs/conf.py | 2 +- docs/jupyter/jupyter_run_all.py | 2 +- docs/jupyter/jupyter_strip_output.py | 2 +- docs/jupyter/open3d_tutorial.py | 2 +- docs/make_docs.py | 2 +- examples/cpp/AzureKinectMKVReader.cpp | 2 +- examples/cpp/AzureKinectRecord.cpp | 2 +- examples/cpp/AzureKinectViewer.cpp | 2 +- examples/cpp/CameraPoseTrajectory.cpp | 2 +- examples/cpp/ColorMapOptimization.cpp | 2 +- examples/cpp/DepthCapture.cpp | 2 +- examples/cpp/Draw.cpp | 2 +- examples/cpp/DrawWebRTC.cpp | 2 +- examples/cpp/EvaluatePCDMatch.cpp | 2 +- examples/cpp/FileDialog.cpp | 2 +- examples/cpp/FileSystem.cpp | 2 +- examples/cpp/Flann.cpp | 2 +- examples/cpp/GeneralizedICP.cpp | 2 +- examples/cpp/ISSKeypoints.cpp | 2 +- examples/cpp/Image.cpp | 2 +- examples/cpp/IntegrateRGBD.cpp | 2 +- examples/cpp/LineSet.cpp | 2 +- examples/cpp/Log.cpp | 2 +- examples/cpp/MultipleWindows.cpp | 2 +- examples/cpp/Octree.cpp | 2 +- examples/cpp/OdometryRGBD.cpp | 2 +- examples/cpp/OfflineSLAM.cpp | 2 +- examples/cpp/OffscreenRendering.cpp | 2 +- examples/cpp/OnlineSLAMRGBD.cpp | 2 +- examples/cpp/OnlineSLAMRealSense.cpp | 2 +- examples/cpp/OnlineSLAMUtil.h | 2 +- examples/cpp/OpenMP.cpp | 2 +- examples/cpp/PCDFileFormat.cpp | 2 +- examples/cpp/PlanarPatchDetection.cpp | 2 +- examples/cpp/PointCloud.cpp | 2 +- examples/cpp/PoseGraph.cpp | 2 +- examples/cpp/ProgramOptions.cpp | 2 +- examples/cpp/RGBDOdometry.cpp | 2 +- examples/cpp/RealSenseBagReader.cpp | 2 +- examples/cpp/RealSenseRecorder.cpp | 2 +- examples/cpp/RegistrationColoredICP.cpp | 2 +- examples/cpp/RegistrationDopplerICP.cpp | 2 +- examples/cpp/RegistrationFGR.cpp | 2 +- examples/cpp/RegistrationRANSAC.cpp | 2 +- examples/cpp/SLAC.cpp | 2 +- examples/cpp/SLACIntegrate.cpp | 2 +- examples/cpp/SYCLDemo.cpp | 2 +- examples/cpp/TICP.cpp | 2 +- examples/cpp/TICPSequential.cpp | 2 +- examples/cpp/TIntegrateRGBD.cpp | 2 +- examples/cpp/TOdometryRGBD.cpp | 2 +- examples/cpp/TriangleMesh.cpp | 2 +- examples/cpp/TrimMeshBasedOnPointCloud.cpp | 2 +- examples/cpp/ViewDistances.cpp | 2 +- examples/cpp/ViewPCDMatch.cpp | 2 +- examples/cpp/Visualizer.cpp | 2 +- examples/cpp/Voxelization.cpp | 2 +- examples/cpp/registration_example_util/download_kitti.py | 2 +- examples/python/benchmark/benchmark_fgr.py | 2 +- examples/python/benchmark/benchmark_nns.py | 2 +- examples/python/benchmark/benchmark_pre.py | 2 +- examples/python/benchmark/benchmark_ransac.py | 2 +- examples/python/benchmark/benchmark_tsdf.py | 2 +- examples/python/benchmark/benchmark_utils.py | 2 +- examples/python/camera/camera_trajectory.py | 2 +- examples/python/geometry/image_processing.py | 2 +- examples/python/geometry/kd_tree_feature_matching.py | 2 +- examples/python/geometry/kd_tree_search.py | 2 +- examples/python/geometry/octree_find_leaf.py | 2 +- examples/python/geometry/octree_from_voxel_grid.py | 2 +- examples/python/geometry/octree_point_cloud.py | 2 +- examples/python/geometry/octree_traversal.py | 2 +- examples/python/geometry/point_cloud_bounding_box.py | 2 +- examples/python/geometry/point_cloud_convex_hull.py | 2 +- examples/python/geometry/point_cloud_crop.py | 2 +- examples/python/geometry/point_cloud_dbscan_clustering.py | 2 +- examples/python/geometry/point_cloud_distance.py | 2 +- .../python/geometry/point_cloud_farthest_point_sampling.py | 2 +- .../python/geometry/point_cloud_hidden_point_removal.py | 2 +- .../python/geometry/point_cloud_iss_keypoint_detector.py | 2 +- examples/python/geometry/point_cloud_normal_estimation.py | 2 +- .../python/geometry/point_cloud_outlier_removal_radius.py | 2 +- .../geometry/point_cloud_outlier_removal_statistical.py | 2 +- examples/python/geometry/point_cloud_paint.py | 2 +- examples/python/geometry/point_cloud_plane_segmentation.py | 2 +- examples/python/geometry/point_cloud_to_depth.py | 2 +- examples/python/geometry/point_cloud_to_rgbd.py | 2 +- examples/python/geometry/point_cloud_transformation.py | 2 +- examples/python/geometry/point_cloud_voxel_downsampling.py | 2 +- examples/python/geometry/point_cloud_with_numpy.py | 2 +- examples/python/geometry/ray_casting_closest_geometry.py | 2 +- examples/python/geometry/ray_casting_sdf.py | 2 +- examples/python/geometry/ray_casting_to_image.py | 2 +- examples/python/geometry/rgbd_datasets.py | 2 +- .../python/geometry/triangle_mesh_connected_components.py | 2 +- examples/python/geometry/triangle_mesh_cropping.py | 2 +- examples/python/geometry/triangle_mesh_deformation.py | 2 +- examples/python/geometry/triangle_mesh_filtering_average.py | 2 +- .../geometry/triangle_mesh_from_point_cloud_alpha_shapes.py | 2 +- .../triangle_mesh_from_point_cloud_ball_pivoting.py | 2 +- .../geometry/triangle_mesh_from_point_cloud_poisson.py | 2 +- examples/python/geometry/triangle_mesh_normal_estimation.py | 2 +- examples/python/geometry/triangle_mesh_properties.py | 2 +- examples/python/geometry/triangle_mesh_sampling.py | 2 +- .../geometry/triangle_mesh_simplification_decimation.py | 2 +- .../triangle_mesh_simplification_vertex_clustering.py | 2 +- examples/python/geometry/triangle_mesh_subdivision.py | 2 +- examples/python/geometry/triangle_mesh_transformation.py | 2 +- examples/python/geometry/triangle_mesh_with_numpy.py | 2 +- examples/python/geometry/voxel_grid_carving.py | 2 +- examples/python/geometry/voxel_grid_from_point_cloud.py | 2 +- examples/python/geometry/voxel_grid_from_triangle_mesh.py | 2 +- examples/python/io/image_io.py | 2 +- examples/python/io/point_cloud_io.py | 2 +- examples/python/io/realsense_io.py | 2 +- examples/python/io/triangle_mesh_io.py | 2 +- examples/python/open3d_example.py | 2 +- examples/python/pipelines/colored_icp_registration.py | 2 +- examples/python/pipelines/doppler_icp_registration.py | 2 +- examples/python/pipelines/icp_registration.py | 2 +- examples/python/pipelines/multiway_registration.py | 2 +- examples/python/pipelines/pose_graph_optimization.py | 2 +- examples/python/pipelines/registration_fgr.py | 2 +- examples/python/pipelines/registration_ransac.py | 2 +- examples/python/pipelines/rgbd_integration_uniform.py | 2 +- examples/python/pipelines/rgbd_odometry.py | 2 +- examples/python/pipelines/robust_icp.py | 2 +- .../color_map_optimization_for_reconstruction_system.py | 2 +- examples/python/reconstruction_system/data_loader.py | 2 +- .../reconstruction_system/debug/pairwise_pc_alignment.py | 2 +- .../reconstruction_system/debug/pairwise_rgbd_alignment.py | 2 +- .../reconstruction_system/debug/visualize_alignment.py | 2 +- .../reconstruction_system/debug/visualize_fragments.py | 2 +- .../reconstruction_system/debug/visualize_pointcloud.py | 2 +- .../python/reconstruction_system/debug/visualize_scene.py | 2 +- examples/python/reconstruction_system/initialize_config.py | 2 +- examples/python/reconstruction_system/integrate_scene.py | 2 +- examples/python/reconstruction_system/make_fragments.py | 2 +- .../python/reconstruction_system/opencv_pose_estimation.py | 2 +- examples/python/reconstruction_system/optimize_posegraph.py | 2 +- .../python/reconstruction_system/refine_registration.py | 2 +- examples/python/reconstruction_system/register_fragments.py | 2 +- examples/python/reconstruction_system/run_system.py | 2 +- .../sensors/azure_kinect_mkv_reader.py | 2 +- .../reconstruction_system/sensors/azure_kinect_recorder.py | 2 +- .../reconstruction_system/sensors/azure_kinect_viewer.py | 2 +- .../reconstruction_system/sensors/realsense_helper.py | 2 +- .../sensors/realsense_pcd_visualizer.py | 2 +- .../reconstruction_system/sensors/realsense_recorder.py | 2 +- examples/python/reconstruction_system/slac.py | 2 +- examples/python/reconstruction_system/slac_integrate.py | 2 +- examples/python/t_reconstruction_system/common.py | 2 +- examples/python/t_reconstruction_system/config.py | 2 +- examples/python/t_reconstruction_system/dense_slam.py | 2 +- examples/python/t_reconstruction_system/dense_slam_gui.py | 2 +- examples/python/t_reconstruction_system/integrate.py | 2 +- examples/python/t_reconstruction_system/integrate_custom.py | 2 +- examples/python/t_reconstruction_system/pose_graph_optim.py | 2 +- examples/python/t_reconstruction_system/ray_casting.py | 2 +- examples/python/t_reconstruction_system/rgbd_odometry.py | 2 +- examples/python/t_reconstruction_system/run_system.py | 2 +- examples/python/t_reconstruction_system/split_fragments.py | 2 +- examples/python/utility/vector.py | 2 +- examples/python/visualization/add_geometry.py | 2 +- examples/python/visualization/all_widgets.py | 2 +- examples/python/visualization/customized_visualization.py | 2 +- .../visualization/customized_visualization_key_action.py | 2 +- examples/python/visualization/demo_scene.py | 2 +- examples/python/visualization/draw.py | 2 +- examples/python/visualization/draw_webrtc.py | 2 +- examples/python/visualization/headless_rendering.py | 2 +- examples/python/visualization/interactive_visualization.py | 2 +- examples/python/visualization/line_width.py | 2 +- examples/python/visualization/load_save_viewpoint.py | 2 +- .../python/visualization/mitsuba_material_estimation.py | 2 +- examples/python/visualization/mouse_and_point_coord.py | 2 +- examples/python/visualization/multiple_windows.py | 2 +- examples/python/visualization/non_blocking_visualization.py | 2 +- examples/python/visualization/non_english.py | 2 +- examples/python/visualization/online_processing.py | 2 +- examples/python/visualization/remove_geometry.py | 2 +- examples/python/visualization/render_to_image.py | 2 +- examples/python/visualization/tensorboard_pytorch.py | 2 +- examples/python/visualization/tensorboard_tensorflow.py | 2 +- examples/python/visualization/text3d.py | 2 +- examples/python/visualization/textured_mesh.py | 2 +- examples/python/visualization/textured_model.py | 2 +- examples/python/visualization/to_mitsuba.py | 2 +- examples/python/visualization/video.py | 2 +- examples/python/visualization/vis_gui.py | 2 +- python/LICENSE.txt | 2 +- python/MANIFEST.in | 2 +- python/benchmarks/core/test_binary_ew.py | 2 +- python/benchmarks/core/test_nns.py | 2 +- python/benchmarks/core/test_unary_ew.py | 2 +- python/benchmarks/open3d_benchmark.py | 2 +- python/js/lib/web_visualizer.js | 2 +- python/open3d/__init__.py | 2 +- python/open3d/ml/__init__.py | 2 +- python/open3d/ml/configs.py | 2 +- python/open3d/ml/contrib/__init__.py | 2 +- python/open3d/ml/datasets.py | 2 +- python/open3d/ml/paddle/__init__.py | 2 +- python/open3d/ml/paddle/classes/__init__.py | 2 +- python/open3d/ml/paddle/classes/ragged_tensor.py | 2 +- python/open3d/ml/paddle/layers/__init__.py | 2 +- python/open3d/ml/paddle/ops/__init__.py | 2 +- python/open3d/ml/paddle/python/layers/convolutions.py | 2 +- python/open3d/ml/paddle/python/layers/neighbor_search.py | 2 +- python/open3d/ml/paddle/python/layers/voxel_pooling.py | 2 +- python/open3d/ml/paddle/python/return_types.py.in | 2 +- python/open3d/ml/tf/__init__.py | 2 +- python/open3d/ml/tf/configs.py | 2 +- python/open3d/ml/tf/dataloaders.py | 2 +- python/open3d/ml/tf/datasets.py | 2 +- python/open3d/ml/tf/layers/__init__.py | 2 +- python/open3d/ml/tf/models.py | 2 +- python/open3d/ml/tf/modules.py | 2 +- python/open3d/ml/tf/ops/__init__.py | 2 +- python/open3d/ml/tf/pipelines.py | 2 +- python/open3d/ml/tf/python/layers/convolutions.py | 2 +- python/open3d/ml/tf/python/layers/neighbor_search.py | 2 +- python/open3d/ml/tf/python/layers/voxel_pooling.py | 2 +- python/open3d/ml/tf/python/ops/gradients.py | 2 +- python/open3d/ml/tf/python/ops/lib.py | 2 +- python/open3d/ml/tf/python/ops/ops.py.in | 2 +- python/open3d/ml/tf/vis.py | 2 +- python/open3d/ml/torch/__init__.py | 2 +- python/open3d/ml/torch/classes/__init__.py | 2 +- python/open3d/ml/torch/classes/ragged_tensor.py | 2 +- python/open3d/ml/torch/configs.py | 2 +- python/open3d/ml/torch/dataloaders.py | 2 +- python/open3d/ml/torch/datasets.py | 2 +- python/open3d/ml/torch/layers/__init__.py | 2 +- python/open3d/ml/torch/models.py | 2 +- python/open3d/ml/torch/modules.py | 2 +- python/open3d/ml/torch/ops/__init__.py | 2 +- python/open3d/ml/torch/pipelines.py | 2 +- python/open3d/ml/torch/python/layers/convolutions.py | 2 +- python/open3d/ml/torch/python/layers/neighbor_search.py | 2 +- python/open3d/ml/torch/python/layers/voxel_pooling.py | 2 +- python/open3d/ml/torch/python/ops.py.in | 2 +- python/open3d/ml/torch/python/return_types.py.in | 2 +- python/open3d/ml/torch/vis.py | 2 +- python/open3d/ml/utils.py | 2 +- python/open3d/ml/vis.py | 2 +- python/open3d/visualization/__init__.py | 2 +- python/open3d/visualization/__main__.py | 2 +- python/open3d/visualization/_external_visualizer.py | 2 +- python/open3d/visualization/async_event_loop.py | 2 +- python/open3d/visualization/draw.py | 2 +- python/open3d/visualization/draw_plotly.py | 2 +- python/open3d/visualization/tensorboard_plugin/colormap.py | 2 +- .../visualization/tensorboard_plugin/frontend/index.js | 2 +- .../visualization/tensorboard_plugin/frontend/style.css | 2 +- python/open3d/visualization/tensorboard_plugin/labellut.py | 2 +- python/open3d/visualization/tensorboard_plugin/metadata.py | 2 +- python/open3d/visualization/tensorboard_plugin/plugin.py | 2 +- .../visualization/tensorboard_plugin/plugin_data.proto | 2 +- .../visualization/tensorboard_plugin/plugin_data_pb2.py | 2 +- python/open3d/visualization/tensorboard_plugin/summary.py | 2 +- python/open3d/visualization/tensorboard_plugin/util.py | 2 +- python/open3d/visualization/to_mitsuba.py | 2 +- python/open3d/web_visualizer.py | 2 +- python/setup.cfg | 2 +- python/setup.py | 2 +- python/test/conftest.py | 2 +- python/test/core/test_core.py | 2 +- python/test/core/test_hashmap.py | 2 +- python/test/core/test_linalg.py | 2 +- python/test/core/test_nn.py | 2 +- python/test/core/test_size_vector.py | 2 +- python/test/core/test_sycl_utils.py | 2 +- python/test/core/test_tensor_function.py | 2 +- python/test/core/test_torch_integration.py | 2 +- python/test/data/test_data.py | 2 +- python/test/io/rpc/test_remote_functions.py | 2 +- python/test/io/rpc/test_serialization.py | 2 +- python/test/io/test_io.py | 2 +- python/test/ml/test_contrib_iou.py | 2 +- python/test/ml/test_contrib_subsample.py | 2 +- python/test/ml_ops/cconv_python.py | 2 +- python/test/ml_ops/check_gradients.py | 2 +- python/test/ml_ops/mltest.py | 2 +- python/test/ml_ops/particle_network_tf.py | 2 +- python/test/ml_ops/test_cconv.py | 2 +- python/test/ml_ops/test_cconv_python.py | 2 +- python/test/ml_ops/test_cublas.py | 2 +- python/test/ml_ops/test_fixed_radius_search.py | 2 +- python/test/ml_ops/test_general_sparseconv.py | 2 +- python/test/ml_ops/test_invert_neighbors_list.py | 2 +- python/test/ml_ops/test_knn_search.py | 2 +- python/test/ml_ops/test_nms.py | 2 +- python/test/ml_ops/test_query_pts.py | 2 +- python/test/ml_ops/test_radius_search.py | 2 +- python/test/ml_ops/test_ragged_tensor.py | 2 +- python/test/ml_ops/test_ragged_tensor_paddle.py | 2 +- python/test/ml_ops/test_ragged_to_dense.py | 2 +- python/test/ml_ops/test_reduce_subarrays_sum.py | 2 +- python/test/ml_ops/test_roi_pool.py | 2 +- python/test/ml_ops/test_sampling.py | 2 +- python/test/ml_ops/test_sparseconv.py | 2 +- python/test/ml_ops/test_subsampling.py | 2 +- python/test/ml_ops/test_tf_training_graph_mode.py | 2 +- python/test/ml_ops/test_three_interp.py | 2 +- python/test/ml_ops/test_three_nn.py | 2 +- python/test/ml_ops/test_voxel_pooling.py | 2 +- python/test/ml_ops/test_voxelize.py | 2 +- python/test/open3d_test.py | 2 +- python/test/t/geometry/test_image.py | 2 +- python/test/t/geometry/test_lineset.py | 2 +- python/test/t/geometry/test_pointcloud.py | 2 +- python/test/t/geometry/test_raycasting_scene.py | 2 +- python/test/t/geometry/test_tensormap.py | 2 +- python/test/t/geometry/test_trianglemesh.py | 2 +- python/test/t/io/test_noise.py | 2 +- python/test/t/io/test_realsense.py | 2 +- python/test/t/registration/test_registration.py | 2 +- .../test/t/registration/test_transformation_estimation.py | 2 +- python/test/test_color_map_optimization.py | 2 +- python/test/test_flags.py | 2 +- python/test/test_octree.py | 2 +- python/test/test_open3d_eigen.py | 2 +- python/test/visualization/test_cpu_rendering.py | 2 +- python/test/visualization/test_tensorboard_plugin.py | 2 +- python/tools/app.py | 2 +- python/tools/cli.py | 2 +- util/check_style.py | 6 +++--- 1764 files changed, 1769 insertions(+), 1769 deletions(-) diff --git a/LICENSE b/LICENSE index 9134a1223b9..6ce9ed9300c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ The MIT License (MIT) Open3D: www.open3d.org -Copyright (c) 2018-2023 www.open3d.org +Copyright (c) 2018-2024 www.open3d.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/cmake/ShaderEncoder.cpp b/cmake/ShaderEncoder.cpp index 0f758c92798..100f135cd48 100644 --- a/cmake/ShaderEncoder.cpp +++ b/cmake/ShaderEncoder.cpp @@ -3,7 +3,7 @@ // ---------------------------------------------------------------------------- // The MIT License (MIT) // -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cmake/ShaderLinker.cpp b/cmake/ShaderLinker.cpp index 1daf832d97d..a3d9cb936fc 100644 --- a/cmake/ShaderLinker.cpp +++ b/cmake/ShaderLinker.cpp @@ -3,7 +3,7 @@ // ---------------------------------------------------------------------------- // The MIT License (MIT) // -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -49,7 +49,7 @@ int main(int argc, char **argv) { fprintf(file_out, "// ----------------------------------------------------------------------------\n"); fprintf(file_out, "// The MIT License (MIT)\n"); fprintf(file_out, "//\n"); - fprintf(file_out, "// Copyright (c) 2018-2023 www.open3d.org\n"); + fprintf(file_out, "// Copyright (c) 2018-2024 www.open3d.org\n"); fprintf(file_out, "//\n"); fprintf(file_out, "// Permission is hereby granted, free of charge, to any person obtaining a copy\n"); fprintf(file_out, "// of this software and associated documentation files (the \"Software\"), to deal\n"); diff --git a/cmake/ispc_isas/ISADispatcher.c b/cmake/ispc_isas/ISADispatcher.c index 5c3e559d3fc..99d270f3553 100644 --- a/cmake/ispc_isas/ISADispatcher.c +++ b/cmake/ispc_isas/ISADispatcher.c @@ -3,7 +3,7 @@ // ---------------------------------------------------------------------------- // The MIT License (MIT) // -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cmake/ispc_isas/ISADispatcher.ispc b/cmake/ispc_isas/ISADispatcher.ispc index bd5e5e4f59c..53e47ba1ff5 100644 --- a/cmake/ispc_isas/ISADispatcher.ispc +++ b/cmake/ispc_isas/ISADispatcher.ispc @@ -3,7 +3,7 @@ // ---------------------------------------------------------------------------- // The MIT License (MIT) // -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cpp/apps/CMakeLists.txt b/cpp/apps/CMakeLists.txt index 8b718c9968c..83d700e412f 100644 --- a/cpp/apps/CMakeLists.txt +++ b/cpp/apps/CMakeLists.txt @@ -18,7 +18,7 @@ macro(open3d_add_app_gui SRC_DIR APP_NAME TARGET_NAME) set(MACOSX_BUNDLE_LONG_VERSION_STRING ${PROJECT_VERSION_THREE_NUMBER}) set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_THREE_NUMBER}) set(MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION_THREE_NUMBER}) - set(MACOSX_BUNDLE_COPYRIGHT "Copyright (c) 2018-2023 www.open3d.org") + set(MACOSX_BUNDLE_COPYRIGHT "Copyright (c) 2018-2024 www.open3d.org") endif() # Copy the resource files. This needs to be done as a post-build step diff --git a/cpp/apps/OfflineReconstruction/Config.h b/cpp/apps/OfflineReconstruction/Config.h index 9bb95df2093..a421a142b25 100644 --- a/cpp/apps/OfflineReconstruction/Config.h +++ b/cpp/apps/OfflineReconstruction/Config.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/apps/OfflineReconstruction/DebugUtil.h b/cpp/apps/OfflineReconstruction/DebugUtil.h index aa10e95d934..0cd8ce90245 100644 --- a/cpp/apps/OfflineReconstruction/DebugUtil.h +++ b/cpp/apps/OfflineReconstruction/DebugUtil.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/apps/OfflineReconstruction/FileSystemUtil.h b/cpp/apps/OfflineReconstruction/FileSystemUtil.h index 4ebc976e03c..c3d07767744 100644 --- a/cpp/apps/OfflineReconstruction/FileSystemUtil.h +++ b/cpp/apps/OfflineReconstruction/FileSystemUtil.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/apps/OfflineReconstruction/LegacyReconstructionUtil.h b/cpp/apps/OfflineReconstruction/LegacyReconstructionUtil.h index 26d30bfe182..46796ef36a0 100644 --- a/cpp/apps/OfflineReconstruction/LegacyReconstructionUtil.h +++ b/cpp/apps/OfflineReconstruction/LegacyReconstructionUtil.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/apps/OfflineReconstruction/OfflineReconstruction.cpp b/cpp/apps/OfflineReconstruction/OfflineReconstruction.cpp index 3e5d4efac05..fee3000c19e 100644 --- a/cpp/apps/OfflineReconstruction/OfflineReconstruction.cpp +++ b/cpp/apps/OfflineReconstruction/OfflineReconstruction.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/apps/Open3DViewer/Open3DViewer.cpp b/cpp/apps/Open3DViewer/Open3DViewer.cpp index c84cce8ecc4..ce938acbcff 100644 --- a/cpp/apps/Open3DViewer/Open3DViewer.cpp +++ b/cpp/apps/Open3DViewer/Open3DViewer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/apps/Open3DViewer/Open3DViewer.h b/cpp/apps/Open3DViewer/Open3DViewer.h index 4e6a933d420..d0d6bdc4f41 100644 --- a/cpp/apps/Open3DViewer/Open3DViewer.h +++ b/cpp/apps/Open3DViewer/Open3DViewer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/apps/Open3DViewer/Open3DViewer_mac.mm b/cpp/apps/Open3DViewer/Open3DViewer_mac.mm index 23811213b0e..a916ebdd047 100644 --- a/cpp/apps/Open3DViewer/Open3DViewer_mac.mm +++ b/cpp/apps/Open3DViewer/Open3DViewer_mac.mm @@ -3,7 +3,7 @@ // ---------------------------------------------------------------------------- // The MIT License (MIT) // -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cpp/benchmarks/Main.cpp b/cpp/benchmarks/Main.cpp index 6f645bd8b3a..ca2e66fe591 100644 --- a/cpp/benchmarks/Main.cpp +++ b/cpp/benchmarks/Main.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Copyright 2018 Google Inc. All rights reserved. diff --git a/cpp/benchmarks/benchmark_utilities/Rand.cpp b/cpp/benchmarks/benchmark_utilities/Rand.cpp index bd7de1bc552..b64ee2943d0 100644 --- a/cpp/benchmarks/benchmark_utilities/Rand.cpp +++ b/cpp/benchmarks/benchmark_utilities/Rand.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/benchmark_utilities/Rand.h b/cpp/benchmarks/benchmark_utilities/Rand.h index a86d4eaae05..7cefae1669a 100644 --- a/cpp/benchmarks/benchmark_utilities/Rand.h +++ b/cpp/benchmarks/benchmark_utilities/Rand.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/core/BinaryEW.cpp b/cpp/benchmarks/core/BinaryEW.cpp index d79427da0ba..86a7a487605 100644 --- a/cpp/benchmarks/core/BinaryEW.cpp +++ b/cpp/benchmarks/core/BinaryEW.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/core/HashMap.cpp b/cpp/benchmarks/core/HashMap.cpp index 7cc8087db74..0361afcb9f5 100644 --- a/cpp/benchmarks/core/HashMap.cpp +++ b/cpp/benchmarks/core/HashMap.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/core/Linalg.cpp b/cpp/benchmarks/core/Linalg.cpp index f156a1f0c6d..7a4a3d6138b 100644 --- a/cpp/benchmarks/core/Linalg.cpp +++ b/cpp/benchmarks/core/Linalg.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/core/MemoryManager.cpp b/cpp/benchmarks/core/MemoryManager.cpp index cb684e38efd..fccca3de621 100644 --- a/cpp/benchmarks/core/MemoryManager.cpp +++ b/cpp/benchmarks/core/MemoryManager.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/core/ParallelFor.cpp b/cpp/benchmarks/core/ParallelFor.cpp index 693bc1312cb..15c6233022a 100644 --- a/cpp/benchmarks/core/ParallelFor.cpp +++ b/cpp/benchmarks/core/ParallelFor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/core/ParallelFor.ispc b/cpp/benchmarks/core/ParallelFor.ispc index 377d0aa914d..4d69e227241 100644 --- a/cpp/benchmarks/core/ParallelFor.ispc +++ b/cpp/benchmarks/core/ParallelFor.ispc @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/core/Reduction.cpp b/cpp/benchmarks/core/Reduction.cpp index 8256f60904e..1c019f29960 100644 --- a/cpp/benchmarks/core/Reduction.cpp +++ b/cpp/benchmarks/core/Reduction.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/core/UnaryEW.cpp b/cpp/benchmarks/core/UnaryEW.cpp index 195ddd0f110..30051948282 100644 --- a/cpp/benchmarks/core/UnaryEW.cpp +++ b/cpp/benchmarks/core/UnaryEW.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/core/Zeros.cpp b/cpp/benchmarks/core/Zeros.cpp index a9c9dd10d30..9eb534369f0 100644 --- a/cpp/benchmarks/core/Zeros.cpp +++ b/cpp/benchmarks/core/Zeros.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/geometry/KDTreeFlann.cpp b/cpp/benchmarks/geometry/KDTreeFlann.cpp index c34b2cae319..838f375a04f 100644 --- a/cpp/benchmarks/geometry/KDTreeFlann.cpp +++ b/cpp/benchmarks/geometry/KDTreeFlann.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/geometry/SamplePoints.cpp b/cpp/benchmarks/geometry/SamplePoints.cpp index 9757160c1f8..d7b9c6f7a00 100644 --- a/cpp/benchmarks/geometry/SamplePoints.cpp +++ b/cpp/benchmarks/geometry/SamplePoints.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/geometry/TriangleMesh.cpp b/cpp/benchmarks/geometry/TriangleMesh.cpp index 0f6d11cbcea..4a07fb0a23f 100644 --- a/cpp/benchmarks/geometry/TriangleMesh.cpp +++ b/cpp/benchmarks/geometry/TriangleMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/io/PointCloudIO.cpp b/cpp/benchmarks/io/PointCloudIO.cpp index 3fa35a014ee..5ac5b43e90c 100644 --- a/cpp/benchmarks/io/PointCloudIO.cpp +++ b/cpp/benchmarks/io/PointCloudIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/pipelines/registration/Registration.cpp b/cpp/benchmarks/pipelines/registration/Registration.cpp index 4299265cc6e..8ed5eabcad7 100644 --- a/cpp/benchmarks/pipelines/registration/Registration.cpp +++ b/cpp/benchmarks/pipelines/registration/Registration.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/t/geometry/PointCloud.cpp b/cpp/benchmarks/t/geometry/PointCloud.cpp index 814587320a6..dbc84715885 100644 --- a/cpp/benchmarks/t/geometry/PointCloud.cpp +++ b/cpp/benchmarks/t/geometry/PointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/t/io/PointCloudIO.cpp b/cpp/benchmarks/t/io/PointCloudIO.cpp index f1ad9bbf6c1..4fc81f1c209 100644 --- a/cpp/benchmarks/t/io/PointCloudIO.cpp +++ b/cpp/benchmarks/t/io/PointCloudIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/t/io/TriangleMeshIO.cpp b/cpp/benchmarks/t/io/TriangleMeshIO.cpp index 3dfa9cd7731..fb320160291 100644 --- a/cpp/benchmarks/t/io/TriangleMeshIO.cpp +++ b/cpp/benchmarks/t/io/TriangleMeshIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/t/pipelines/odometry/RGBDOdometry.cpp b/cpp/benchmarks/t/pipelines/odometry/RGBDOdometry.cpp index d79cfc0d18a..b870e172751 100644 --- a/cpp/benchmarks/t/pipelines/odometry/RGBDOdometry.cpp +++ b/cpp/benchmarks/t/pipelines/odometry/RGBDOdometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/t/pipelines/registration/Feature.cpp b/cpp/benchmarks/t/pipelines/registration/Feature.cpp index 929fed0ca61..e3b67eb8db6 100644 --- a/cpp/benchmarks/t/pipelines/registration/Feature.cpp +++ b/cpp/benchmarks/t/pipelines/registration/Feature.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/benchmarks/t/pipelines/registration/Registration.cpp b/cpp/benchmarks/t/pipelines/registration/Registration.cpp index 71edb2cab1e..cd00c1e2e8f 100644 --- a/cpp/benchmarks/t/pipelines/registration/Registration.cpp +++ b/cpp/benchmarks/t/pipelines/registration/Registration.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/Macro.h b/cpp/open3d/Macro.h index d88da87e8b7..28cc640a2cd 100644 --- a/cpp/open3d/Macro.h +++ b/cpp/open3d/Macro.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/Open3D.h.in b/cpp/open3d/Open3D.h.in index 38ba353c61a..5c9a5b5c60a 100644 --- a/cpp/open3d/Open3D.h.in +++ b/cpp/open3d/Open3D.h.in @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/Open3DConfig.cpp b/cpp/open3d/Open3DConfig.cpp index a8019ae9316..a2904c01402 100644 --- a/cpp/open3d/Open3DConfig.cpp +++ b/cpp/open3d/Open3DConfig.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/Open3DConfig.h.in b/cpp/open3d/Open3DConfig.h.in index 2058a58171c..d9ad502c4b6 100644 --- a/cpp/open3d/Open3DConfig.h.in +++ b/cpp/open3d/Open3DConfig.h.in @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/camera/PinholeCameraIntrinsic.cpp b/cpp/open3d/camera/PinholeCameraIntrinsic.cpp index 85cdb00b82e..142e4e083ac 100644 --- a/cpp/open3d/camera/PinholeCameraIntrinsic.cpp +++ b/cpp/open3d/camera/PinholeCameraIntrinsic.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/camera/PinholeCameraIntrinsic.h b/cpp/open3d/camera/PinholeCameraIntrinsic.h index 25e55543ae1..42689877807 100644 --- a/cpp/open3d/camera/PinholeCameraIntrinsic.h +++ b/cpp/open3d/camera/PinholeCameraIntrinsic.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/camera/PinholeCameraParameters.cpp b/cpp/open3d/camera/PinholeCameraParameters.cpp index 465ff1c8044..cf512a2ecd1 100644 --- a/cpp/open3d/camera/PinholeCameraParameters.cpp +++ b/cpp/open3d/camera/PinholeCameraParameters.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/camera/PinholeCameraParameters.h b/cpp/open3d/camera/PinholeCameraParameters.h index 00c053283c5..a2ec46ddfd4 100644 --- a/cpp/open3d/camera/PinholeCameraParameters.h +++ b/cpp/open3d/camera/PinholeCameraParameters.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/camera/PinholeCameraTrajectory.cpp b/cpp/open3d/camera/PinholeCameraTrajectory.cpp index 41d32acf617..8f34c81a821 100644 --- a/cpp/open3d/camera/PinholeCameraTrajectory.cpp +++ b/cpp/open3d/camera/PinholeCameraTrajectory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/camera/PinholeCameraTrajectory.h b/cpp/open3d/camera/PinholeCameraTrajectory.h index ccde07464fc..d0a44f51b68 100644 --- a/cpp/open3d/camera/PinholeCameraTrajectory.h +++ b/cpp/open3d/camera/PinholeCameraTrajectory.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/AdvancedIndexing.cpp b/cpp/open3d/core/AdvancedIndexing.cpp index 86ce53148ba..cd53792468c 100644 --- a/cpp/open3d/core/AdvancedIndexing.cpp +++ b/cpp/open3d/core/AdvancedIndexing.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/AdvancedIndexing.h b/cpp/open3d/core/AdvancedIndexing.h index 17a8253085a..ab69dcac8ea 100644 --- a/cpp/open3d/core/AdvancedIndexing.h +++ b/cpp/open3d/core/AdvancedIndexing.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Atomic.h b/cpp/open3d/core/Atomic.h index a9e89758725..1e7e3502c5d 100644 --- a/cpp/open3d/core/Atomic.h +++ b/cpp/open3d/core/Atomic.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Blob.h b/cpp/open3d/core/Blob.h index 0cf3a34f659..830a9954dae 100644 --- a/cpp/open3d/core/Blob.h +++ b/cpp/open3d/core/Blob.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/CUDAUtils.cpp b/cpp/open3d/core/CUDAUtils.cpp index 1da331035e7..ab805bda049 100644 --- a/cpp/open3d/core/CUDAUtils.cpp +++ b/cpp/open3d/core/CUDAUtils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/CUDAUtils.h b/cpp/open3d/core/CUDAUtils.h index 15f87be040d..16a3841e2d1 100644 --- a/cpp/open3d/core/CUDAUtils.h +++ b/cpp/open3d/core/CUDAUtils.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/DLPack.h b/cpp/open3d/core/DLPack.h index 9a0c3e57aff..871a4245c93 100644 --- a/cpp/open3d/core/DLPack.h +++ b/cpp/open3d/core/DLPack.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/core/Device.cpp b/cpp/open3d/core/Device.cpp index 7137e307874..8a5c45601a9 100644 --- a/cpp/open3d/core/Device.cpp +++ b/cpp/open3d/core/Device.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Device.h b/cpp/open3d/core/Device.h index 2df1366c5b9..cbeff8a505e 100644 --- a/cpp/open3d/core/Device.h +++ b/cpp/open3d/core/Device.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Dispatch.h b/cpp/open3d/core/Dispatch.h index fe658c8cf15..f6195003a02 100644 --- a/cpp/open3d/core/Dispatch.h +++ b/cpp/open3d/core/Dispatch.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Dtype.cpp b/cpp/open3d/core/Dtype.cpp index 99102a46d86..8545b8ee53d 100644 --- a/cpp/open3d/core/Dtype.cpp +++ b/cpp/open3d/core/Dtype.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Dtype.h b/cpp/open3d/core/Dtype.h index 82e1358e659..464ebbbd17f 100644 --- a/cpp/open3d/core/Dtype.h +++ b/cpp/open3d/core/Dtype.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/EigenConverter.cpp b/cpp/open3d/core/EigenConverter.cpp index 7e6e8ca27aa..efc140f3403 100644 --- a/cpp/open3d/core/EigenConverter.cpp +++ b/cpp/open3d/core/EigenConverter.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/EigenConverter.h b/cpp/open3d/core/EigenConverter.h index 383c1bad013..6645f0cfb38 100644 --- a/cpp/open3d/core/EigenConverter.h +++ b/cpp/open3d/core/EigenConverter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/FunctionTraits.h b/cpp/open3d/core/FunctionTraits.h index dd591e03eb2..deaeaf276fa 100644 --- a/cpp/open3d/core/FunctionTraits.h +++ b/cpp/open3d/core/FunctionTraits.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Indexer.cpp b/cpp/open3d/core/Indexer.cpp index 7c6e76841d3..3bd27251d24 100644 --- a/cpp/open3d/core/Indexer.cpp +++ b/cpp/open3d/core/Indexer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Indexer.h b/cpp/open3d/core/Indexer.h index 7b0eaf7bda8..c9eb8933d49 100644 --- a/cpp/open3d/core/Indexer.h +++ b/cpp/open3d/core/Indexer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Indexer.ispc b/cpp/open3d/core/Indexer.ispc index ba96dd08f9e..cf60ac576a4 100644 --- a/cpp/open3d/core/Indexer.ispc +++ b/cpp/open3d/core/Indexer.ispc @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Indexer.isph b/cpp/open3d/core/Indexer.isph index 517b7219d7c..c9b63486377 100644 --- a/cpp/open3d/core/Indexer.isph +++ b/cpp/open3d/core/Indexer.isph @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/MemoryManager.cpp b/cpp/open3d/core/MemoryManager.cpp index aff4786476d..2bd20aa42c7 100644 --- a/cpp/open3d/core/MemoryManager.cpp +++ b/cpp/open3d/core/MemoryManager.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/MemoryManager.h b/cpp/open3d/core/MemoryManager.h index bde80f2991c..97c02efaf0c 100644 --- a/cpp/open3d/core/MemoryManager.h +++ b/cpp/open3d/core/MemoryManager.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/MemoryManagerCPU.cpp b/cpp/open3d/core/MemoryManagerCPU.cpp index 7f12d166e50..28afab26fd2 100644 --- a/cpp/open3d/core/MemoryManagerCPU.cpp +++ b/cpp/open3d/core/MemoryManagerCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/MemoryManagerCUDA.cpp b/cpp/open3d/core/MemoryManagerCUDA.cpp index 835ea550cfe..8d15a8b8d45 100644 --- a/cpp/open3d/core/MemoryManagerCUDA.cpp +++ b/cpp/open3d/core/MemoryManagerCUDA.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/MemoryManagerCached.cpp b/cpp/open3d/core/MemoryManagerCached.cpp index 9165c46c9df..8af8dd152ad 100644 --- a/cpp/open3d/core/MemoryManagerCached.cpp +++ b/cpp/open3d/core/MemoryManagerCached.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/MemoryManagerSYCL.cpp b/cpp/open3d/core/MemoryManagerSYCL.cpp index c3d642a2c76..a65c43110b4 100644 --- a/cpp/open3d/core/MemoryManagerSYCL.cpp +++ b/cpp/open3d/core/MemoryManagerSYCL.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/MemoryManagerStatistic.cpp b/cpp/open3d/core/MemoryManagerStatistic.cpp index 82c15e2edf9..ded1ca2598b 100644 --- a/cpp/open3d/core/MemoryManagerStatistic.cpp +++ b/cpp/open3d/core/MemoryManagerStatistic.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/MemoryManagerStatistic.h b/cpp/open3d/core/MemoryManagerStatistic.h index 60de026ec5c..1310247df17 100644 --- a/cpp/open3d/core/MemoryManagerStatistic.h +++ b/cpp/open3d/core/MemoryManagerStatistic.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/ParallelFor.h b/cpp/open3d/core/ParallelFor.h index d9bbe376684..2d5bef78812 100644 --- a/cpp/open3d/core/ParallelFor.h +++ b/cpp/open3d/core/ParallelFor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/ParallelFor.isph b/cpp/open3d/core/ParallelFor.isph index 89137651b80..e2cbf8cdadf 100644 --- a/cpp/open3d/core/ParallelFor.isph +++ b/cpp/open3d/core/ParallelFor.isph @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/SYCLContext.cpp b/cpp/open3d/core/SYCLContext.cpp index 660ab8d2bab..7a76c25ebc2 100644 --- a/cpp/open3d/core/SYCLContext.cpp +++ b/cpp/open3d/core/SYCLContext.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/SYCLContext.h b/cpp/open3d/core/SYCLContext.h index e23b9d8770c..6c46cac1f22 100644 --- a/cpp/open3d/core/SYCLContext.h +++ b/cpp/open3d/core/SYCLContext.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/SYCLUtils.cpp b/cpp/open3d/core/SYCLUtils.cpp index d9e42fdcde0..f5a7f9df7c8 100644 --- a/cpp/open3d/core/SYCLUtils.cpp +++ b/cpp/open3d/core/SYCLUtils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/SYCLUtils.h b/cpp/open3d/core/SYCLUtils.h index 385523f3800..82d3a3bd74d 100644 --- a/cpp/open3d/core/SYCLUtils.h +++ b/cpp/open3d/core/SYCLUtils.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Scalar.h b/cpp/open3d/core/Scalar.h index 18a91c91816..b26f133104d 100644 --- a/cpp/open3d/core/Scalar.h +++ b/cpp/open3d/core/Scalar.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/ShapeUtil.cpp b/cpp/open3d/core/ShapeUtil.cpp index f1d9b7af1d4..8e8a618b238 100644 --- a/cpp/open3d/core/ShapeUtil.cpp +++ b/cpp/open3d/core/ShapeUtil.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/ShapeUtil.h b/cpp/open3d/core/ShapeUtil.h index 88c20e99823..14c0a7ba6ad 100644 --- a/cpp/open3d/core/ShapeUtil.h +++ b/cpp/open3d/core/ShapeUtil.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/SizeVector.cpp b/cpp/open3d/core/SizeVector.cpp index 0af2d30086c..0f3b6a77cfd 100644 --- a/cpp/open3d/core/SizeVector.cpp +++ b/cpp/open3d/core/SizeVector.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/SizeVector.h b/cpp/open3d/core/SizeVector.h index e352020b42e..ca696093cb2 100644 --- a/cpp/open3d/core/SizeVector.h +++ b/cpp/open3d/core/SizeVector.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/SmallVector.cpp b/cpp/open3d/core/SmallVector.cpp index edd0da456a1..60f12287d39 100644 --- a/cpp/open3d/core/SmallVector.cpp +++ b/cpp/open3d/core/SmallVector.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/core/SmallVector.h b/cpp/open3d/core/SmallVector.h index 4be61809979..2f09c4ec24f 100644 --- a/cpp/open3d/core/SmallVector.h +++ b/cpp/open3d/core/SmallVector.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/core/StdAllocator.h b/cpp/open3d/core/StdAllocator.h index bb6b5f054a3..de5990425af 100644 --- a/cpp/open3d/core/StdAllocator.h +++ b/cpp/open3d/core/StdAllocator.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Tensor.cpp b/cpp/open3d/core/Tensor.cpp index d405c501993..b805a9696ac 100644 --- a/cpp/open3d/core/Tensor.cpp +++ b/cpp/open3d/core/Tensor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/Tensor.h b/cpp/open3d/core/Tensor.h index 38422055a30..7a20da6b5b2 100644 --- a/cpp/open3d/core/Tensor.h +++ b/cpp/open3d/core/Tensor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/TensorCheck.cpp b/cpp/open3d/core/TensorCheck.cpp index a7d54182d81..7d4ee43d4d5 100644 --- a/cpp/open3d/core/TensorCheck.cpp +++ b/cpp/open3d/core/TensorCheck.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/TensorCheck.h b/cpp/open3d/core/TensorCheck.h index 698bb1cfcab..6a19632a55f 100644 --- a/cpp/open3d/core/TensorCheck.h +++ b/cpp/open3d/core/TensorCheck.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/TensorFunction.cpp b/cpp/open3d/core/TensorFunction.cpp index 4f9f8e7ebc3..d05f934c1d7 100644 --- a/cpp/open3d/core/TensorFunction.cpp +++ b/cpp/open3d/core/TensorFunction.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/TensorFunction.h b/cpp/open3d/core/TensorFunction.h index 5073bddfd9f..f8a50b75305 100644 --- a/cpp/open3d/core/TensorFunction.h +++ b/cpp/open3d/core/TensorFunction.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/TensorInit.h b/cpp/open3d/core/TensorInit.h index 9c4e89b3d94..cafcdb68c07 100644 --- a/cpp/open3d/core/TensorInit.h +++ b/cpp/open3d/core/TensorInit.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/TensorKey.cpp b/cpp/open3d/core/TensorKey.cpp index 018b74b6edd..3a13732d951 100644 --- a/cpp/open3d/core/TensorKey.cpp +++ b/cpp/open3d/core/TensorKey.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/TensorKey.h b/cpp/open3d/core/TensorKey.h index 3c90b10cf59..d5b89ad2010 100644 --- a/cpp/open3d/core/TensorKey.h +++ b/cpp/open3d/core/TensorKey.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/TensorList.cpp b/cpp/open3d/core/TensorList.cpp index 8052d1a9e72..1ea6e60ce61 100644 --- a/cpp/open3d/core/TensorList.cpp +++ b/cpp/open3d/core/TensorList.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/TensorList.h b/cpp/open3d/core/TensorList.h index 641a15fadce..a5de70ac6bd 100644 --- a/cpp/open3d/core/TensorList.h +++ b/cpp/open3d/core/TensorList.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CPU/CPUHashBackendBuffer.cpp b/cpp/open3d/core/hashmap/CPU/CPUHashBackendBuffer.cpp index 831b65fd2cc..ff014308c08 100644 --- a/cpp/open3d/core/hashmap/CPU/CPUHashBackendBuffer.cpp +++ b/cpp/open3d/core/hashmap/CPU/CPUHashBackendBuffer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CPU/CPUHashBackendBufferAccessor.hpp b/cpp/open3d/core/hashmap/CPU/CPUHashBackendBufferAccessor.hpp index d6b3e578bbf..64747648a38 100644 --- a/cpp/open3d/core/hashmap/CPU/CPUHashBackendBufferAccessor.hpp +++ b/cpp/open3d/core/hashmap/CPU/CPUHashBackendBufferAccessor.hpp @@ -3,7 +3,7 @@ // ---------------------------------------------------------------------------- // The MIT License (MIT) // -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cpp/open3d/core/hashmap/CPU/CreateCPUHashBackend.cpp b/cpp/open3d/core/hashmap/CPU/CreateCPUHashBackend.cpp index 0ba140fa06a..07760c2422e 100644 --- a/cpp/open3d/core/hashmap/CPU/CreateCPUHashBackend.cpp +++ b/cpp/open3d/core/hashmap/CPU/CreateCPUHashBackend.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CPU/TBBHashBackend.h b/cpp/open3d/core/hashmap/CPU/TBBHashBackend.h index f562dc2cc9d..8c898d245aa 100644 --- a/cpp/open3d/core/hashmap/CPU/TBBHashBackend.h +++ b/cpp/open3d/core/hashmap/CPU/TBBHashBackend.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CUDA/CUDAHashBackendBuffer.cu b/cpp/open3d/core/hashmap/CUDA/CUDAHashBackendBuffer.cu index 3f67f42fe0a..627095858ec 100644 --- a/cpp/open3d/core/hashmap/CUDA/CUDAHashBackendBuffer.cu +++ b/cpp/open3d/core/hashmap/CUDA/CUDAHashBackendBuffer.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CUDA/CUDAHashBackendBufferAccessor.h b/cpp/open3d/core/hashmap/CUDA/CUDAHashBackendBufferAccessor.h index 2e5e3987d47..eeb74bc2610 100644 --- a/cpp/open3d/core/hashmap/CUDA/CUDAHashBackendBufferAccessor.h +++ b/cpp/open3d/core/hashmap/CUDA/CUDAHashBackendBufferAccessor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CUDA/CreateCUDAHashBackend.cu b/cpp/open3d/core/hashmap/CUDA/CreateCUDAHashBackend.cu index 31d82e5058d..8f8ea8bdfc0 100644 --- a/cpp/open3d/core/hashmap/CUDA/CreateCUDAHashBackend.cu +++ b/cpp/open3d/core/hashmap/CUDA/CreateCUDAHashBackend.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CUDA/SlabHashBackend.h b/cpp/open3d/core/hashmap/CUDA/SlabHashBackend.h index cbc7a85b8eb..dbf665c795f 100644 --- a/cpp/open3d/core/hashmap/CUDA/SlabHashBackend.h +++ b/cpp/open3d/core/hashmap/CUDA/SlabHashBackend.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CUDA/SlabHashBackendImpl.h b/cpp/open3d/core/hashmap/CUDA/SlabHashBackendImpl.h index eb27d0a1d12..67903ef9657 100644 --- a/cpp/open3d/core/hashmap/CUDA/SlabHashBackendImpl.h +++ b/cpp/open3d/core/hashmap/CUDA/SlabHashBackendImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CUDA/SlabMacros.h b/cpp/open3d/core/hashmap/CUDA/SlabMacros.h index c3d94f0c1bf..21ba410abdf 100644 --- a/cpp/open3d/core/hashmap/CUDA/SlabMacros.h +++ b/cpp/open3d/core/hashmap/CUDA/SlabMacros.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CUDA/SlabNodeManager.cu b/cpp/open3d/core/hashmap/CUDA/SlabNodeManager.cu index 6fdd6d75c92..df1cfe146d7 100644 --- a/cpp/open3d/core/hashmap/CUDA/SlabNodeManager.cu +++ b/cpp/open3d/core/hashmap/CUDA/SlabNodeManager.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CUDA/SlabNodeManager.h b/cpp/open3d/core/hashmap/CUDA/SlabNodeManager.h index 4d7f4d5a710..9668c31005a 100644 --- a/cpp/open3d/core/hashmap/CUDA/SlabNodeManager.h +++ b/cpp/open3d/core/hashmap/CUDA/SlabNodeManager.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CUDA/SlabTraits.h b/cpp/open3d/core/hashmap/CUDA/SlabTraits.h index ad15855e6d0..bab4f111e4f 100644 --- a/cpp/open3d/core/hashmap/CUDA/SlabTraits.h +++ b/cpp/open3d/core/hashmap/CUDA/SlabTraits.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/CUDA/StdGPUHashBackend.h b/cpp/open3d/core/hashmap/CUDA/StdGPUHashBackend.h index 2f27a53b7fc..823e19f9901 100644 --- a/cpp/open3d/core/hashmap/CUDA/StdGPUHashBackend.h +++ b/cpp/open3d/core/hashmap/CUDA/StdGPUHashBackend.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/DeviceHashBackend.cpp b/cpp/open3d/core/hashmap/DeviceHashBackend.cpp index 69083d0820e..26242ad5165 100644 --- a/cpp/open3d/core/hashmap/DeviceHashBackend.cpp +++ b/cpp/open3d/core/hashmap/DeviceHashBackend.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/DeviceHashBackend.h b/cpp/open3d/core/hashmap/DeviceHashBackend.h index b4cef7d635f..676b970fb48 100644 --- a/cpp/open3d/core/hashmap/DeviceHashBackend.h +++ b/cpp/open3d/core/hashmap/DeviceHashBackend.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/Dispatch.h b/cpp/open3d/core/hashmap/Dispatch.h index df0cb1238ac..7318e5898d6 100644 --- a/cpp/open3d/core/hashmap/Dispatch.h +++ b/cpp/open3d/core/hashmap/Dispatch.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/HashBackendBuffer.cpp b/cpp/open3d/core/hashmap/HashBackendBuffer.cpp index 315ece8bbc0..48a08c7342d 100644 --- a/cpp/open3d/core/hashmap/HashBackendBuffer.cpp +++ b/cpp/open3d/core/hashmap/HashBackendBuffer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/HashBackendBuffer.h b/cpp/open3d/core/hashmap/HashBackendBuffer.h index 0ffc21a725f..a9ab147f414 100644 --- a/cpp/open3d/core/hashmap/HashBackendBuffer.h +++ b/cpp/open3d/core/hashmap/HashBackendBuffer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/HashMap.cpp b/cpp/open3d/core/hashmap/HashMap.cpp index 6e0d450ba7f..485d2d5b770 100644 --- a/cpp/open3d/core/hashmap/HashMap.cpp +++ b/cpp/open3d/core/hashmap/HashMap.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/HashMap.h b/cpp/open3d/core/hashmap/HashMap.h index a3d4cbb56b1..8544ed623f8 100644 --- a/cpp/open3d/core/hashmap/HashMap.h +++ b/cpp/open3d/core/hashmap/HashMap.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/HashSet.cpp b/cpp/open3d/core/hashmap/HashSet.cpp index a01d2fd1bbb..1bc0ddc6dee 100644 --- a/cpp/open3d/core/hashmap/HashSet.cpp +++ b/cpp/open3d/core/hashmap/HashSet.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/hashmap/HashSet.h b/cpp/open3d/core/hashmap/HashSet.h index 75aaac5fe16..97a8dc25e4e 100644 --- a/cpp/open3d/core/hashmap/HashSet.h +++ b/cpp/open3d/core/hashmap/HashSet.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/Arange.cpp b/cpp/open3d/core/kernel/Arange.cpp index 5d4b52b6810..b3385a2a10c 100644 --- a/cpp/open3d/core/kernel/Arange.cpp +++ b/cpp/open3d/core/kernel/Arange.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/Arange.h b/cpp/open3d/core/kernel/Arange.h index 0d18170d03a..1a0e88323fd 100644 --- a/cpp/open3d/core/kernel/Arange.h +++ b/cpp/open3d/core/kernel/Arange.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/ArangeCPU.cpp b/cpp/open3d/core/kernel/ArangeCPU.cpp index 70efd7753a1..d88076d1a74 100644 --- a/cpp/open3d/core/kernel/ArangeCPU.cpp +++ b/cpp/open3d/core/kernel/ArangeCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/ArangeCUDA.cu b/cpp/open3d/core/kernel/ArangeCUDA.cu index a5193b292f9..2de6c835ae9 100644 --- a/cpp/open3d/core/kernel/ArangeCUDA.cu +++ b/cpp/open3d/core/kernel/ArangeCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/BinaryEW.cpp b/cpp/open3d/core/kernel/BinaryEW.cpp index 97856e67401..00eb9b388e5 100644 --- a/cpp/open3d/core/kernel/BinaryEW.cpp +++ b/cpp/open3d/core/kernel/BinaryEW.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/BinaryEW.h b/cpp/open3d/core/kernel/BinaryEW.h index ed23e8376c8..fbd4af3e849 100644 --- a/cpp/open3d/core/kernel/BinaryEW.h +++ b/cpp/open3d/core/kernel/BinaryEW.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/BinaryEWCPU.cpp b/cpp/open3d/core/kernel/BinaryEWCPU.cpp index 02139bfa6dd..29077856ac8 100644 --- a/cpp/open3d/core/kernel/BinaryEWCPU.cpp +++ b/cpp/open3d/core/kernel/BinaryEWCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/BinaryEWCPU.ispc b/cpp/open3d/core/kernel/BinaryEWCPU.ispc index 8c81c28a838..0ea895e2dbc 100644 --- a/cpp/open3d/core/kernel/BinaryEWCPU.ispc +++ b/cpp/open3d/core/kernel/BinaryEWCPU.ispc @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/BinaryEWCUDA.cu b/cpp/open3d/core/kernel/BinaryEWCUDA.cu index 9a450789625..7985696cc9e 100644 --- a/cpp/open3d/core/kernel/BinaryEWCUDA.cu +++ b/cpp/open3d/core/kernel/BinaryEWCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/IndexGetSet.cpp b/cpp/open3d/core/kernel/IndexGetSet.cpp index 26ec6a62072..601b4d73f64 100644 --- a/cpp/open3d/core/kernel/IndexGetSet.cpp +++ b/cpp/open3d/core/kernel/IndexGetSet.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/IndexGetSet.h b/cpp/open3d/core/kernel/IndexGetSet.h index 94e57de1cae..130b80836a9 100644 --- a/cpp/open3d/core/kernel/IndexGetSet.h +++ b/cpp/open3d/core/kernel/IndexGetSet.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/IndexGetSetCPU.cpp b/cpp/open3d/core/kernel/IndexGetSetCPU.cpp index ab9a26ad763..4d76128c9dc 100644 --- a/cpp/open3d/core/kernel/IndexGetSetCPU.cpp +++ b/cpp/open3d/core/kernel/IndexGetSetCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/IndexGetSetCUDA.cu b/cpp/open3d/core/kernel/IndexGetSetCUDA.cu index a2a5fb6796e..149dbd34675 100644 --- a/cpp/open3d/core/kernel/IndexGetSetCUDA.cu +++ b/cpp/open3d/core/kernel/IndexGetSetCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/IndexReduction.cpp b/cpp/open3d/core/kernel/IndexReduction.cpp index 128da56e370..19265d36620 100644 --- a/cpp/open3d/core/kernel/IndexReduction.cpp +++ b/cpp/open3d/core/kernel/IndexReduction.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/IndexReduction.h b/cpp/open3d/core/kernel/IndexReduction.h index 7035b53210b..f4fd3516b41 100644 --- a/cpp/open3d/core/kernel/IndexReduction.h +++ b/cpp/open3d/core/kernel/IndexReduction.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/IndexReductionCPU.cpp b/cpp/open3d/core/kernel/IndexReductionCPU.cpp index 4488b3bb6a8..bfc670d5101 100644 --- a/cpp/open3d/core/kernel/IndexReductionCPU.cpp +++ b/cpp/open3d/core/kernel/IndexReductionCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/IndexReductionCUDA.cu b/cpp/open3d/core/kernel/IndexReductionCUDA.cu index 922bd0a84c9..60c3ff7b598 100644 --- a/cpp/open3d/core/kernel/IndexReductionCUDA.cu +++ b/cpp/open3d/core/kernel/IndexReductionCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #include diff --git a/cpp/open3d/core/kernel/Kernel.cpp b/cpp/open3d/core/kernel/Kernel.cpp index 015170e2993..249af3a3d10 100644 --- a/cpp/open3d/core/kernel/Kernel.cpp +++ b/cpp/open3d/core/kernel/Kernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/Kernel.h b/cpp/open3d/core/kernel/Kernel.h index 51249d741c1..16a12a3ea7f 100644 --- a/cpp/open3d/core/kernel/Kernel.h +++ b/cpp/open3d/core/kernel/Kernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/NonZero.cpp b/cpp/open3d/core/kernel/NonZero.cpp index 1a25c85ce77..6d04f94e40a 100644 --- a/cpp/open3d/core/kernel/NonZero.cpp +++ b/cpp/open3d/core/kernel/NonZero.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/NonZero.h b/cpp/open3d/core/kernel/NonZero.h index 8e0040c5089..ab926ddd8c3 100644 --- a/cpp/open3d/core/kernel/NonZero.h +++ b/cpp/open3d/core/kernel/NonZero.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/NonZeroCPU.cpp b/cpp/open3d/core/kernel/NonZeroCPU.cpp index 4bea5919154..c865386d920 100644 --- a/cpp/open3d/core/kernel/NonZeroCPU.cpp +++ b/cpp/open3d/core/kernel/NonZeroCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/NonZeroCUDA.cu b/cpp/open3d/core/kernel/NonZeroCUDA.cu index 5b2fb595935..e0cdbcd799e 100644 --- a/cpp/open3d/core/kernel/NonZeroCUDA.cu +++ b/cpp/open3d/core/kernel/NonZeroCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/Reduction.cpp b/cpp/open3d/core/kernel/Reduction.cpp index bf252ce715f..a94087d609a 100644 --- a/cpp/open3d/core/kernel/Reduction.cpp +++ b/cpp/open3d/core/kernel/Reduction.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/Reduction.h b/cpp/open3d/core/kernel/Reduction.h index 683770fa0cd..a1a4b74e3a3 100644 --- a/cpp/open3d/core/kernel/Reduction.h +++ b/cpp/open3d/core/kernel/Reduction.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/ReductionCPU.cpp b/cpp/open3d/core/kernel/ReductionCPU.cpp index 7caa60b34f7..ac4f44f2af8 100644 --- a/cpp/open3d/core/kernel/ReductionCPU.cpp +++ b/cpp/open3d/core/kernel/ReductionCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/ReductionCUDA.cu b/cpp/open3d/core/kernel/ReductionCUDA.cu index f209b4448d9..5f15f676d18 100644 --- a/cpp/open3d/core/kernel/ReductionCUDA.cu +++ b/cpp/open3d/core/kernel/ReductionCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/UnaryEW.cpp b/cpp/open3d/core/kernel/UnaryEW.cpp index d2cb7c89f4d..612daf52f23 100644 --- a/cpp/open3d/core/kernel/UnaryEW.cpp +++ b/cpp/open3d/core/kernel/UnaryEW.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/UnaryEW.h b/cpp/open3d/core/kernel/UnaryEW.h index c28c30bcc51..15389fd9eb5 100644 --- a/cpp/open3d/core/kernel/UnaryEW.h +++ b/cpp/open3d/core/kernel/UnaryEW.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/UnaryEWCPU.cpp b/cpp/open3d/core/kernel/UnaryEWCPU.cpp index de3a3f4514e..1a502e42a1d 100644 --- a/cpp/open3d/core/kernel/UnaryEWCPU.cpp +++ b/cpp/open3d/core/kernel/UnaryEWCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/UnaryEWCPU.ispc b/cpp/open3d/core/kernel/UnaryEWCPU.ispc index 40ebd9515e5..a7019efad70 100644 --- a/cpp/open3d/core/kernel/UnaryEWCPU.ispc +++ b/cpp/open3d/core/kernel/UnaryEWCPU.ispc @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/kernel/UnaryEWCUDA.cu b/cpp/open3d/core/kernel/UnaryEWCUDA.cu index b7745e04ef0..1612a3d70cc 100644 --- a/cpp/open3d/core/kernel/UnaryEWCUDA.cu +++ b/cpp/open3d/core/kernel/UnaryEWCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/AddMM.cpp b/cpp/open3d/core/linalg/AddMM.cpp index 0f44ac926e3..aea908cecbb 100644 --- a/cpp/open3d/core/linalg/AddMM.cpp +++ b/cpp/open3d/core/linalg/AddMM.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/AddMM.h b/cpp/open3d/core/linalg/AddMM.h index 6d4a5dc608f..1754e430fef 100644 --- a/cpp/open3d/core/linalg/AddMM.h +++ b/cpp/open3d/core/linalg/AddMM.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/AddMMCPU.cpp b/cpp/open3d/core/linalg/AddMMCPU.cpp index c839ccd6df2..1f97049dbfe 100644 --- a/cpp/open3d/core/linalg/AddMMCPU.cpp +++ b/cpp/open3d/core/linalg/AddMMCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/AddMMCUDA.cpp b/cpp/open3d/core/linalg/AddMMCUDA.cpp index 4d13857f8ab..122f8f178b1 100644 --- a/cpp/open3d/core/linalg/AddMMCUDA.cpp +++ b/cpp/open3d/core/linalg/AddMMCUDA.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/BlasWrapper.h b/cpp/open3d/core/linalg/BlasWrapper.h index 9c35fed74a5..d82363614c9 100644 --- a/cpp/open3d/core/linalg/BlasWrapper.h +++ b/cpp/open3d/core/linalg/BlasWrapper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/Det.cpp b/cpp/open3d/core/linalg/Det.cpp index 8ca57f05fdd..a2e05344b21 100644 --- a/cpp/open3d/core/linalg/Det.cpp +++ b/cpp/open3d/core/linalg/Det.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/Det.h b/cpp/open3d/core/linalg/Det.h index fa68a25ecdb..a69e4c9166b 100644 --- a/cpp/open3d/core/linalg/Det.h +++ b/cpp/open3d/core/linalg/Det.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/Inverse.cpp b/cpp/open3d/core/linalg/Inverse.cpp index dad96c211cd..51cf7693217 100644 --- a/cpp/open3d/core/linalg/Inverse.cpp +++ b/cpp/open3d/core/linalg/Inverse.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/Inverse.h b/cpp/open3d/core/linalg/Inverse.h index 6c3d63817e9..8809f8f176c 100644 --- a/cpp/open3d/core/linalg/Inverse.h +++ b/cpp/open3d/core/linalg/Inverse.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/InverseCPU.cpp b/cpp/open3d/core/linalg/InverseCPU.cpp index d69c49f353e..bcedaf75d3e 100644 --- a/cpp/open3d/core/linalg/InverseCPU.cpp +++ b/cpp/open3d/core/linalg/InverseCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/InverseCUDA.cpp b/cpp/open3d/core/linalg/InverseCUDA.cpp index 3fdfba452c5..dca871c9bc3 100644 --- a/cpp/open3d/core/linalg/InverseCUDA.cpp +++ b/cpp/open3d/core/linalg/InverseCUDA.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LU.cpp b/cpp/open3d/core/linalg/LU.cpp index 85de3e2fb48..5bfafdac425 100644 --- a/cpp/open3d/core/linalg/LU.cpp +++ b/cpp/open3d/core/linalg/LU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LU.h b/cpp/open3d/core/linalg/LU.h index bf17f7befc7..d7c1f054954 100644 --- a/cpp/open3d/core/linalg/LU.h +++ b/cpp/open3d/core/linalg/LU.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LUCPU.cpp b/cpp/open3d/core/linalg/LUCPU.cpp index 4026fde7ed4..5ea4ba63fdd 100644 --- a/cpp/open3d/core/linalg/LUCPU.cpp +++ b/cpp/open3d/core/linalg/LUCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LUCUDA.cpp b/cpp/open3d/core/linalg/LUCUDA.cpp index 4cac8097152..6a5f9f89544 100644 --- a/cpp/open3d/core/linalg/LUCUDA.cpp +++ b/cpp/open3d/core/linalg/LUCUDA.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LUImpl.h b/cpp/open3d/core/linalg/LUImpl.h index 3edd3ae905c..36898fa3de9 100644 --- a/cpp/open3d/core/linalg/LUImpl.h +++ b/cpp/open3d/core/linalg/LUImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LapackWrapper.h b/cpp/open3d/core/linalg/LapackWrapper.h index f49cfbf9d10..a27a69cf8ee 100644 --- a/cpp/open3d/core/linalg/LapackWrapper.h +++ b/cpp/open3d/core/linalg/LapackWrapper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LeastSquares.cpp b/cpp/open3d/core/linalg/LeastSquares.cpp index 5eac4cd6ae2..6340331c5ce 100644 --- a/cpp/open3d/core/linalg/LeastSquares.cpp +++ b/cpp/open3d/core/linalg/LeastSquares.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LeastSquares.h b/cpp/open3d/core/linalg/LeastSquares.h index 79ca7aeef59..c2e79935f5d 100644 --- a/cpp/open3d/core/linalg/LeastSquares.h +++ b/cpp/open3d/core/linalg/LeastSquares.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LeastSquaresCPU.cpp b/cpp/open3d/core/linalg/LeastSquaresCPU.cpp index 83418947d77..96e85da2f21 100644 --- a/cpp/open3d/core/linalg/LeastSquaresCPU.cpp +++ b/cpp/open3d/core/linalg/LeastSquaresCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LeastSquaresCUDA.cpp b/cpp/open3d/core/linalg/LeastSquaresCUDA.cpp index ca9b8ab0dca..82f59ec2c34 100644 --- a/cpp/open3d/core/linalg/LeastSquaresCUDA.cpp +++ b/cpp/open3d/core/linalg/LeastSquaresCUDA.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LinalgHeadersCPU.h b/cpp/open3d/core/linalg/LinalgHeadersCPU.h index 5a72c2ae531..3f94a9ae274 100644 --- a/cpp/open3d/core/linalg/LinalgHeadersCPU.h +++ b/cpp/open3d/core/linalg/LinalgHeadersCPU.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LinalgHeadersCUDA.h b/cpp/open3d/core/linalg/LinalgHeadersCUDA.h index d34394dc813..49b1240579d 100644 --- a/cpp/open3d/core/linalg/LinalgHeadersCUDA.h +++ b/cpp/open3d/core/linalg/LinalgHeadersCUDA.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LinalgUtils.cpp b/cpp/open3d/core/linalg/LinalgUtils.cpp index 12d061664aa..723abeca704 100644 --- a/cpp/open3d/core/linalg/LinalgUtils.cpp +++ b/cpp/open3d/core/linalg/LinalgUtils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/LinalgUtils.h b/cpp/open3d/core/linalg/LinalgUtils.h index 5eaae8cfa65..4435faced72 100644 --- a/cpp/open3d/core/linalg/LinalgUtils.h +++ b/cpp/open3d/core/linalg/LinalgUtils.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/Matmul.cpp b/cpp/open3d/core/linalg/Matmul.cpp index 41cb2c4dae2..1b616c5f335 100644 --- a/cpp/open3d/core/linalg/Matmul.cpp +++ b/cpp/open3d/core/linalg/Matmul.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/Matmul.h b/cpp/open3d/core/linalg/Matmul.h index 724db1bcc84..da29240b0c4 100644 --- a/cpp/open3d/core/linalg/Matmul.h +++ b/cpp/open3d/core/linalg/Matmul.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/MatmulCPU.cpp b/cpp/open3d/core/linalg/MatmulCPU.cpp index 209683d338f..2757d29a63d 100644 --- a/cpp/open3d/core/linalg/MatmulCPU.cpp +++ b/cpp/open3d/core/linalg/MatmulCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/MatmulCUDA.cpp b/cpp/open3d/core/linalg/MatmulCUDA.cpp index 0982bf57cec..f5a517ef4bd 100644 --- a/cpp/open3d/core/linalg/MatmulCUDA.cpp +++ b/cpp/open3d/core/linalg/MatmulCUDA.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/SVD.cpp b/cpp/open3d/core/linalg/SVD.cpp index 757a138d416..935d014ef4e 100644 --- a/cpp/open3d/core/linalg/SVD.cpp +++ b/cpp/open3d/core/linalg/SVD.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/SVD.h b/cpp/open3d/core/linalg/SVD.h index caf83ed6481..9e6deefa6c1 100644 --- a/cpp/open3d/core/linalg/SVD.h +++ b/cpp/open3d/core/linalg/SVD.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/SVDCPU.cpp b/cpp/open3d/core/linalg/SVDCPU.cpp index 682ea9e08cf..4803e1ee576 100644 --- a/cpp/open3d/core/linalg/SVDCPU.cpp +++ b/cpp/open3d/core/linalg/SVDCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/SVDCUDA.cpp b/cpp/open3d/core/linalg/SVDCUDA.cpp index a811090bffb..a7acbf07b99 100644 --- a/cpp/open3d/core/linalg/SVDCUDA.cpp +++ b/cpp/open3d/core/linalg/SVDCUDA.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/Solve.cpp b/cpp/open3d/core/linalg/Solve.cpp index 9956bddf5f0..f1025520fac 100644 --- a/cpp/open3d/core/linalg/Solve.cpp +++ b/cpp/open3d/core/linalg/Solve.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/Solve.h b/cpp/open3d/core/linalg/Solve.h index 49d73d3179f..485de7ef0f2 100644 --- a/cpp/open3d/core/linalg/Solve.h +++ b/cpp/open3d/core/linalg/Solve.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/SolveCPU.cpp b/cpp/open3d/core/linalg/SolveCPU.cpp index 08452a17ea9..05a589e1072 100644 --- a/cpp/open3d/core/linalg/SolveCPU.cpp +++ b/cpp/open3d/core/linalg/SolveCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/SolveCUDA.cpp b/cpp/open3d/core/linalg/SolveCUDA.cpp index cc1f28dcdd3..1e2c656103b 100644 --- a/cpp/open3d/core/linalg/SolveCUDA.cpp +++ b/cpp/open3d/core/linalg/SolveCUDA.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/Tri.cpp b/cpp/open3d/core/linalg/Tri.cpp index 1852ac01606..77e72b076a2 100644 --- a/cpp/open3d/core/linalg/Tri.cpp +++ b/cpp/open3d/core/linalg/Tri.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/Tri.h b/cpp/open3d/core/linalg/Tri.h index 280ab3bb174..cafb41fb046 100644 --- a/cpp/open3d/core/linalg/Tri.h +++ b/cpp/open3d/core/linalg/Tri.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/TriCPU.cpp b/cpp/open3d/core/linalg/TriCPU.cpp index 1962b3010cf..1bbb10a9fdf 100644 --- a/cpp/open3d/core/linalg/TriCPU.cpp +++ b/cpp/open3d/core/linalg/TriCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/TriCUDA.cu b/cpp/open3d/core/linalg/TriCUDA.cu index 333d640c8f2..20407d8d7c5 100644 --- a/cpp/open3d/core/linalg/TriCUDA.cu +++ b/cpp/open3d/core/linalg/TriCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/TriImpl.h b/cpp/open3d/core/linalg/TriImpl.h index 5219ddfe8eb..441d9c69c93 100644 --- a/cpp/open3d/core/linalg/TriImpl.h +++ b/cpp/open3d/core/linalg/TriImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/kernel/Matrix.h b/cpp/open3d/core/linalg/kernel/Matrix.h index 9ebe2d341b9..2968f69bc84 100644 --- a/cpp/open3d/core/linalg/kernel/Matrix.h +++ b/cpp/open3d/core/linalg/kernel/Matrix.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/linalg/kernel/SVD3x3.h b/cpp/open3d/core/linalg/kernel/SVD3x3.h index e591e6a6920..84965343ffd 100644 --- a/cpp/open3d/core/linalg/kernel/SVD3x3.h +++ b/cpp/open3d/core/linalg/kernel/SVD3x3.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- /************************************************************************** diff --git a/cpp/open3d/core/nns/FixedRadiusIndex.cpp b/cpp/open3d/core/nns/FixedRadiusIndex.cpp index 1faba40060c..fb50820bb70 100644 --- a/cpp/open3d/core/nns/FixedRadiusIndex.cpp +++ b/cpp/open3d/core/nns/FixedRadiusIndex.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/FixedRadiusIndex.h b/cpp/open3d/core/nns/FixedRadiusIndex.h index 47929950023..838c1ccc484 100644 --- a/cpp/open3d/core/nns/FixedRadiusIndex.h +++ b/cpp/open3d/core/nns/FixedRadiusIndex.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/FixedRadiusSearchImpl.cuh b/cpp/open3d/core/nns/FixedRadiusSearchImpl.cuh index 42a7ff3c9b2..c4eb31c8532 100644 --- a/cpp/open3d/core/nns/FixedRadiusSearchImpl.cuh +++ b/cpp/open3d/core/nns/FixedRadiusSearchImpl.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once diff --git a/cpp/open3d/core/nns/FixedRadiusSearchImpl.h b/cpp/open3d/core/nns/FixedRadiusSearchImpl.h index be8cfd32012..ae65f493637 100644 --- a/cpp/open3d/core/nns/FixedRadiusSearchImpl.h +++ b/cpp/open3d/core/nns/FixedRadiusSearchImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/FixedRadiusSearchOps.cpp b/cpp/open3d/core/nns/FixedRadiusSearchOps.cpp index 789690dd098..7a9dc4b4077 100644 --- a/cpp/open3d/core/nns/FixedRadiusSearchOps.cpp +++ b/cpp/open3d/core/nns/FixedRadiusSearchOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/core/nns/FixedRadiusSearchOps.cu b/cpp/open3d/core/nns/FixedRadiusSearchOps.cu index 6e93c03cd0a..6f2a7e1df9e 100644 --- a/cpp/open3d/core/nns/FixedRadiusSearchOps.cu +++ b/cpp/open3d/core/nns/FixedRadiusSearchOps.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/core/nns/KnnIndex.cpp b/cpp/open3d/core/nns/KnnIndex.cpp index 4266f57449a..fc68f6dbe54 100644 --- a/cpp/open3d/core/nns/KnnIndex.cpp +++ b/cpp/open3d/core/nns/KnnIndex.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/KnnIndex.h b/cpp/open3d/core/nns/KnnIndex.h index e5f5e3baf7c..458a3dd0b35 100644 --- a/cpp/open3d/core/nns/KnnIndex.h +++ b/cpp/open3d/core/nns/KnnIndex.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/KnnSearchImpl.cuh b/cpp/open3d/core/nns/KnnSearchImpl.cuh index 2ab909f804e..2f1e8f653c7 100644 --- a/cpp/open3d/core/nns/KnnSearchImpl.cuh +++ b/cpp/open3d/core/nns/KnnSearchImpl.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/KnnSearchOps.cu b/cpp/open3d/core/nns/KnnSearchOps.cu index 2b20a8852cd..8fbaf466b5c 100644 --- a/cpp/open3d/core/nns/KnnSearchOps.cu +++ b/cpp/open3d/core/nns/KnnSearchOps.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/MemoryAllocation.h b/cpp/open3d/core/nns/MemoryAllocation.h index 64c7d879178..78c8d7ebbd2 100644 --- a/cpp/open3d/core/nns/MemoryAllocation.h +++ b/cpp/open3d/core/nns/MemoryAllocation.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/NNSIndex.cpp b/cpp/open3d/core/nns/NNSIndex.cpp index 3300d7686d5..f9c41535f81 100644 --- a/cpp/open3d/core/nns/NNSIndex.cpp +++ b/cpp/open3d/core/nns/NNSIndex.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/NNSIndex.h b/cpp/open3d/core/nns/NNSIndex.h index 0e71a6d3a40..09383f224e9 100644 --- a/cpp/open3d/core/nns/NNSIndex.h +++ b/cpp/open3d/core/nns/NNSIndex.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/NanoFlannImpl.h b/cpp/open3d/core/nns/NanoFlannImpl.h index 027d6d0c4ee..279b59c0ac4 100644 --- a/cpp/open3d/core/nns/NanoFlannImpl.h +++ b/cpp/open3d/core/nns/NanoFlannImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once diff --git a/cpp/open3d/core/nns/NanoFlannIndex.cpp b/cpp/open3d/core/nns/NanoFlannIndex.cpp index 4be2aa189eb..b4d39299a7f 100644 --- a/cpp/open3d/core/nns/NanoFlannIndex.cpp +++ b/cpp/open3d/core/nns/NanoFlannIndex.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/NanoFlannIndex.h b/cpp/open3d/core/nns/NanoFlannIndex.h index 32f0b48cedd..74ee3e5b1b1 100644 --- a/cpp/open3d/core/nns/NanoFlannIndex.h +++ b/cpp/open3d/core/nns/NanoFlannIndex.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/NearestNeighborSearch.cpp b/cpp/open3d/core/nns/NearestNeighborSearch.cpp index 3a7c3122162..ebf38ec05b3 100644 --- a/cpp/open3d/core/nns/NearestNeighborSearch.cpp +++ b/cpp/open3d/core/nns/NearestNeighborSearch.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/NearestNeighborSearch.h b/cpp/open3d/core/nns/NearestNeighborSearch.h index 32fa6b87785..9122e9eb943 100644 --- a/cpp/open3d/core/nns/NearestNeighborSearch.h +++ b/cpp/open3d/core/nns/NearestNeighborSearch.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/NeighborSearchAllocator.h b/cpp/open3d/core/nns/NeighborSearchAllocator.h index 1845282151f..c0e66e2acf5 100644 --- a/cpp/open3d/core/nns/NeighborSearchAllocator.h +++ b/cpp/open3d/core/nns/NeighborSearchAllocator.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/NeighborSearchCommon.h b/cpp/open3d/core/nns/NeighborSearchCommon.h index 0a010dc6eaa..97ffb810ffb 100644 --- a/cpp/open3d/core/nns/NeighborSearchCommon.h +++ b/cpp/open3d/core/nns/NeighborSearchCommon.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/core/nns/kernel/BlockMerge.cuh b/cpp/open3d/core/nns/kernel/BlockMerge.cuh index 870d87847c8..07e1bd40727 100644 --- a/cpp/open3d/core/nns/kernel/BlockMerge.cuh +++ b/cpp/open3d/core/nns/kernel/BlockMerge.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/BlockSelect.cuh b/cpp/open3d/core/nns/kernel/BlockSelect.cuh index d54ebd0e5f5..c369854578a 100644 --- a/cpp/open3d/core/nns/kernel/BlockSelect.cuh +++ b/cpp/open3d/core/nns/kernel/BlockSelect.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/BlockSelectFloat32.cu b/cpp/open3d/core/nns/kernel/BlockSelectFloat32.cu index 8b56f0a7ed7..4bd77af5423 100644 --- a/cpp/open3d/core/nns/kernel/BlockSelectFloat32.cu +++ b/cpp/open3d/core/nns/kernel/BlockSelectFloat32.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/BlockSelectFloat64.cu b/cpp/open3d/core/nns/kernel/BlockSelectFloat64.cu index fd181c4645d..d23d1a3a488 100644 --- a/cpp/open3d/core/nns/kernel/BlockSelectFloat64.cu +++ b/cpp/open3d/core/nns/kernel/BlockSelectFloat64.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/BlockSelectImpl.cuh b/cpp/open3d/core/nns/kernel/BlockSelectImpl.cuh index efc35f9d9d7..dae57ae99d9 100644 --- a/cpp/open3d/core/nns/kernel/BlockSelectImpl.cuh +++ b/cpp/open3d/core/nns/kernel/BlockSelectImpl.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/DeviceDefs.cuh b/cpp/open3d/core/nns/kernel/DeviceDefs.cuh index 89ef8f228e4..85b67c436ea 100644 --- a/cpp/open3d/core/nns/kernel/DeviceDefs.cuh +++ b/cpp/open3d/core/nns/kernel/DeviceDefs.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/DistancesUtils.cuh b/cpp/open3d/core/nns/kernel/DistancesUtils.cuh index 62f08005a1d..9a297d70324 100644 --- a/cpp/open3d/core/nns/kernel/DistancesUtils.cuh +++ b/cpp/open3d/core/nns/kernel/DistancesUtils.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/L2Select.cuh b/cpp/open3d/core/nns/kernel/L2Select.cuh index 3abd83cfe39..61c37bd0b37 100644 --- a/cpp/open3d/core/nns/kernel/L2Select.cuh +++ b/cpp/open3d/core/nns/kernel/L2Select.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/Limits.cuh b/cpp/open3d/core/nns/kernel/Limits.cuh index 70b22d75d67..bad35dee8ae 100644 --- a/cpp/open3d/core/nns/kernel/Limits.cuh +++ b/cpp/open3d/core/nns/kernel/Limits.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/MergeNetwork.cuh b/cpp/open3d/core/nns/kernel/MergeNetwork.cuh index 5fcc5321959..5306eb7dc33 100644 --- a/cpp/open3d/core/nns/kernel/MergeNetwork.cuh +++ b/cpp/open3d/core/nns/kernel/MergeNetwork.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/Pair.cuh b/cpp/open3d/core/nns/kernel/Pair.cuh index 026cbcdec44..15928ba6eae 100644 --- a/cpp/open3d/core/nns/kernel/Pair.cuh +++ b/cpp/open3d/core/nns/kernel/Pair.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/PtxUtils.cuh b/cpp/open3d/core/nns/kernel/PtxUtils.cuh index a23bc194f40..8c497b4c2ba 100644 --- a/cpp/open3d/core/nns/kernel/PtxUtils.cuh +++ b/cpp/open3d/core/nns/kernel/PtxUtils.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/Reduction.cuh b/cpp/open3d/core/nns/kernel/Reduction.cuh index 6e867f95551..a87dc0ac9bd 100644 --- a/cpp/open3d/core/nns/kernel/Reduction.cuh +++ b/cpp/open3d/core/nns/kernel/Reduction.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/ReductionOps.cuh b/cpp/open3d/core/nns/kernel/ReductionOps.cuh index fee64e9a52e..da8eb4710a1 100644 --- a/cpp/open3d/core/nns/kernel/ReductionOps.cuh +++ b/cpp/open3d/core/nns/kernel/ReductionOps.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/Select.cuh b/cpp/open3d/core/nns/kernel/Select.cuh index b1bc1d40758..cadfea81925 100644 --- a/cpp/open3d/core/nns/kernel/Select.cuh +++ b/cpp/open3d/core/nns/kernel/Select.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/StaticUtils.cuh b/cpp/open3d/core/nns/kernel/StaticUtils.cuh index 625d740a731..f636ff9e430 100644 --- a/cpp/open3d/core/nns/kernel/StaticUtils.cuh +++ b/cpp/open3d/core/nns/kernel/StaticUtils.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/core/nns/kernel/WarpShuffle.cuh b/cpp/open3d/core/nns/kernel/WarpShuffle.cuh index f5b437de2a3..bce9a4a9362 100644 --- a/cpp/open3d/core/nns/kernel/WarpShuffle.cuh +++ b/cpp/open3d/core/nns/kernel/WarpShuffle.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // MIT License diff --git a/cpp/open3d/data/Dataset.cpp b/cpp/open3d/data/Dataset.cpp index 8cd568c9856..60f475958c6 100644 --- a/cpp/open3d/data/Dataset.cpp +++ b/cpp/open3d/data/Dataset.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/Dataset.h b/cpp/open3d/data/Dataset.h index 35c448d11e0..be723fd30a7 100644 --- a/cpp/open3d/data/Dataset.h +++ b/cpp/open3d/data/Dataset.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/ArmadilloMesh.cpp b/cpp/open3d/data/dataset/ArmadilloMesh.cpp index f2a73720a3a..2627515c323 100644 --- a/cpp/open3d/data/dataset/ArmadilloMesh.cpp +++ b/cpp/open3d/data/dataset/ArmadilloMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/AvocadoModel.cpp b/cpp/open3d/data/dataset/AvocadoModel.cpp index 5c67cddbebd..0ea705aae63 100644 --- a/cpp/open3d/data/dataset/AvocadoModel.cpp +++ b/cpp/open3d/data/dataset/AvocadoModel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/BedroomRGBDImages.cpp b/cpp/open3d/data/dataset/BedroomRGBDImages.cpp index 053184ded91..d9c17488739 100644 --- a/cpp/open3d/data/dataset/BedroomRGBDImages.cpp +++ b/cpp/open3d/data/dataset/BedroomRGBDImages.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/BunnyMesh.cpp b/cpp/open3d/data/dataset/BunnyMesh.cpp index 0555fa9291c..ffb07cb3c2c 100644 --- a/cpp/open3d/data/dataset/BunnyMesh.cpp +++ b/cpp/open3d/data/dataset/BunnyMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/CrateModel.cpp b/cpp/open3d/data/dataset/CrateModel.cpp index b99d9ac97e5..ecc1e956b9c 100644 --- a/cpp/open3d/data/dataset/CrateModel.cpp +++ b/cpp/open3d/data/dataset/CrateModel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/DamagedHelmetModel.cpp b/cpp/open3d/data/dataset/DamagedHelmetModel.cpp index b97d3e20359..b64d2a5ff3f 100644 --- a/cpp/open3d/data/dataset/DamagedHelmetModel.cpp +++ b/cpp/open3d/data/dataset/DamagedHelmetModel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/DemoColoredICPPointClouds.cpp b/cpp/open3d/data/dataset/DemoColoredICPPointClouds.cpp index b6660ae083c..49e883cde06 100644 --- a/cpp/open3d/data/dataset/DemoColoredICPPointClouds.cpp +++ b/cpp/open3d/data/dataset/DemoColoredICPPointClouds.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/DemoCropPointCloud.cpp b/cpp/open3d/data/dataset/DemoCropPointCloud.cpp index c637a0fa173..33e07e82610 100644 --- a/cpp/open3d/data/dataset/DemoCropPointCloud.cpp +++ b/cpp/open3d/data/dataset/DemoCropPointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/DemoCustomVisualization.cpp b/cpp/open3d/data/dataset/DemoCustomVisualization.cpp index e7da973324a..b7ee361a93d 100644 --- a/cpp/open3d/data/dataset/DemoCustomVisualization.cpp +++ b/cpp/open3d/data/dataset/DemoCustomVisualization.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/DemoDopplerICPSequence.cpp b/cpp/open3d/data/dataset/DemoDopplerICPSequence.cpp index f4f29a17645..172fc305b8a 100644 --- a/cpp/open3d/data/dataset/DemoDopplerICPSequence.cpp +++ b/cpp/open3d/data/dataset/DemoDopplerICPSequence.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/DemoFeatureMatchingPointClouds.cpp b/cpp/open3d/data/dataset/DemoFeatureMatchingPointClouds.cpp index f2e3aa8fbb2..4774e6bcf00 100644 --- a/cpp/open3d/data/dataset/DemoFeatureMatchingPointClouds.cpp +++ b/cpp/open3d/data/dataset/DemoFeatureMatchingPointClouds.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/DemoICPPointClouds.cpp b/cpp/open3d/data/dataset/DemoICPPointClouds.cpp index eafc71d66a3..7c18c3ef8b3 100644 --- a/cpp/open3d/data/dataset/DemoICPPointClouds.cpp +++ b/cpp/open3d/data/dataset/DemoICPPointClouds.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/DemoPoseGraphOptimization.cpp b/cpp/open3d/data/dataset/DemoPoseGraphOptimization.cpp index a570c362cae..6bb09273733 100644 --- a/cpp/open3d/data/dataset/DemoPoseGraphOptimization.cpp +++ b/cpp/open3d/data/dataset/DemoPoseGraphOptimization.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/EaglePointCloud.cpp b/cpp/open3d/data/dataset/EaglePointCloud.cpp index 0c80b82c865..35a5c51f40e 100644 --- a/cpp/open3d/data/dataset/EaglePointCloud.cpp +++ b/cpp/open3d/data/dataset/EaglePointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/FlightHelmetModel.cpp b/cpp/open3d/data/dataset/FlightHelmetModel.cpp index 94f226fc16d..ab5a104c4f9 100644 --- a/cpp/open3d/data/dataset/FlightHelmetModel.cpp +++ b/cpp/open3d/data/dataset/FlightHelmetModel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/JackJackL515Bag.cpp b/cpp/open3d/data/dataset/JackJackL515Bag.cpp index 9ba9d270a08..4dd4f8c7eac 100644 --- a/cpp/open3d/data/dataset/JackJackL515Bag.cpp +++ b/cpp/open3d/data/dataset/JackJackL515Bag.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/JuneauImage.cpp b/cpp/open3d/data/dataset/JuneauImage.cpp index 18357465a55..349d05348c1 100644 --- a/cpp/open3d/data/dataset/JuneauImage.cpp +++ b/cpp/open3d/data/dataset/JuneauImage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/KnotMesh.cpp b/cpp/open3d/data/dataset/KnotMesh.cpp index b900b4859b6..1f9e00aa352 100644 --- a/cpp/open3d/data/dataset/KnotMesh.cpp +++ b/cpp/open3d/data/dataset/KnotMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/LivingRoomPointClouds.cpp b/cpp/open3d/data/dataset/LivingRoomPointClouds.cpp index 6de432c9b20..73fab7b9699 100644 --- a/cpp/open3d/data/dataset/LivingRoomPointClouds.cpp +++ b/cpp/open3d/data/dataset/LivingRoomPointClouds.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/LoungeRGBDImages.cpp b/cpp/open3d/data/dataset/LoungeRGBDImages.cpp index d1b6a39b1a9..7f2268788b8 100644 --- a/cpp/open3d/data/dataset/LoungeRGBDImages.cpp +++ b/cpp/open3d/data/dataset/LoungeRGBDImages.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/MetalTexture.cpp b/cpp/open3d/data/dataset/MetalTexture.cpp index 0176b5b7803..b778fa003b1 100644 --- a/cpp/open3d/data/dataset/MetalTexture.cpp +++ b/cpp/open3d/data/dataset/MetalTexture.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/MonkeyModel.cpp b/cpp/open3d/data/dataset/MonkeyModel.cpp index 7685760aa4f..d39580936d0 100644 --- a/cpp/open3d/data/dataset/MonkeyModel.cpp +++ b/cpp/open3d/data/dataset/MonkeyModel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/OfficePointClouds.cpp b/cpp/open3d/data/dataset/OfficePointClouds.cpp index 45955901abf..0066f70fd59 100644 --- a/cpp/open3d/data/dataset/OfficePointClouds.cpp +++ b/cpp/open3d/data/dataset/OfficePointClouds.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/PCDPointCloud.cpp b/cpp/open3d/data/dataset/PCDPointCloud.cpp index 64e4168f933..f1495559d4f 100644 --- a/cpp/open3d/data/dataset/PCDPointCloud.cpp +++ b/cpp/open3d/data/dataset/PCDPointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/PLYPointCloud.cpp b/cpp/open3d/data/dataset/PLYPointCloud.cpp index 7d67d66a5e3..b08c2929e07 100644 --- a/cpp/open3d/data/dataset/PLYPointCloud.cpp +++ b/cpp/open3d/data/dataset/PLYPointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/PTSPointCloud.cpp b/cpp/open3d/data/dataset/PTSPointCloud.cpp index ea2e963264b..ce5b1f1ede8 100644 --- a/cpp/open3d/data/dataset/PTSPointCloud.cpp +++ b/cpp/open3d/data/dataset/PTSPointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/PaintedPlasterTexture.cpp b/cpp/open3d/data/dataset/PaintedPlasterTexture.cpp index a7ff8f3842d..2cafe5e8522 100644 --- a/cpp/open3d/data/dataset/PaintedPlasterTexture.cpp +++ b/cpp/open3d/data/dataset/PaintedPlasterTexture.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/RedwoodIndoorLivingRoom1.cpp b/cpp/open3d/data/dataset/RedwoodIndoorLivingRoom1.cpp index 54710d28c54..0ae3258355c 100644 --- a/cpp/open3d/data/dataset/RedwoodIndoorLivingRoom1.cpp +++ b/cpp/open3d/data/dataset/RedwoodIndoorLivingRoom1.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/RedwoodIndoorLivingRoom2.cpp b/cpp/open3d/data/dataset/RedwoodIndoorLivingRoom2.cpp index b9d6070c0f7..9f8e65d173f 100644 --- a/cpp/open3d/data/dataset/RedwoodIndoorLivingRoom2.cpp +++ b/cpp/open3d/data/dataset/RedwoodIndoorLivingRoom2.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/RedwoodIndoorOffice1.cpp b/cpp/open3d/data/dataset/RedwoodIndoorOffice1.cpp index 0fbfcf329d5..45a8bb32243 100644 --- a/cpp/open3d/data/dataset/RedwoodIndoorOffice1.cpp +++ b/cpp/open3d/data/dataset/RedwoodIndoorOffice1.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/RedwoodIndoorOffice2.cpp b/cpp/open3d/data/dataset/RedwoodIndoorOffice2.cpp index bdd61f9986c..b9167c48706 100644 --- a/cpp/open3d/data/dataset/RedwoodIndoorOffice2.cpp +++ b/cpp/open3d/data/dataset/RedwoodIndoorOffice2.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/SampleFountainRGBDImages.cpp b/cpp/open3d/data/dataset/SampleFountainRGBDImages.cpp index 1b4436a42d5..c65c8b1ede2 100644 --- a/cpp/open3d/data/dataset/SampleFountainRGBDImages.cpp +++ b/cpp/open3d/data/dataset/SampleFountainRGBDImages.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/SampleICPPointClouds.cpp b/cpp/open3d/data/dataset/SampleICPPointClouds.cpp index 445ce35aff2..d2e989c6f0f 100644 --- a/cpp/open3d/data/dataset/SampleICPPointClouds.cpp +++ b/cpp/open3d/data/dataset/SampleICPPointClouds.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/SampleL515Bag.cpp b/cpp/open3d/data/dataset/SampleL515Bag.cpp index bb442d329cc..c889699b746 100644 --- a/cpp/open3d/data/dataset/SampleL515Bag.cpp +++ b/cpp/open3d/data/dataset/SampleL515Bag.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/SampleNYURGBDImage.cpp b/cpp/open3d/data/dataset/SampleNYURGBDImage.cpp index 20c9ceb8304..6d6b83c570a 100644 --- a/cpp/open3d/data/dataset/SampleNYURGBDImage.cpp +++ b/cpp/open3d/data/dataset/SampleNYURGBDImage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/SampleRedwoodRGBDImages.cpp b/cpp/open3d/data/dataset/SampleRedwoodRGBDImages.cpp index f8e7c96b45a..30144480523 100644 --- a/cpp/open3d/data/dataset/SampleRedwoodRGBDImages.cpp +++ b/cpp/open3d/data/dataset/SampleRedwoodRGBDImages.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/SampleSUNRGBDImage.cpp b/cpp/open3d/data/dataset/SampleSUNRGBDImage.cpp index 308ab925adf..b8053f5ef7f 100644 --- a/cpp/open3d/data/dataset/SampleSUNRGBDImage.cpp +++ b/cpp/open3d/data/dataset/SampleSUNRGBDImage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/SampleTUMRGBDImage.cpp b/cpp/open3d/data/dataset/SampleTUMRGBDImage.cpp index 19798c5e333..60aa04e56e4 100644 --- a/cpp/open3d/data/dataset/SampleTUMRGBDImage.cpp +++ b/cpp/open3d/data/dataset/SampleTUMRGBDImage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/SwordModel.cpp b/cpp/open3d/data/dataset/SwordModel.cpp index c9d74e7cb32..0d1db667e8d 100644 --- a/cpp/open3d/data/dataset/SwordModel.cpp +++ b/cpp/open3d/data/dataset/SwordModel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/TerrazzoTexture.cpp b/cpp/open3d/data/dataset/TerrazzoTexture.cpp index beb70b3284d..08d1f74445b 100644 --- a/cpp/open3d/data/dataset/TerrazzoTexture.cpp +++ b/cpp/open3d/data/dataset/TerrazzoTexture.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/TilesTexture.cpp b/cpp/open3d/data/dataset/TilesTexture.cpp index 719f9bf6a37..d3983e5d0cb 100644 --- a/cpp/open3d/data/dataset/TilesTexture.cpp +++ b/cpp/open3d/data/dataset/TilesTexture.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/WoodFloorTexture.cpp b/cpp/open3d/data/dataset/WoodFloorTexture.cpp index ae6e0a26771..9640f9d811c 100644 --- a/cpp/open3d/data/dataset/WoodFloorTexture.cpp +++ b/cpp/open3d/data/dataset/WoodFloorTexture.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/data/dataset/WoodTexture.cpp b/cpp/open3d/data/dataset/WoodTexture.cpp index d62549f5e04..2198ecd009d 100644 --- a/cpp/open3d/data/dataset/WoodTexture.cpp +++ b/cpp/open3d/data/dataset/WoodTexture.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/BoundingVolume.cpp b/cpp/open3d/geometry/BoundingVolume.cpp index 89b0ca70e5d..5f5f5c6a6e3 100644 --- a/cpp/open3d/geometry/BoundingVolume.cpp +++ b/cpp/open3d/geometry/BoundingVolume.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/BoundingVolume.h b/cpp/open3d/geometry/BoundingVolume.h index b4b310f3ca0..432050bccdc 100644 --- a/cpp/open3d/geometry/BoundingVolume.h +++ b/cpp/open3d/geometry/BoundingVolume.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/EstimateNormals.cpp b/cpp/open3d/geometry/EstimateNormals.cpp index 5bc9abc0ba3..d51423182f0 100644 --- a/cpp/open3d/geometry/EstimateNormals.cpp +++ b/cpp/open3d/geometry/EstimateNormals.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/Geometry.h b/cpp/open3d/geometry/Geometry.h index bb76b55e8c2..4ddf79bcc0c 100644 --- a/cpp/open3d/geometry/Geometry.h +++ b/cpp/open3d/geometry/Geometry.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/Geometry2D.h b/cpp/open3d/geometry/Geometry2D.h index 0c66887410b..f2794883f63 100644 --- a/cpp/open3d/geometry/Geometry2D.h +++ b/cpp/open3d/geometry/Geometry2D.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/Geometry3D.cpp b/cpp/open3d/geometry/Geometry3D.cpp index af3ecceb6d2..dc240d5afa3 100644 --- a/cpp/open3d/geometry/Geometry3D.cpp +++ b/cpp/open3d/geometry/Geometry3D.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/Geometry3D.h b/cpp/open3d/geometry/Geometry3D.h index 46ebd388690..74a0cc887a3 100644 --- a/cpp/open3d/geometry/Geometry3D.h +++ b/cpp/open3d/geometry/Geometry3D.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/HalfEdgeTriangleMesh.cpp b/cpp/open3d/geometry/HalfEdgeTriangleMesh.cpp index 92b3f201d39..c9a7c32e3c4 100644 --- a/cpp/open3d/geometry/HalfEdgeTriangleMesh.cpp +++ b/cpp/open3d/geometry/HalfEdgeTriangleMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/HalfEdgeTriangleMesh.h b/cpp/open3d/geometry/HalfEdgeTriangleMesh.h index 33ceeda71f6..d1ce3e4d893 100644 --- a/cpp/open3d/geometry/HalfEdgeTriangleMesh.h +++ b/cpp/open3d/geometry/HalfEdgeTriangleMesh.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/ISSKeypoints.cpp b/cpp/open3d/geometry/ISSKeypoints.cpp index f47abae1ad2..a1c5257cea2 100644 --- a/cpp/open3d/geometry/ISSKeypoints.cpp +++ b/cpp/open3d/geometry/ISSKeypoints.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // @author Ignacio Vizzo [ivizzo@uni-bonn.de] diff --git a/cpp/open3d/geometry/Image.cpp b/cpp/open3d/geometry/Image.cpp index f14f709a108..9b145b676cb 100644 --- a/cpp/open3d/geometry/Image.cpp +++ b/cpp/open3d/geometry/Image.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/Image.h b/cpp/open3d/geometry/Image.h index ae89866a289..0dcf5469c66 100644 --- a/cpp/open3d/geometry/Image.h +++ b/cpp/open3d/geometry/Image.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/ImageFactory.cpp b/cpp/open3d/geometry/ImageFactory.cpp index d9ad9561e81..2e48af52b26 100644 --- a/cpp/open3d/geometry/ImageFactory.cpp +++ b/cpp/open3d/geometry/ImageFactory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/IntersectionTest.cpp b/cpp/open3d/geometry/IntersectionTest.cpp index 851ac59b441..118c9f5d056 100644 --- a/cpp/open3d/geometry/IntersectionTest.cpp +++ b/cpp/open3d/geometry/IntersectionTest.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/IntersectionTest.h b/cpp/open3d/geometry/IntersectionTest.h index aa93b54a531..90f22fc9eb6 100644 --- a/cpp/open3d/geometry/IntersectionTest.h +++ b/cpp/open3d/geometry/IntersectionTest.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/KDTreeFlann.cpp b/cpp/open3d/geometry/KDTreeFlann.cpp index d93175a8d43..e1b7889a9c1 100644 --- a/cpp/open3d/geometry/KDTreeFlann.cpp +++ b/cpp/open3d/geometry/KDTreeFlann.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/KDTreeFlann.h b/cpp/open3d/geometry/KDTreeFlann.h index 3d3ab2c5bea..2ef8aa962eb 100644 --- a/cpp/open3d/geometry/KDTreeFlann.h +++ b/cpp/open3d/geometry/KDTreeFlann.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/KDTreeSearchParam.h b/cpp/open3d/geometry/KDTreeSearchParam.h index 2032228e67a..9e1914e33cf 100644 --- a/cpp/open3d/geometry/KDTreeSearchParam.h +++ b/cpp/open3d/geometry/KDTreeSearchParam.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/Keypoint.h b/cpp/open3d/geometry/Keypoint.h index 7e13d4dc110..48a8d1d78bd 100644 --- a/cpp/open3d/geometry/Keypoint.h +++ b/cpp/open3d/geometry/Keypoint.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // @author Ignacio Vizzo [ivizzo@uni-bonn.de] diff --git a/cpp/open3d/geometry/Line3D.cpp b/cpp/open3d/geometry/Line3D.cpp index 310603893ac..17b6a2f1dc7 100644 --- a/cpp/open3d/geometry/Line3D.cpp +++ b/cpp/open3d/geometry/Line3D.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/Line3D.h b/cpp/open3d/geometry/Line3D.h index 5be5567e7c9..ea2f2d44521 100644 --- a/cpp/open3d/geometry/Line3D.h +++ b/cpp/open3d/geometry/Line3D.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/LineSet.cpp b/cpp/open3d/geometry/LineSet.cpp index ca6ce664b29..9a38d2a7371 100644 --- a/cpp/open3d/geometry/LineSet.cpp +++ b/cpp/open3d/geometry/LineSet.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/LineSet.h b/cpp/open3d/geometry/LineSet.h index 1dbffbb5e75..3718b6d446c 100644 --- a/cpp/open3d/geometry/LineSet.h +++ b/cpp/open3d/geometry/LineSet.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/LineSetFactory.cpp b/cpp/open3d/geometry/LineSetFactory.cpp index 41e44d1db5f..1510936ba8b 100644 --- a/cpp/open3d/geometry/LineSetFactory.cpp +++ b/cpp/open3d/geometry/LineSetFactory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/MeshBase.cpp b/cpp/open3d/geometry/MeshBase.cpp index 1e403968900..52c26c4171b 100644 --- a/cpp/open3d/geometry/MeshBase.cpp +++ b/cpp/open3d/geometry/MeshBase.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/MeshBase.h b/cpp/open3d/geometry/MeshBase.h index f479a925913..2a5793ac62b 100644 --- a/cpp/open3d/geometry/MeshBase.h +++ b/cpp/open3d/geometry/MeshBase.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/Octree.cpp b/cpp/open3d/geometry/Octree.cpp index ad62a7ece63..23efcb06e81 100644 --- a/cpp/open3d/geometry/Octree.cpp +++ b/cpp/open3d/geometry/Octree.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/Octree.h b/cpp/open3d/geometry/Octree.h index d2b57262a06..5b3b6d90c52 100644 --- a/cpp/open3d/geometry/Octree.h +++ b/cpp/open3d/geometry/Octree.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/PointCloud.cpp b/cpp/open3d/geometry/PointCloud.cpp index b0b6e0130ae..3c93f370395 100644 --- a/cpp/open3d/geometry/PointCloud.cpp +++ b/cpp/open3d/geometry/PointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/PointCloud.h b/cpp/open3d/geometry/PointCloud.h index fec0d3033d1..32afbc34653 100644 --- a/cpp/open3d/geometry/PointCloud.h +++ b/cpp/open3d/geometry/PointCloud.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/PointCloudCluster.cpp b/cpp/open3d/geometry/PointCloudCluster.cpp index 6efad46bd50..9dd5f0dc162 100644 --- a/cpp/open3d/geometry/PointCloudCluster.cpp +++ b/cpp/open3d/geometry/PointCloudCluster.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/PointCloudFactory.cpp b/cpp/open3d/geometry/PointCloudFactory.cpp index 184b93a62b8..183919fa9a1 100644 --- a/cpp/open3d/geometry/PointCloudFactory.cpp +++ b/cpp/open3d/geometry/PointCloudFactory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/PointCloudPlanarPatchDetection.cpp b/cpp/open3d/geometry/PointCloudPlanarPatchDetection.cpp index b096ffc5655..ac9f6e8f3d7 100644 --- a/cpp/open3d/geometry/PointCloudPlanarPatchDetection.cpp +++ b/cpp/open3d/geometry/PointCloudPlanarPatchDetection.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/PointCloudSegmentation.cpp b/cpp/open3d/geometry/PointCloudSegmentation.cpp index 2d571507934..fbafffe4015 100644 --- a/cpp/open3d/geometry/PointCloudSegmentation.cpp +++ b/cpp/open3d/geometry/PointCloudSegmentation.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/Qhull.cpp b/cpp/open3d/geometry/Qhull.cpp index 30fb485e12c..4ae7de218a3 100644 --- a/cpp/open3d/geometry/Qhull.cpp +++ b/cpp/open3d/geometry/Qhull.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/Qhull.h b/cpp/open3d/geometry/Qhull.h index c80bb0b4ac9..b8b56e684f9 100644 --- a/cpp/open3d/geometry/Qhull.h +++ b/cpp/open3d/geometry/Qhull.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/RGBDImage.cpp b/cpp/open3d/geometry/RGBDImage.cpp index 08292097ebb..baaecad4938 100644 --- a/cpp/open3d/geometry/RGBDImage.cpp +++ b/cpp/open3d/geometry/RGBDImage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/RGBDImage.h b/cpp/open3d/geometry/RGBDImage.h index 75db0b68cee..9d179ad0783 100644 --- a/cpp/open3d/geometry/RGBDImage.h +++ b/cpp/open3d/geometry/RGBDImage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/RGBDImageFactory.cpp b/cpp/open3d/geometry/RGBDImageFactory.cpp index 1f2819ebe3a..2d68a9fdf46 100644 --- a/cpp/open3d/geometry/RGBDImageFactory.cpp +++ b/cpp/open3d/geometry/RGBDImageFactory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/SurfaceReconstructionAlphaShape.cpp b/cpp/open3d/geometry/SurfaceReconstructionAlphaShape.cpp index 2fc58c9c8d3..0a70a40d077 100644 --- a/cpp/open3d/geometry/SurfaceReconstructionAlphaShape.cpp +++ b/cpp/open3d/geometry/SurfaceReconstructionAlphaShape.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/SurfaceReconstructionBallPivoting.cpp b/cpp/open3d/geometry/SurfaceReconstructionBallPivoting.cpp index 73e399309ed..994dbc6e8c8 100644 --- a/cpp/open3d/geometry/SurfaceReconstructionBallPivoting.cpp +++ b/cpp/open3d/geometry/SurfaceReconstructionBallPivoting.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/SurfaceReconstructionPoisson.cpp b/cpp/open3d/geometry/SurfaceReconstructionPoisson.cpp index 08da79d9365..a1553d6a653 100644 --- a/cpp/open3d/geometry/SurfaceReconstructionPoisson.cpp +++ b/cpp/open3d/geometry/SurfaceReconstructionPoisson.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/TetraMesh.cpp b/cpp/open3d/geometry/TetraMesh.cpp index a742f17431b..5274736fadf 100644 --- a/cpp/open3d/geometry/TetraMesh.cpp +++ b/cpp/open3d/geometry/TetraMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/TetraMesh.h b/cpp/open3d/geometry/TetraMesh.h index a23dd9dc623..b2869c520b9 100644 --- a/cpp/open3d/geometry/TetraMesh.h +++ b/cpp/open3d/geometry/TetraMesh.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/TetraMeshFactory.cpp b/cpp/open3d/geometry/TetraMeshFactory.cpp index dfa21d715d6..522417045ba 100644 --- a/cpp/open3d/geometry/TetraMeshFactory.cpp +++ b/cpp/open3d/geometry/TetraMeshFactory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/TriangleMesh.cpp b/cpp/open3d/geometry/TriangleMesh.cpp index 48faa3b6a19..b7008d932d9 100644 --- a/cpp/open3d/geometry/TriangleMesh.cpp +++ b/cpp/open3d/geometry/TriangleMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/TriangleMesh.h b/cpp/open3d/geometry/TriangleMesh.h index 8448cccbcc0..528b19ee69e 100644 --- a/cpp/open3d/geometry/TriangleMesh.h +++ b/cpp/open3d/geometry/TriangleMesh.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/TriangleMeshDeformation.cpp b/cpp/open3d/geometry/TriangleMeshDeformation.cpp index adfe76b76ed..3c037092341 100644 --- a/cpp/open3d/geometry/TriangleMeshDeformation.cpp +++ b/cpp/open3d/geometry/TriangleMeshDeformation.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/TriangleMeshFactory.cpp b/cpp/open3d/geometry/TriangleMeshFactory.cpp index 395b6622bbc..68341245bf4 100644 --- a/cpp/open3d/geometry/TriangleMeshFactory.cpp +++ b/cpp/open3d/geometry/TriangleMeshFactory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/TriangleMeshSimplification.cpp b/cpp/open3d/geometry/TriangleMeshSimplification.cpp index 90a2a166ce7..14029bf130e 100644 --- a/cpp/open3d/geometry/TriangleMeshSimplification.cpp +++ b/cpp/open3d/geometry/TriangleMeshSimplification.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/TriangleMeshSubdivide.cpp b/cpp/open3d/geometry/TriangleMeshSubdivide.cpp index 685e316b6f1..b6791df4db9 100644 --- a/cpp/open3d/geometry/TriangleMeshSubdivide.cpp +++ b/cpp/open3d/geometry/TriangleMeshSubdivide.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/VoxelGrid.cpp b/cpp/open3d/geometry/VoxelGrid.cpp index dafe6b52c01..aa028b22ac9 100644 --- a/cpp/open3d/geometry/VoxelGrid.cpp +++ b/cpp/open3d/geometry/VoxelGrid.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/VoxelGrid.h b/cpp/open3d/geometry/VoxelGrid.h index 30a228206e0..1c15a5073bb 100644 --- a/cpp/open3d/geometry/VoxelGrid.h +++ b/cpp/open3d/geometry/VoxelGrid.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/geometry/VoxelGridFactory.cpp b/cpp/open3d/geometry/VoxelGridFactory.cpp index a083c6524d5..bbe5df52c3f 100644 --- a/cpp/open3d/geometry/VoxelGridFactory.cpp +++ b/cpp/open3d/geometry/VoxelGridFactory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/FeatureIO.cpp b/cpp/open3d/io/FeatureIO.cpp index a0320f94de6..db7a675760e 100644 --- a/cpp/open3d/io/FeatureIO.cpp +++ b/cpp/open3d/io/FeatureIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/FeatureIO.h b/cpp/open3d/io/FeatureIO.h index cb8bb133643..1cbf9e56c90 100644 --- a/cpp/open3d/io/FeatureIO.h +++ b/cpp/open3d/io/FeatureIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/FileFormatIO.cpp b/cpp/open3d/io/FileFormatIO.cpp index 008b0debdb4..89089978292 100644 --- a/cpp/open3d/io/FileFormatIO.cpp +++ b/cpp/open3d/io/FileFormatIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/FileFormatIO.h b/cpp/open3d/io/FileFormatIO.h index 02233604bb8..0f3b9343be7 100644 --- a/cpp/open3d/io/FileFormatIO.h +++ b/cpp/open3d/io/FileFormatIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/IJsonConvertibleIO.cpp b/cpp/open3d/io/IJsonConvertibleIO.cpp index 719213e9abc..25543f4a786 100644 --- a/cpp/open3d/io/IJsonConvertibleIO.cpp +++ b/cpp/open3d/io/IJsonConvertibleIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/IJsonConvertibleIO.h b/cpp/open3d/io/IJsonConvertibleIO.h index 8bc9f03b13b..8b178848eb9 100644 --- a/cpp/open3d/io/IJsonConvertibleIO.h +++ b/cpp/open3d/io/IJsonConvertibleIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/ImageIO.cpp b/cpp/open3d/io/ImageIO.cpp index a4126df14e6..d808d76e0f2 100644 --- a/cpp/open3d/io/ImageIO.cpp +++ b/cpp/open3d/io/ImageIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/ImageIO.h b/cpp/open3d/io/ImageIO.h index 3c6b62be3d8..c63cd0d9e02 100644 --- a/cpp/open3d/io/ImageIO.h +++ b/cpp/open3d/io/ImageIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/ImageWarpingFieldIO.cpp b/cpp/open3d/io/ImageWarpingFieldIO.cpp index 98d660ca1c7..42d97bb909a 100644 --- a/cpp/open3d/io/ImageWarpingFieldIO.cpp +++ b/cpp/open3d/io/ImageWarpingFieldIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/ImageWarpingFieldIO.h b/cpp/open3d/io/ImageWarpingFieldIO.h index 915c7d731d9..f1b749fbc34 100644 --- a/cpp/open3d/io/ImageWarpingFieldIO.h +++ b/cpp/open3d/io/ImageWarpingFieldIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/LineSetIO.cpp b/cpp/open3d/io/LineSetIO.cpp index 72d04c1e6af..03810afdf7f 100644 --- a/cpp/open3d/io/LineSetIO.cpp +++ b/cpp/open3d/io/LineSetIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/LineSetIO.h b/cpp/open3d/io/LineSetIO.h index 00cf61c0112..6965b75be83 100644 --- a/cpp/open3d/io/LineSetIO.h +++ b/cpp/open3d/io/LineSetIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/ModelIO.cpp b/cpp/open3d/io/ModelIO.cpp index b663307a451..cacc9b5323a 100644 --- a/cpp/open3d/io/ModelIO.cpp +++ b/cpp/open3d/io/ModelIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/ModelIO.h b/cpp/open3d/io/ModelIO.h index 57bd7f7d792..c97370e120e 100644 --- a/cpp/open3d/io/ModelIO.h +++ b/cpp/open3d/io/ModelIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/OctreeIO.cpp b/cpp/open3d/io/OctreeIO.cpp index a6d6d11f1ba..ae43c3724b2 100644 --- a/cpp/open3d/io/OctreeIO.cpp +++ b/cpp/open3d/io/OctreeIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/OctreeIO.h b/cpp/open3d/io/OctreeIO.h index 30eda19e81e..57ee3b3f400 100644 --- a/cpp/open3d/io/OctreeIO.h +++ b/cpp/open3d/io/OctreeIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/PinholeCameraTrajectoryIO.cpp b/cpp/open3d/io/PinholeCameraTrajectoryIO.cpp index cf64c593c2c..7319e9fc56a 100644 --- a/cpp/open3d/io/PinholeCameraTrajectoryIO.cpp +++ b/cpp/open3d/io/PinholeCameraTrajectoryIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/PinholeCameraTrajectoryIO.h b/cpp/open3d/io/PinholeCameraTrajectoryIO.h index 5a043300325..2568ff5725e 100644 --- a/cpp/open3d/io/PinholeCameraTrajectoryIO.h +++ b/cpp/open3d/io/PinholeCameraTrajectoryIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/PointCloudIO.cpp b/cpp/open3d/io/PointCloudIO.cpp index b5d10f33a00..479a5e47203 100644 --- a/cpp/open3d/io/PointCloudIO.cpp +++ b/cpp/open3d/io/PointCloudIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/PointCloudIO.h b/cpp/open3d/io/PointCloudIO.h index e7811ab58ff..a2b27971f22 100644 --- a/cpp/open3d/io/PointCloudIO.h +++ b/cpp/open3d/io/PointCloudIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/PoseGraphIO.cpp b/cpp/open3d/io/PoseGraphIO.cpp index 64de70f945c..805b5e3de9b 100644 --- a/cpp/open3d/io/PoseGraphIO.cpp +++ b/cpp/open3d/io/PoseGraphIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/PoseGraphIO.h b/cpp/open3d/io/PoseGraphIO.h index 3d8ad1fb9fa..c761c65212d 100644 --- a/cpp/open3d/io/PoseGraphIO.h +++ b/cpp/open3d/io/PoseGraphIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/TriangleMeshIO.cpp b/cpp/open3d/io/TriangleMeshIO.cpp index 59672c8ce2d..eab7648a6c2 100644 --- a/cpp/open3d/io/TriangleMeshIO.cpp +++ b/cpp/open3d/io/TriangleMeshIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/TriangleMeshIO.h b/cpp/open3d/io/TriangleMeshIO.h index 3ee4cb0f492..02b9197ad63 100644 --- a/cpp/open3d/io/TriangleMeshIO.h +++ b/cpp/open3d/io/TriangleMeshIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/VoxelGridIO.cpp b/cpp/open3d/io/VoxelGridIO.cpp index d8e5a2e757a..bbe6b3e1953 100644 --- a/cpp/open3d/io/VoxelGridIO.cpp +++ b/cpp/open3d/io/VoxelGridIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/VoxelGridIO.h b/cpp/open3d/io/VoxelGridIO.h index 70cb90a4a10..8c5484ca091 100644 --- a/cpp/open3d/io/VoxelGridIO.h +++ b/cpp/open3d/io/VoxelGridIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileASSIMP.cpp b/cpp/open3d/io/file_format/FileASSIMP.cpp index e78d8be7718..cb904fde331 100644 --- a/cpp/open3d/io/file_format/FileASSIMP.cpp +++ b/cpp/open3d/io/file_format/FileASSIMP.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileBIN.cpp b/cpp/open3d/io/file_format/FileBIN.cpp index 2399c9b3ead..27ef362f13b 100644 --- a/cpp/open3d/io/file_format/FileBIN.cpp +++ b/cpp/open3d/io/file_format/FileBIN.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileGLTF.cpp b/cpp/open3d/io/file_format/FileGLTF.cpp index a5474b4021a..7d82eb7be4d 100644 --- a/cpp/open3d/io/file_format/FileGLTF.cpp +++ b/cpp/open3d/io/file_format/FileGLTF.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileJPG.cpp b/cpp/open3d/io/file_format/FileJPG.cpp index 7de155575bf..7ac3c757779 100644 --- a/cpp/open3d/io/file_format/FileJPG.cpp +++ b/cpp/open3d/io/file_format/FileJPG.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileJSON.cpp b/cpp/open3d/io/file_format/FileJSON.cpp index 6e1c0c8bbea..260971aaa44 100644 --- a/cpp/open3d/io/file_format/FileJSON.cpp +++ b/cpp/open3d/io/file_format/FileJSON.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileLOG.cpp b/cpp/open3d/io/file_format/FileLOG.cpp index 64748edcc60..daf20fb632a 100644 --- a/cpp/open3d/io/file_format/FileLOG.cpp +++ b/cpp/open3d/io/file_format/FileLOG.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileOBJ.cpp b/cpp/open3d/io/file_format/FileOBJ.cpp index a06b30a97fb..dfa715f860d 100644 --- a/cpp/open3d/io/file_format/FileOBJ.cpp +++ b/cpp/open3d/io/file_format/FileOBJ.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileOFF.cpp b/cpp/open3d/io/file_format/FileOFF.cpp index 080da77041b..a4716f86e40 100644 --- a/cpp/open3d/io/file_format/FileOFF.cpp +++ b/cpp/open3d/io/file_format/FileOFF.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FilePCD.cpp b/cpp/open3d/io/file_format/FilePCD.cpp index ce04f2e2d5b..76d0a008883 100644 --- a/cpp/open3d/io/file_format/FilePCD.cpp +++ b/cpp/open3d/io/file_format/FilePCD.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FilePLY.cpp b/cpp/open3d/io/file_format/FilePLY.cpp index fa4cd73b027..fc2d9212281 100644 --- a/cpp/open3d/io/file_format/FilePLY.cpp +++ b/cpp/open3d/io/file_format/FilePLY.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FilePNG.cpp b/cpp/open3d/io/file_format/FilePNG.cpp index 70832d8ee1e..975d1a3c68d 100644 --- a/cpp/open3d/io/file_format/FilePNG.cpp +++ b/cpp/open3d/io/file_format/FilePNG.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FilePTS.cpp b/cpp/open3d/io/file_format/FilePTS.cpp index 3773bd7fe5b..0d1f5545da2 100644 --- a/cpp/open3d/io/file_format/FilePTS.cpp +++ b/cpp/open3d/io/file_format/FilePTS.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileSTL.cpp b/cpp/open3d/io/file_format/FileSTL.cpp index ed73697c302..e8144414770 100644 --- a/cpp/open3d/io/file_format/FileSTL.cpp +++ b/cpp/open3d/io/file_format/FileSTL.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileTUM.cpp b/cpp/open3d/io/file_format/FileTUM.cpp index 53ba84fc650..f17bb1d25e6 100644 --- a/cpp/open3d/io/file_format/FileTUM.cpp +++ b/cpp/open3d/io/file_format/FileTUM.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileXYZ.cpp b/cpp/open3d/io/file_format/FileXYZ.cpp index ceaa00245f2..a20035c0cd9 100644 --- a/cpp/open3d/io/file_format/FileXYZ.cpp +++ b/cpp/open3d/io/file_format/FileXYZ.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileXYZN.cpp b/cpp/open3d/io/file_format/FileXYZN.cpp index 7dc92850982..a2579bddca2 100644 --- a/cpp/open3d/io/file_format/FileXYZN.cpp +++ b/cpp/open3d/io/file_format/FileXYZN.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/file_format/FileXYZRGB.cpp b/cpp/open3d/io/file_format/FileXYZRGB.cpp index 26a62fcd28f..7714574d44c 100644 --- a/cpp/open3d/io/file_format/FileXYZRGB.cpp +++ b/cpp/open3d/io/file_format/FileXYZRGB.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/BufferConnection.cpp b/cpp/open3d/io/rpc/BufferConnection.cpp index fcc5d29e2bd..2ea5b7da5d2 100644 --- a/cpp/open3d/io/rpc/BufferConnection.cpp +++ b/cpp/open3d/io/rpc/BufferConnection.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/BufferConnection.h b/cpp/open3d/io/rpc/BufferConnection.h index aacec80e928..0af6073c206 100644 --- a/cpp/open3d/io/rpc/BufferConnection.h +++ b/cpp/open3d/io/rpc/BufferConnection.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/Connection.cpp b/cpp/open3d/io/rpc/Connection.cpp index c0d80b4d9fe..f4446c85628 100644 --- a/cpp/open3d/io/rpc/Connection.cpp +++ b/cpp/open3d/io/rpc/Connection.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/Connection.h b/cpp/open3d/io/rpc/Connection.h index fb5fcd63bbe..20c2f4c9ef0 100644 --- a/cpp/open3d/io/rpc/Connection.h +++ b/cpp/open3d/io/rpc/Connection.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/ConnectionBase.h b/cpp/open3d/io/rpc/ConnectionBase.h index ed977410680..94d0d67b0b0 100644 --- a/cpp/open3d/io/rpc/ConnectionBase.h +++ b/cpp/open3d/io/rpc/ConnectionBase.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/DummyMessageProcessor.h b/cpp/open3d/io/rpc/DummyMessageProcessor.h index 55a8d71229e..f57a955b609 100644 --- a/cpp/open3d/io/rpc/DummyMessageProcessor.h +++ b/cpp/open3d/io/rpc/DummyMessageProcessor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/DummyReceiver.cpp b/cpp/open3d/io/rpc/DummyReceiver.cpp index ce10e6d94e8..785184ec147 100644 --- a/cpp/open3d/io/rpc/DummyReceiver.cpp +++ b/cpp/open3d/io/rpc/DummyReceiver.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/DummyReceiver.h b/cpp/open3d/io/rpc/DummyReceiver.h index c1a73f74730..71eef978b5b 100644 --- a/cpp/open3d/io/rpc/DummyReceiver.h +++ b/cpp/open3d/io/rpc/DummyReceiver.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/MessageProcessorBase.cpp b/cpp/open3d/io/rpc/MessageProcessorBase.cpp index 6bd8d3345b0..3097500ffa2 100644 --- a/cpp/open3d/io/rpc/MessageProcessorBase.cpp +++ b/cpp/open3d/io/rpc/MessageProcessorBase.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/MessageProcessorBase.h b/cpp/open3d/io/rpc/MessageProcessorBase.h index d0869b0252a..0bd332d6b3a 100644 --- a/cpp/open3d/io/rpc/MessageProcessorBase.h +++ b/cpp/open3d/io/rpc/MessageProcessorBase.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/MessageUtils.cpp b/cpp/open3d/io/rpc/MessageUtils.cpp index 10cb9375dfb..91cf8bf55a3 100644 --- a/cpp/open3d/io/rpc/MessageUtils.cpp +++ b/cpp/open3d/io/rpc/MessageUtils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/MessageUtils.h b/cpp/open3d/io/rpc/MessageUtils.h index 9c529fe3776..16a191a2636 100644 --- a/cpp/open3d/io/rpc/MessageUtils.h +++ b/cpp/open3d/io/rpc/MessageUtils.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/Messages.h b/cpp/open3d/io/rpc/Messages.h index 06f6c7fe933..674cc981089 100644 --- a/cpp/open3d/io/rpc/Messages.h +++ b/cpp/open3d/io/rpc/Messages.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/RemoteFunctions.cpp b/cpp/open3d/io/rpc/RemoteFunctions.cpp index 9fcf9805f70..ec6a6de8aef 100644 --- a/cpp/open3d/io/rpc/RemoteFunctions.cpp +++ b/cpp/open3d/io/rpc/RemoteFunctions.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/RemoteFunctions.h b/cpp/open3d/io/rpc/RemoteFunctions.h index cc75b3d9cac..f9e42fac280 100644 --- a/cpp/open3d/io/rpc/RemoteFunctions.h +++ b/cpp/open3d/io/rpc/RemoteFunctions.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/ZMQContext.cpp b/cpp/open3d/io/rpc/ZMQContext.cpp index 1d537b2ceb1..102d57f1875 100644 --- a/cpp/open3d/io/rpc/ZMQContext.cpp +++ b/cpp/open3d/io/rpc/ZMQContext.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/ZMQContext.h b/cpp/open3d/io/rpc/ZMQContext.h index 78b584dfbc1..9034b24eb32 100644 --- a/cpp/open3d/io/rpc/ZMQContext.h +++ b/cpp/open3d/io/rpc/ZMQContext.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/ZMQReceiver.cpp b/cpp/open3d/io/rpc/ZMQReceiver.cpp index 333c546bcd9..4f72310883c 100644 --- a/cpp/open3d/io/rpc/ZMQReceiver.cpp +++ b/cpp/open3d/io/rpc/ZMQReceiver.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/rpc/ZMQReceiver.h b/cpp/open3d/io/rpc/ZMQReceiver.h index f7f6d091f76..eb3bf21f54e 100644 --- a/cpp/open3d/io/rpc/ZMQReceiver.h +++ b/cpp/open3d/io/rpc/ZMQReceiver.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/RGBDRecorder.h b/cpp/open3d/io/sensor/RGBDRecorder.h index f13d6eb7546..e444d881dae 100644 --- a/cpp/open3d/io/sensor/RGBDRecorder.h +++ b/cpp/open3d/io/sensor/RGBDRecorder.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/RGBDSensor.h b/cpp/open3d/io/sensor/RGBDSensor.h index 977bdc03821..0119916828b 100644 --- a/cpp/open3d/io/sensor/RGBDSensor.h +++ b/cpp/open3d/io/sensor/RGBDSensor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/RGBDSensorConfig.h b/cpp/open3d/io/sensor/RGBDSensorConfig.h index 96e26b69f31..9b6f70e85cd 100644 --- a/cpp/open3d/io/sensor/RGBDSensorConfig.h +++ b/cpp/open3d/io/sensor/RGBDSensorConfig.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/AzureKinectRecorder.cpp b/cpp/open3d/io/sensor/azure_kinect/AzureKinectRecorder.cpp index 8c8a9f41571..0ff6ef1135b 100644 --- a/cpp/open3d/io/sensor/azure_kinect/AzureKinectRecorder.cpp +++ b/cpp/open3d/io/sensor/azure_kinect/AzureKinectRecorder.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/AzureKinectRecorder.h b/cpp/open3d/io/sensor/azure_kinect/AzureKinectRecorder.h index 0fecd26e0cb..7a973506503 100644 --- a/cpp/open3d/io/sensor/azure_kinect/AzureKinectRecorder.h +++ b/cpp/open3d/io/sensor/azure_kinect/AzureKinectRecorder.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensor.cpp b/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensor.cpp index 962113b2df3..92d06eac28a 100644 --- a/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensor.cpp +++ b/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensor.h b/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensor.h index eb795432860..2fadf38dbad 100644 --- a/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensor.h +++ b/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensorConfig.cpp b/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensorConfig.cpp index bb28b55def8..a2a8cf5ad89 100644 --- a/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensorConfig.cpp +++ b/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensorConfig.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensorConfig.h b/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensorConfig.h index 28dd15c90f7..6e4f7767ed3 100644 --- a/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensorConfig.h +++ b/cpp/open3d/io/sensor/azure_kinect/AzureKinectSensorConfig.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/K4aPlugin.cpp b/cpp/open3d/io/sensor/azure_kinect/K4aPlugin.cpp index 71b28bed59d..34b7e30ed19 100644 --- a/cpp/open3d/io/sensor/azure_kinect/K4aPlugin.cpp +++ b/cpp/open3d/io/sensor/azure_kinect/K4aPlugin.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/K4aPlugin.h b/cpp/open3d/io/sensor/azure_kinect/K4aPlugin.h index cd9a6eb1db1..9cece2de3ec 100644 --- a/cpp/open3d/io/sensor/azure_kinect/K4aPlugin.h +++ b/cpp/open3d/io/sensor/azure_kinect/K4aPlugin.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/MKVMetadata.cpp b/cpp/open3d/io/sensor/azure_kinect/MKVMetadata.cpp index c3b26726668..16ce06a0f87 100644 --- a/cpp/open3d/io/sensor/azure_kinect/MKVMetadata.cpp +++ b/cpp/open3d/io/sensor/azure_kinect/MKVMetadata.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/MKVMetadata.h b/cpp/open3d/io/sensor/azure_kinect/MKVMetadata.h index e74bc9fc8d0..02e2ed06a10 100644 --- a/cpp/open3d/io/sensor/azure_kinect/MKVMetadata.h +++ b/cpp/open3d/io/sensor/azure_kinect/MKVMetadata.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/MKVReader.cpp b/cpp/open3d/io/sensor/azure_kinect/MKVReader.cpp index 74dae9b5728..fe94cf65bf0 100644 --- a/cpp/open3d/io/sensor/azure_kinect/MKVReader.cpp +++ b/cpp/open3d/io/sensor/azure_kinect/MKVReader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/MKVReader.h b/cpp/open3d/io/sensor/azure_kinect/MKVReader.h index 14e5b25c2a4..0e86cf8aec6 100644 --- a/cpp/open3d/io/sensor/azure_kinect/MKVReader.h +++ b/cpp/open3d/io/sensor/azure_kinect/MKVReader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/MKVWriter.cpp b/cpp/open3d/io/sensor/azure_kinect/MKVWriter.cpp index 2546b6ea897..81864bc12b3 100644 --- a/cpp/open3d/io/sensor/azure_kinect/MKVWriter.cpp +++ b/cpp/open3d/io/sensor/azure_kinect/MKVWriter.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/MKVWriter.h b/cpp/open3d/io/sensor/azure_kinect/MKVWriter.h index f2ddcb17b50..961cf02989a 100644 --- a/cpp/open3d/io/sensor/azure_kinect/MKVWriter.h +++ b/cpp/open3d/io/sensor/azure_kinect/MKVWriter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/io/sensor/azure_kinect/PluginMacros.h b/cpp/open3d/io/sensor/azure_kinect/PluginMacros.h index be28bf4eaf3..3af24031819 100644 --- a/cpp/open3d/io/sensor/azure_kinect/PluginMacros.h +++ b/cpp/open3d/io/sensor/azure_kinect/PluginMacros.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/Helper.h b/cpp/open3d/ml/Helper.h index c305ca24e0e..4193cfac984 100644 --- a/cpp/open3d/ml/Helper.h +++ b/cpp/open3d/ml/Helper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/ShapeChecking.h b/cpp/open3d/ml/ShapeChecking.h index 8a2d643613f..c978b4af573 100644 --- a/cpp/open3d/ml/ShapeChecking.h +++ b/cpp/open3d/ml/ShapeChecking.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/contrib/BallQuery.cu b/cpp/open3d/ml/contrib/BallQuery.cu index cb315de98fe..c68877765f5 100644 --- a/cpp/open3d/ml/contrib/BallQuery.cu +++ b/cpp/open3d/ml/contrib/BallQuery.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/contrib/BallQuery.cuh b/cpp/open3d/ml/contrib/BallQuery.cuh index fb51fbf580b..67d2c48a242 100644 --- a/cpp/open3d/ml/contrib/BallQuery.cuh +++ b/cpp/open3d/ml/contrib/BallQuery.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/contrib/Cloud.cpp b/cpp/open3d/ml/contrib/Cloud.cpp index a7d1acb730a..576927fe232 100644 --- a/cpp/open3d/ml/contrib/Cloud.cpp +++ b/cpp/open3d/ml/contrib/Cloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Source code from: https://github.com/HuguesTHOMAS/KPConv. diff --git a/cpp/open3d/ml/contrib/Cloud.h b/cpp/open3d/ml/contrib/Cloud.h index 017b0daa3cd..ca13718e064 100644 --- a/cpp/open3d/ml/contrib/Cloud.h +++ b/cpp/open3d/ml/contrib/Cloud.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Source code from: https://github.com/HuguesTHOMAS/KPConv. diff --git a/cpp/open3d/ml/contrib/GridSubsampling.cpp b/cpp/open3d/ml/contrib/GridSubsampling.cpp index cc845211ebb..7b74d9a44e1 100644 --- a/cpp/open3d/ml/contrib/GridSubsampling.cpp +++ b/cpp/open3d/ml/contrib/GridSubsampling.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Source code from: https://github.com/HuguesTHOMAS/KPConv. diff --git a/cpp/open3d/ml/contrib/GridSubsampling.h b/cpp/open3d/ml/contrib/GridSubsampling.h index 09c62805d89..7c484fddca1 100644 --- a/cpp/open3d/ml/contrib/GridSubsampling.h +++ b/cpp/open3d/ml/contrib/GridSubsampling.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Source code from: https://github.com/HuguesTHOMAS/KPConv. diff --git a/cpp/open3d/ml/contrib/InterpolatePoints.cu b/cpp/open3d/ml/contrib/InterpolatePoints.cu index b55991366ba..12417e39037 100644 --- a/cpp/open3d/ml/contrib/InterpolatePoints.cu +++ b/cpp/open3d/ml/contrib/InterpolatePoints.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/contrib/InterpolatePoints.cuh b/cpp/open3d/ml/contrib/InterpolatePoints.cuh index 694d57a53bb..ab18c4cfbd5 100644 --- a/cpp/open3d/ml/contrib/InterpolatePoints.cuh +++ b/cpp/open3d/ml/contrib/InterpolatePoints.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/contrib/IoU.cpp b/cpp/open3d/ml/contrib/IoU.cpp index 8ce9088df51..4abd32ceb6c 100644 --- a/cpp/open3d/ml/contrib/IoU.cpp +++ b/cpp/open3d/ml/contrib/IoU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/contrib/IoU.cu b/cpp/open3d/ml/contrib/IoU.cu index 48d594b6a0b..5c11ed9dc19 100644 --- a/cpp/open3d/ml/contrib/IoU.cu +++ b/cpp/open3d/ml/contrib/IoU.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/contrib/IoU.h b/cpp/open3d/ml/contrib/IoU.h index df2cbcec9e8..f97ea34003e 100644 --- a/cpp/open3d/ml/contrib/IoU.h +++ b/cpp/open3d/ml/contrib/IoU.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/contrib/IoUImpl.h b/cpp/open3d/ml/contrib/IoUImpl.h index 80741309515..6a2d90b4f8a 100644 --- a/cpp/open3d/ml/contrib/IoUImpl.h +++ b/cpp/open3d/ml/contrib/IoUImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/contrib/Nms.cpp b/cpp/open3d/ml/contrib/Nms.cpp index c1ff5e3b9ca..94a35874e36 100644 --- a/cpp/open3d/ml/contrib/Nms.cpp +++ b/cpp/open3d/ml/contrib/Nms.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/contrib/Nms.cu b/cpp/open3d/ml/contrib/Nms.cu index 3f3c52a1d90..5acdb949cd7 100644 --- a/cpp/open3d/ml/contrib/Nms.cu +++ b/cpp/open3d/ml/contrib/Nms.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/contrib/Nms.h b/cpp/open3d/ml/contrib/Nms.h index 914289ff82d..c7a2f84e452 100644 --- a/cpp/open3d/ml/contrib/Nms.h +++ b/cpp/open3d/ml/contrib/Nms.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/contrib/PointSampling.cuh b/cpp/open3d/ml/contrib/PointSampling.cuh index d17f3501b58..88e525aeb88 100644 --- a/cpp/open3d/ml/contrib/PointSampling.cuh +++ b/cpp/open3d/ml/contrib/PointSampling.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/contrib/RoiPoolKernel.cu b/cpp/open3d/ml/contrib/RoiPoolKernel.cu index 7b633070034..208772851c9 100644 --- a/cpp/open3d/ml/contrib/RoiPoolKernel.cu +++ b/cpp/open3d/ml/contrib/RoiPoolKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/contrib/RoiPoolKernel.h b/cpp/open3d/ml/contrib/RoiPoolKernel.h index 123d31a13cb..393150a5cc1 100644 --- a/cpp/open3d/ml/contrib/RoiPoolKernel.h +++ b/cpp/open3d/ml/contrib/RoiPoolKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/contrib/TrilinearDevoxelize.cu b/cpp/open3d/ml/contrib/TrilinearDevoxelize.cu index 0cc1dff271b..abe9c4b8593 100644 --- a/cpp/open3d/ml/contrib/TrilinearDevoxelize.cu +++ b/cpp/open3d/ml/contrib/TrilinearDevoxelize.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/contrib/TrilinearDevoxelize.cuh b/cpp/open3d/ml/contrib/TrilinearDevoxelize.cuh index bb3fc8d7ea7..093caf84e5a 100644 --- a/cpp/open3d/ml/contrib/TrilinearDevoxelize.cuh +++ b/cpp/open3d/ml/contrib/TrilinearDevoxelize.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/contrib/cuda_utils.h b/cpp/open3d/ml/contrib/cuda_utils.h index e7069c79a00..63b7ee40818 100644 --- a/cpp/open3d/ml/contrib/cuda_utils.h +++ b/cpp/open3d/ml/contrib/cuda_utils.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/impl/continuous_conv/ContinuousConv.cuh b/cpp/open3d/ml/impl/continuous_conv/ContinuousConv.cuh index 42025064423..322b38180ff 100644 --- a/cpp/open3d/ml/impl/continuous_conv/ContinuousConv.cuh +++ b/cpp/open3d/ml/impl/continuous_conv/ContinuousConv.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/continuous_conv/ContinuousConv.h b/cpp/open3d/ml/impl/continuous_conv/ContinuousConv.h index eef2f4e702e..570cdd84730 100644 --- a/cpp/open3d/ml/impl/continuous_conv/ContinuousConv.h +++ b/cpp/open3d/ml/impl/continuous_conv/ContinuousConv.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvBackpropFilter.cuh b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvBackpropFilter.cuh index c40ae43874e..ef03b9f0540 100644 --- a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvBackpropFilter.cuh +++ b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvBackpropFilter.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvBackpropFilter.h b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvBackpropFilter.h index b9b37e9410c..b75089cd889 100644 --- a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvBackpropFilter.h +++ b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvBackpropFilter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvCUDAKernels.cu b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvCUDAKernels.cu index 9b0498a70b2..218e4c2b6e4 100644 --- a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvCUDAKernels.cu +++ b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvCUDAKernels.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvCUDAKernels.h b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvCUDAKernels.h index 4013d093022..8cf1fb14417 100644 --- a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvCUDAKernels.h +++ b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvCUDAKernels.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTranspose.cuh b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTranspose.cuh index 1c362eb8a2f..29d8aba31e3 100644 --- a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTranspose.cuh +++ b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTranspose.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTranspose.h b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTranspose.h index 960800e7980..1a19cdc4034 100644 --- a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTranspose.h +++ b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTranspose.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTransposeBackpropFilter.cuh b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTransposeBackpropFilter.cuh index 8d06fe9284a..2c1dc7a1680 100644 --- a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTransposeBackpropFilter.cuh +++ b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTransposeBackpropFilter.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTransposeBackpropFilter.h b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTransposeBackpropFilter.h index 251f59cdf18..296850f24a2 100644 --- a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTransposeBackpropFilter.h +++ b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTransposeBackpropFilter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTypes.h b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTypes.h index 13919c7d2f4..d758d134443 100644 --- a/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTypes.h +++ b/cpp/open3d/ml/impl/continuous_conv/ContinuousConvTypes.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/continuous_conv/CoordinateTransformation.cuh b/cpp/open3d/ml/impl/continuous_conv/CoordinateTransformation.cuh index 672b349a1f5..a56b73ee8ee 100644 --- a/cpp/open3d/ml/impl/continuous_conv/CoordinateTransformation.cuh +++ b/cpp/open3d/ml/impl/continuous_conv/CoordinateTransformation.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/continuous_conv/CoordinateTransformation.h b/cpp/open3d/ml/impl/continuous_conv/CoordinateTransformation.h index a7d0eec37f2..ca3670774f8 100644 --- a/cpp/open3d/ml/impl/continuous_conv/CoordinateTransformation.h +++ b/cpp/open3d/ml/impl/continuous_conv/CoordinateTransformation.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/misc/InvertNeighborsList.cuh b/cpp/open3d/ml/impl/misc/InvertNeighborsList.cuh index b94a454b62a..20123b4375f 100644 --- a/cpp/open3d/ml/impl/misc/InvertNeighborsList.cuh +++ b/cpp/open3d/ml/impl/misc/InvertNeighborsList.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/misc/InvertNeighborsList.h b/cpp/open3d/ml/impl/misc/InvertNeighborsList.h index 212fedfbae6..0715c744c74 100644 --- a/cpp/open3d/ml/impl/misc/InvertNeighborsList.h +++ b/cpp/open3d/ml/impl/misc/InvertNeighborsList.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/misc/MemoryAllocation.h b/cpp/open3d/ml/impl/misc/MemoryAllocation.h index 2d240da4ac6..5ec00e0e600 100644 --- a/cpp/open3d/ml/impl/misc/MemoryAllocation.h +++ b/cpp/open3d/ml/impl/misc/MemoryAllocation.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/misc/NeighborSearchCommon.h b/cpp/open3d/ml/impl/misc/NeighborSearchCommon.h index c93cce0d151..4f1d1b740b8 100644 --- a/cpp/open3d/ml/impl/misc/NeighborSearchCommon.h +++ b/cpp/open3d/ml/impl/misc/NeighborSearchCommon.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/misc/RaggedToDense.cuh b/cpp/open3d/ml/impl/misc/RaggedToDense.cuh index 4cf30555f0f..95abffe2b4b 100644 --- a/cpp/open3d/ml/impl/misc/RaggedToDense.cuh +++ b/cpp/open3d/ml/impl/misc/RaggedToDense.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/misc/RaggedToDense.h b/cpp/open3d/ml/impl/misc/RaggedToDense.h index 5fcccfb87ef..5c3be2a1f0c 100644 --- a/cpp/open3d/ml/impl/misc/RaggedToDense.h +++ b/cpp/open3d/ml/impl/misc/RaggedToDense.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/misc/ReduceSubarraysSum.cuh b/cpp/open3d/ml/impl/misc/ReduceSubarraysSum.cuh index fafff52641f..ac901660206 100644 --- a/cpp/open3d/ml/impl/misc/ReduceSubarraysSum.cuh +++ b/cpp/open3d/ml/impl/misc/ReduceSubarraysSum.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/misc/ReduceSubarraysSum.h b/cpp/open3d/ml/impl/misc/ReduceSubarraysSum.h index d268692b63e..b51a3e14c46 100644 --- a/cpp/open3d/ml/impl/misc/ReduceSubarraysSum.h +++ b/cpp/open3d/ml/impl/misc/ReduceSubarraysSum.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/misc/VoxelPooling.h b/cpp/open3d/ml/impl/misc/VoxelPooling.h index bd8f73d8990..4da3da4d002 100644 --- a/cpp/open3d/ml/impl/misc/VoxelPooling.h +++ b/cpp/open3d/ml/impl/misc/VoxelPooling.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/misc/Voxelize.cuh b/cpp/open3d/ml/impl/misc/Voxelize.cuh index e7b50cd7f6e..2258175cf84 100644 --- a/cpp/open3d/ml/impl/misc/Voxelize.cuh +++ b/cpp/open3d/ml/impl/misc/Voxelize.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/misc/Voxelize.h b/cpp/open3d/ml/impl/misc/Voxelize.h index 36814c5db55..c02fb0f7779 100644 --- a/cpp/open3d/ml/impl/misc/Voxelize.h +++ b/cpp/open3d/ml/impl/misc/Voxelize.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/sparse_conv/SparseConv.cuh b/cpp/open3d/ml/impl/sparse_conv/SparseConv.cuh index 16df749064f..3bbc297db24 100644 --- a/cpp/open3d/ml/impl/sparse_conv/SparseConv.cuh +++ b/cpp/open3d/ml/impl/sparse_conv/SparseConv.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/sparse_conv/SparseConv.h b/cpp/open3d/ml/impl/sparse_conv/SparseConv.h index 50fa3e098b2..d8b59a51a43 100644 --- a/cpp/open3d/ml/impl/sparse_conv/SparseConv.h +++ b/cpp/open3d/ml/impl/sparse_conv/SparseConv.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/sparse_conv/SparseConvBackpropFilter.cuh b/cpp/open3d/ml/impl/sparse_conv/SparseConvBackpropFilter.cuh index 0e151f8c58e..5dc0e6973cb 100644 --- a/cpp/open3d/ml/impl/sparse_conv/SparseConvBackpropFilter.cuh +++ b/cpp/open3d/ml/impl/sparse_conv/SparseConvBackpropFilter.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/sparse_conv/SparseConvBackpropFilter.h b/cpp/open3d/ml/impl/sparse_conv/SparseConvBackpropFilter.h index 67a2712f556..38c44a5d2c1 100644 --- a/cpp/open3d/ml/impl/sparse_conv/SparseConvBackpropFilter.h +++ b/cpp/open3d/ml/impl/sparse_conv/SparseConvBackpropFilter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/sparse_conv/SparseConvCUDAKernels.cu b/cpp/open3d/ml/impl/sparse_conv/SparseConvCUDAKernels.cu index c111a38502f..87d11ba3a3a 100644 --- a/cpp/open3d/ml/impl/sparse_conv/SparseConvCUDAKernels.cu +++ b/cpp/open3d/ml/impl/sparse_conv/SparseConvCUDAKernels.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/sparse_conv/SparseConvCUDAKernels.h b/cpp/open3d/ml/impl/sparse_conv/SparseConvCUDAKernels.h index 887e6a21a5b..cf1c4749f9c 100644 --- a/cpp/open3d/ml/impl/sparse_conv/SparseConvCUDAKernels.h +++ b/cpp/open3d/ml/impl/sparse_conv/SparseConvCUDAKernels.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/sparse_conv/SparseConvTranspose.cuh b/cpp/open3d/ml/impl/sparse_conv/SparseConvTranspose.cuh index f5946ff248b..efd0a51152a 100644 --- a/cpp/open3d/ml/impl/sparse_conv/SparseConvTranspose.cuh +++ b/cpp/open3d/ml/impl/sparse_conv/SparseConvTranspose.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/sparse_conv/SparseConvTranspose.h b/cpp/open3d/ml/impl/sparse_conv/SparseConvTranspose.h index 641ad132a4f..5a8eb5be3ef 100644 --- a/cpp/open3d/ml/impl/sparse_conv/SparseConvTranspose.h +++ b/cpp/open3d/ml/impl/sparse_conv/SparseConvTranspose.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/sparse_conv/SparseConvTransposeBackpropFilter.cuh b/cpp/open3d/ml/impl/sparse_conv/SparseConvTransposeBackpropFilter.cuh index bb628b60764..3c6f546a079 100644 --- a/cpp/open3d/ml/impl/sparse_conv/SparseConvTransposeBackpropFilter.cuh +++ b/cpp/open3d/ml/impl/sparse_conv/SparseConvTransposeBackpropFilter.cuh @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/impl/sparse_conv/SparseConvTransposeBackpropFilter.h b/cpp/open3d/ml/impl/sparse_conv/SparseConvTransposeBackpropFilter.h index d6559844c0b..48ef0e4f334 100644 --- a/cpp/open3d/ml/impl/sparse_conv/SparseConvTransposeBackpropFilter.h +++ b/cpp/open3d/ml/impl/sparse_conv/SparseConvTransposeBackpropFilter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/paddle/PaddleHelper.cpp b/cpp/open3d/ml/paddle/PaddleHelper.cpp index 085563185ab..f67baf2c497 100644 --- a/cpp/open3d/ml/paddle/PaddleHelper.cpp +++ b/cpp/open3d/ml/paddle/PaddleHelper.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/paddle/PaddleHelper.h b/cpp/open3d/ml/paddle/PaddleHelper.h index 7b4a4d1f98a..17f86e21e4d 100644 --- a/cpp/open3d/ml/paddle/PaddleHelper.h +++ b/cpp/open3d/ml/paddle/PaddleHelper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp index f9c4ea79d42..8387331742c 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu index 839a7ba327d..016b1567fac 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.h b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.h index 5dd79cb88f0..c92ff9bd2bc 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.h +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvBackpropFilterOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvHelper.h b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvHelper.h index 32f65fbd38e..f7628047382 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvHelper.h +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvHelper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cpp b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cpp index 24a30deeacb..8fc0409e637 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cpp +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cu b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cu index 4412845c45b..d2a3f38ff73 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cu +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.h b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.h index da95fb6d9a8..b26e628e7e6 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.h +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOps.cpp b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOps.cpp index ba750abc3ab..677086e6038 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOps.cpp +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp index 26679fa703c..d977a013c51 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu index 5a44e449025..e500e0bb421 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h index 25c54049678..e8b935c7365 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cpp b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cpp index 5d5c09c986c..a1d84596636 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cpp +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cu b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cu index 1cf71071b29..839b566b740 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cu +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.h b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.h index 76ba572b7e4..df2bf86848a 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.h +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOps.cpp b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOps.cpp index 913a41a67a2..ca438b39b90 100644 --- a/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOps.cpp +++ b/cpp/open3d/ml/paddle/continuous_conv/ContinuousConvTransposeOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cpp b/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cpp index 2bce9fed246..bcb6d42a41e 100644 --- a/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cpp +++ b/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cu b/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cu index daab5ad386a..061fcc68b1e 100644 --- a/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cu +++ b/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOps.cpp b/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOps.cpp index 1c23450c992..a0f49e6a442 100644 --- a/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOps.cpp +++ b/cpp/open3d/ml/paddle/misc/BuildSpatialHashTableOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cpp b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cpp index bcff66b795f..c48003d7891 100644 --- a/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cpp +++ b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu index 59c4d497363..889ef81389f 100644 --- a/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu +++ b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOps.cpp b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOps.cpp index af368fdbc40..26feb76bd4e 100644 --- a/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOps.cpp +++ b/cpp/open3d/ml/paddle/misc/FixedRadiusSearchOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cpp b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cpp index a9c4087e77d..597167f0cb6 100644 --- a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cpp +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu index 37df0de3128..dc4b13589e2 100644 --- a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.h b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.h index bf984eb2778..f97500abc55 100644 --- a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.h +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp index 7832c98fedb..2fb3967d8fe 100644 --- a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h index e8c39f8036c..d9ecb757007 100644 --- a/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h +++ b/cpp/open3d/ml/paddle/misc/InvertNeighborsListOps.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/KnnSearchOpKernel.cpp b/cpp/open3d/ml/paddle/misc/KnnSearchOpKernel.cpp index 8ba33b6a57b..ebc90a07a5e 100644 --- a/cpp/open3d/ml/paddle/misc/KnnSearchOpKernel.cpp +++ b/cpp/open3d/ml/paddle/misc/KnnSearchOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/KnnSearchOps.cpp b/cpp/open3d/ml/paddle/misc/KnnSearchOps.cpp index 99d0065a273..e1d9f143253 100644 --- a/cpp/open3d/ml/paddle/misc/KnnSearchOps.cpp +++ b/cpp/open3d/ml/paddle/misc/KnnSearchOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/NeighborSearchAllocator.h b/cpp/open3d/ml/paddle/misc/NeighborSearchAllocator.h index a308fb2770c..05f631ba56e 100644 --- a/cpp/open3d/ml/paddle/misc/NeighborSearchAllocator.h +++ b/cpp/open3d/ml/paddle/misc/NeighborSearchAllocator.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/NmsOps.cpp b/cpp/open3d/ml/paddle/misc/NmsOps.cpp index 9e5342e6a7d..432853e8b7a 100644 --- a/cpp/open3d/ml/paddle/misc/NmsOps.cpp +++ b/cpp/open3d/ml/paddle/misc/NmsOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/paddle/misc/RadiusSearchOpKernel.cpp b/cpp/open3d/ml/paddle/misc/RadiusSearchOpKernel.cpp index 559f0efd8e6..be25cb4c847 100644 --- a/cpp/open3d/ml/paddle/misc/RadiusSearchOpKernel.cpp +++ b/cpp/open3d/ml/paddle/misc/RadiusSearchOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/RadiusSearchOps.cpp b/cpp/open3d/ml/paddle/misc/RadiusSearchOps.cpp index 72aa838f98f..4f48057422c 100644 --- a/cpp/open3d/ml/paddle/misc/RadiusSearchOps.cpp +++ b/cpp/open3d/ml/paddle/misc/RadiusSearchOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cpp b/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cpp index 52ed6853d0c..64fec24034a 100644 --- a/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cpp +++ b/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cu b/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cu index e975fef2050..ae3677bf035 100644 --- a/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cu +++ b/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.h b/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.h index 2ae3ff59cf9..1834c710979 100644 --- a/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.h +++ b/cpp/open3d/ml/paddle/misc/RaggedToDenseOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/RaggedToDenseOps.cpp b/cpp/open3d/ml/paddle/misc/RaggedToDenseOps.cpp index d8cf6b46469..60ea9885dd2 100644 --- a/cpp/open3d/ml/paddle/misc/RaggedToDenseOps.cpp +++ b/cpp/open3d/ml/paddle/misc/RaggedToDenseOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cpp b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cpp index 7a25c8da636..8e74c82bceb 100644 --- a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cpp +++ b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cu b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cu index d50ed60deb2..9acedbf04f8 100644 --- a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cu +++ b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.h b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.h index bfdebbcb7cf..a66b260a6b5 100644 --- a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.h +++ b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.cpp b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.cpp index 1e0fb060978..c55db9217ba 100644 --- a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.cpp +++ b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.h b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.h index 6eddb171465..a3336a1011c 100644 --- a/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.h +++ b/cpp/open3d/ml/paddle/misc/ReduceSubarraysSumOps.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/RoiPoolOps.cpp b/cpp/open3d/ml/paddle/misc/RoiPoolOps.cpp index a00db88b5ea..52550054512 100644 --- a/cpp/open3d/ml/paddle/misc/RoiPoolOps.cpp +++ b/cpp/open3d/ml/paddle/misc/RoiPoolOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp b/cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp index ddf4207d66b..230a459e340 100644 --- a/cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp +++ b/cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/VoxelPoolingOps.cpp b/cpp/open3d/ml/paddle/misc/VoxelPoolingOps.cpp index bc5ec64017a..d2c4f8c127f 100644 --- a/cpp/open3d/ml/paddle/misc/VoxelPoolingOps.cpp +++ b/cpp/open3d/ml/paddle/misc/VoxelPoolingOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cpp b/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cpp index bbd3d6671c1..67f349bee1a 100644 --- a/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cpp +++ b/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cu b/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cu index 60936a257de..712d78ada1b 100644 --- a/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cu +++ b/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.h b/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.h index 9481a8c8859..f9f4e3a0aa7 100644 --- a/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.h +++ b/cpp/open3d/ml/paddle/misc/VoxelizeOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/misc/VoxelizeOps.cpp b/cpp/open3d/ml/paddle/misc/VoxelizeOps.cpp index cb93e366038..100d829be42 100644 --- a/cpp/open3d/ml/paddle/misc/VoxelizeOps.cpp +++ b/cpp/open3d/ml/paddle/misc/VoxelizeOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.cu b/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.cu index 9ce46b20f67..604b4d1bac3 100644 --- a/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.cu +++ b/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.h b/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.h index fe145e216ec..e27fa600639 100644 --- a/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.h +++ b/cpp/open3d/ml/paddle/pointnet/BallQueryKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/paddle/pointnet/BallQueryOps.cpp b/cpp/open3d/ml/paddle/pointnet/BallQueryOps.cpp index 87b3ef7e16f..0554d779dfd 100644 --- a/cpp/open3d/ml/paddle/pointnet/BallQueryOps.cpp +++ b/cpp/open3d/ml/paddle/pointnet/BallQueryOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.cu b/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.cu index 7697f0c8742..eb6d7d60de6 100644 --- a/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.cu +++ b/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.h b/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.h index 4daa872af2c..bb9e6a639a4 100644 --- a/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.h +++ b/cpp/open3d/ml/paddle/pointnet/InterpolateKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/paddle/pointnet/InterpolateOps.cpp b/cpp/open3d/ml/paddle/pointnet/InterpolateOps.cpp index 63ac08056c7..e812dedbba0 100644 --- a/cpp/open3d/ml/paddle/pointnet/InterpolateOps.cpp +++ b/cpp/open3d/ml/paddle/pointnet/InterpolateOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/paddle/pointnet/SamplingKernel.cu b/cpp/open3d/ml/paddle/pointnet/SamplingKernel.cu index ff87b57d3ed..60b66838f75 100644 --- a/cpp/open3d/ml/paddle/pointnet/SamplingKernel.cu +++ b/cpp/open3d/ml/paddle/pointnet/SamplingKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/paddle/pointnet/SamplingKernel.h b/cpp/open3d/ml/paddle/pointnet/SamplingKernel.h index f04fad8835e..5baa9e0be62 100644 --- a/cpp/open3d/ml/paddle/pointnet/SamplingKernel.h +++ b/cpp/open3d/ml/paddle/pointnet/SamplingKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/paddle/pointnet/SamplingOps.cpp b/cpp/open3d/ml/paddle/pointnet/SamplingOps.cpp index 6f541d72372..a6d944c5151 100644 --- a/cpp/open3d/ml/paddle/pointnet/SamplingOps.cpp +++ b/cpp/open3d/ml/paddle/pointnet/SamplingOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cpp b/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cpp index e37fbb61d79..bbfcf91ad1b 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cpp +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cu b/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cu index 237fa8242de..ab2eb18a7de 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cu +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.h b/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.h index 82bd824aafa..0f166227eb4 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.h +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvBackpropFilterOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cpp b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cpp index f55939be66e..06f9850361d 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cpp +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cu b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cu index 95a52683887..545969f54c1 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cu +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.h b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.h index 942ce8bc89c..95578e74dec 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.h +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvOps.cpp b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOps.cpp index 5f6f3a95c05..55d01bc871d 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvOps.cpp +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp index 1aa89df8a61..5c063d23ad9 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu index b065449804e..b2bed16dc21 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h index 2a5a6f66848..d9c8eae2d2a 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cpp b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cpp index 2eb0851d21f..a517ed5af53 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cpp +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cu b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cu index 2b1151c3e5c..5df7ddc7520 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cu +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.h b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.h index 8bc41db3124..51507320107 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.h +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOps.cpp b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOps.cpp index b4680bea6c6..490b7b9a76c 100644 --- a/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOps.cpp +++ b/cpp/open3d/ml/paddle/sparse_conv/SparseConvTransposeOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/TorchHelper.h b/cpp/open3d/ml/pytorch/TorchHelper.h index 22f9ed8cd2f..c4de5d5d74e 100644 --- a/cpp/open3d/ml/pytorch/TorchHelper.h +++ b/cpp/open3d/ml/pytorch/TorchHelper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp index 1e4e754f700..584ff5bb589 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu index 83072ce76b6..b4bb6719999 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvBackpropFilterOpKernel.h b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvBackpropFilterOpKernel.h index 9c4b7a6f6dc..976d6e9181e 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvBackpropFilterOpKernel.h +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvBackpropFilterOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvHelper.h b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvHelper.h index adb4cbd5c6f..b96dcaee219 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvHelper.h +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvHelper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOpKernel.cpp b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOpKernel.cpp index 8cb0c201495..fbd76a4bb61 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOpKernel.cu b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOpKernel.cu index 4f8f19143b5..7b7949b7def 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOpKernel.cu +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOpKernel.h b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOpKernel.h index 376fda0a145..e547bc6a365 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOpKernel.h +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOps.cpp b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOps.cpp index e7e662c34c0..8f992b1c49a 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOps.cpp +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp index 2420b302df9..e91ca4a51e6 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu index 6ea1d2ed3d5..d70f22a680a 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h index 06db6cb4067..1d7188ba812 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOpKernel.cpp b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOpKernel.cpp index d7ecffea16a..134e14b8eb5 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOpKernel.cu b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOpKernel.cu index bc9e66c89f7..d190c584791 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOpKernel.cu +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOpKernel.h b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOpKernel.h index 28d8d7400e4..3749d2856ae 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOpKernel.h +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOps.cpp b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOps.cpp index 78c6ae19f77..55338b2fadf 100644 --- a/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOps.cpp +++ b/cpp/open3d/ml/pytorch/continuous_conv/ContinuousConvTransposeOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOpKernel.cpp b/cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOpKernel.cpp index 3ed9233edf4..78c53314899 100644 --- a/cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOpKernel.cu b/cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOpKernel.cu index bdad3726177..23c95d3088f 100644 --- a/cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOpKernel.cu +++ b/cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOps.cpp b/cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOps.cpp index 49a5b8e32a6..02683a68203 100644 --- a/cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOps.cpp +++ b/cpp/open3d/ml/pytorch/misc/BuildSpatialHashTableOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOpKernel.cpp b/cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOpKernel.cpp index 679036e8c1c..6019ad3a1fb 100644 --- a/cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOpKernel.cu b/cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOpKernel.cu index 0088897be67..1e5f12b532d 100644 --- a/cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOpKernel.cu +++ b/cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOps.cpp b/cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOps.cpp index 289c52687e8..4b517ec9f0c 100644 --- a/cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOps.cpp +++ b/cpp/open3d/ml/pytorch/misc/FixedRadiusSearchOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.cpp b/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.cpp index ca460507223..134f9eeb0f1 100644 --- a/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.cu b/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.cu index c5257ba2db9..6f66561869a 100644 --- a/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.cu +++ b/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.h b/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.h index 28fb53ed469..499bf8b193b 100644 --- a/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.h +++ b/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOps.cpp b/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOps.cpp index 4389447a571..247e2b3ecc1 100644 --- a/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOps.cpp +++ b/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOps.h b/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOps.h index 738fd455dc9..d61502c7fc1 100644 --- a/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOps.h +++ b/cpp/open3d/ml/pytorch/misc/InvertNeighborsListOps.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/KnnSearchOpKernel.cpp b/cpp/open3d/ml/pytorch/misc/KnnSearchOpKernel.cpp index 7ecd8039a50..d78cc1845a3 100644 --- a/cpp/open3d/ml/pytorch/misc/KnnSearchOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/misc/KnnSearchOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/KnnSearchOps.cpp b/cpp/open3d/ml/pytorch/misc/KnnSearchOps.cpp index 295f8551bde..48bed5ccc8e 100644 --- a/cpp/open3d/ml/pytorch/misc/KnnSearchOps.cpp +++ b/cpp/open3d/ml/pytorch/misc/KnnSearchOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/NeighborSearchAllocator.h b/cpp/open3d/ml/pytorch/misc/NeighborSearchAllocator.h index f1666338411..611e8003031 100644 --- a/cpp/open3d/ml/pytorch/misc/NeighborSearchAllocator.h +++ b/cpp/open3d/ml/pytorch/misc/NeighborSearchAllocator.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/NmsOps.cpp b/cpp/open3d/ml/pytorch/misc/NmsOps.cpp index c1427b09cd0..9c7a29f6ffb 100644 --- a/cpp/open3d/ml/pytorch/misc/NmsOps.cpp +++ b/cpp/open3d/ml/pytorch/misc/NmsOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/pytorch/misc/RadiusSearchOpKernel.cpp b/cpp/open3d/ml/pytorch/misc/RadiusSearchOpKernel.cpp index 5a40fb45730..5796b30daac 100644 --- a/cpp/open3d/ml/pytorch/misc/RadiusSearchOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/misc/RadiusSearchOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/RadiusSearchOps.cpp b/cpp/open3d/ml/pytorch/misc/RadiusSearchOps.cpp index 173cb982608..b99c740b1cc 100644 --- a/cpp/open3d/ml/pytorch/misc/RadiusSearchOps.cpp +++ b/cpp/open3d/ml/pytorch/misc/RadiusSearchOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.cpp b/cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.cpp index b2ade4863a9..6ac67dbb56b 100644 --- a/cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.cu b/cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.cu index 878bfccf2bf..aaf26a9efa6 100644 --- a/cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.cu +++ b/cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.h b/cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.h index 1d106b5b945..17f75ba89b8 100644 --- a/cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.h +++ b/cpp/open3d/ml/pytorch/misc/RaggedToDenseOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/RaggedToDenseOps.cpp b/cpp/open3d/ml/pytorch/misc/RaggedToDenseOps.cpp index 349e17f41e3..444362c4e26 100644 --- a/cpp/open3d/ml/pytorch/misc/RaggedToDenseOps.cpp +++ b/cpp/open3d/ml/pytorch/misc/RaggedToDenseOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.cpp b/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.cpp index 0aceb671fe7..6f63c583fc9 100644 --- a/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.cu b/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.cu index d1daa755728..6a4c5ee9438 100644 --- a/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.cu +++ b/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.h b/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.h index 4a5d259eb1c..ad5a35af778 100644 --- a/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.h +++ b/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOps.cpp b/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOps.cpp index 420367397cc..445ee943a4d 100644 --- a/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOps.cpp +++ b/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOps.h b/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOps.h index 75333d48aeb..54ea8813b3a 100644 --- a/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOps.h +++ b/cpp/open3d/ml/pytorch/misc/ReduceSubarraysSumOps.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/RoiPoolOps.cpp b/cpp/open3d/ml/pytorch/misc/RoiPoolOps.cpp index 6f4ffc0ea09..f2d37021e0a 100644 --- a/cpp/open3d/ml/pytorch/misc/RoiPoolOps.cpp +++ b/cpp/open3d/ml/pytorch/misc/RoiPoolOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/pytorch/misc/VoxelPoolingOpKernel.cpp b/cpp/open3d/ml/pytorch/misc/VoxelPoolingOpKernel.cpp index 52ec16364d9..4eb12beb966 100644 --- a/cpp/open3d/ml/pytorch/misc/VoxelPoolingOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/misc/VoxelPoolingOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/VoxelPoolingOps.cpp b/cpp/open3d/ml/pytorch/misc/VoxelPoolingOps.cpp index 5c4e86b3704..d294229a2ed 100644 --- a/cpp/open3d/ml/pytorch/misc/VoxelPoolingOps.cpp +++ b/cpp/open3d/ml/pytorch/misc/VoxelPoolingOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.cpp b/cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.cpp index 947d3e133de..431209a26d4 100644 --- a/cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.cu b/cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.cu index a704ad30d0a..ec7baf67c1a 100644 --- a/cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.cu +++ b/cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.h b/cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.h index c2668fb4de4..a09eecc8ad0 100644 --- a/cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.h +++ b/cpp/open3d/ml/pytorch/misc/VoxelizeOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/misc/VoxelizeOps.cpp b/cpp/open3d/ml/pytorch/misc/VoxelizeOps.cpp index 87e7b71c72c..ef13d7b9084 100644 --- a/cpp/open3d/ml/pytorch/misc/VoxelizeOps.cpp +++ b/cpp/open3d/ml/pytorch/misc/VoxelizeOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/pointnet/BallQueryKernel.cu b/cpp/open3d/ml/pytorch/pointnet/BallQueryKernel.cu index adbafde2dc2..37ae7b118c0 100644 --- a/cpp/open3d/ml/pytorch/pointnet/BallQueryKernel.cu +++ b/cpp/open3d/ml/pytorch/pointnet/BallQueryKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/pytorch/pointnet/BallQueryKernel.h b/cpp/open3d/ml/pytorch/pointnet/BallQueryKernel.h index 9af88c3cc0e..281e7fc5372 100644 --- a/cpp/open3d/ml/pytorch/pointnet/BallQueryKernel.h +++ b/cpp/open3d/ml/pytorch/pointnet/BallQueryKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/pytorch/pointnet/BallQueryOps.cpp b/cpp/open3d/ml/pytorch/pointnet/BallQueryOps.cpp index 526688e6b59..1e7c872d341 100644 --- a/cpp/open3d/ml/pytorch/pointnet/BallQueryOps.cpp +++ b/cpp/open3d/ml/pytorch/pointnet/BallQueryOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/pytorch/pointnet/InterpolateKernel.cu b/cpp/open3d/ml/pytorch/pointnet/InterpolateKernel.cu index eaabe8c06f2..42500e7d53f 100644 --- a/cpp/open3d/ml/pytorch/pointnet/InterpolateKernel.cu +++ b/cpp/open3d/ml/pytorch/pointnet/InterpolateKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/pytorch/pointnet/InterpolateKernel.h b/cpp/open3d/ml/pytorch/pointnet/InterpolateKernel.h index 435342a00d5..830b52173f6 100644 --- a/cpp/open3d/ml/pytorch/pointnet/InterpolateKernel.h +++ b/cpp/open3d/ml/pytorch/pointnet/InterpolateKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/pytorch/pointnet/InterpolateOps.cpp b/cpp/open3d/ml/pytorch/pointnet/InterpolateOps.cpp index 796542802d9..2de025bcf46 100644 --- a/cpp/open3d/ml/pytorch/pointnet/InterpolateOps.cpp +++ b/cpp/open3d/ml/pytorch/pointnet/InterpolateOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/pytorch/pointnet/SamplingKernel.cu b/cpp/open3d/ml/pytorch/pointnet/SamplingKernel.cu index bb5b70d9450..b72414acb56 100644 --- a/cpp/open3d/ml/pytorch/pointnet/SamplingKernel.cu +++ b/cpp/open3d/ml/pytorch/pointnet/SamplingKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/pytorch/pointnet/SamplingKernel.h b/cpp/open3d/ml/pytorch/pointnet/SamplingKernel.h index ae14b3c51d8..fa6879b1e0b 100644 --- a/cpp/open3d/ml/pytorch/pointnet/SamplingKernel.h +++ b/cpp/open3d/ml/pytorch/pointnet/SamplingKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/pytorch/pointnet/SamplingOps.cpp b/cpp/open3d/ml/pytorch/pointnet/SamplingOps.cpp index 0727d9e645f..8bd422280b5 100644 --- a/cpp/open3d/ml/pytorch/pointnet/SamplingOps.cpp +++ b/cpp/open3d/ml/pytorch/pointnet/SamplingOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- //***************************************************************************************/ diff --git a/cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeKernel.cu b/cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeKernel.cu index 496cc2bd35d..8a25bfb5d52 100644 --- a/cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeKernel.cu +++ b/cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeKernel.h b/cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeKernel.h index 1ec2987d953..075bd87bdc1 100644 --- a/cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeKernel.h +++ b/cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeOps.cpp b/cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeOps.cpp index 78f6775d766..19896fbd057 100644 --- a/cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeOps.cpp +++ b/cpp/open3d/ml/pytorch/pvcnn/TrilinearDevoxelizeOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/ragged_tensor/RaggedTensor.cpp b/cpp/open3d/ml/pytorch/ragged_tensor/RaggedTensor.cpp index 6cfc570ab89..dac299fa34c 100644 --- a/cpp/open3d/ml/pytorch/ragged_tensor/RaggedTensor.cpp +++ b/cpp/open3d/ml/pytorch/ragged_tensor/RaggedTensor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/pytorch/ragged_tensor/RaggedTensor.h b/cpp/open3d/ml/pytorch/ragged_tensor/RaggedTensor.h index 236ad7f13e6..c8a671a88cf 100644 --- a/cpp/open3d/ml/pytorch/ragged_tensor/RaggedTensor.h +++ b/cpp/open3d/ml/pytorch/ragged_tensor/RaggedTensor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.cpp b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.cpp index c42b7f75894..c30cd9acd54 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.cu b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.cu index 3ca3d982891..09b34d8c2f9 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.cu +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.h b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.h index 5e142c8b8bc..8af1a89e143 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.h +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvBackpropFilterOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.cpp b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.cpp index ba4dd6980ac..86f587d31e7 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.cu b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.cu index ac30a47947a..d582ad8bf83 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.cu +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.h b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.h index 49f6c73c2d3..31e6e83c04e 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.h +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOps.cpp b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOps.cpp index 8589a4b487c..e5fcef3f5bf 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOps.cpp +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp index a311814feb1..a122727f4f2 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu index 5f295aca47e..b661b539a03 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h index 665c5d9f987..0359cd73f26 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.cpp b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.cpp index ffb5774f303..a59b63f0805 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.cpp +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.cu b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.cu index 9c70f0a5323..26e2704900c 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.cu +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.h b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.h index 1265093fc45..574e50d26b2 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.h +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOps.cpp b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOps.cpp index 5cb82deb52d..0ab4e1ff1dd 100644 --- a/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOps.cpp +++ b/cpp/open3d/ml/pytorch/sparse_conv/SparseConvTransposeOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/tensorflow/TensorFlowHelper.h b/cpp/open3d/ml/tensorflow/TensorFlowHelper.h index f8b7fab6e88..e7dd6b243d8 100644 --- a/cpp/open3d/ml/tensorflow/TensorFlowHelper.h +++ b/cpp/open3d/ml/tensorflow/TensorFlowHelper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp index 3d0b4409c3d..275d25b4fe2 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu index 348117d24c6..cb60ffd9395 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOpKernel.h b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOpKernel.h index 23e8a9ce735..b8adf46bda3 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOpKernel.h +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOps.cpp b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOps.cpp index 06a4df2b463..7c3a41fedb9 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOps.cpp +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvBackpropFilterOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOpKernel.cpp b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOpKernel.cpp index 192ba0438eb..ee3b2585cac 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOpKernel.cu b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOpKernel.cu index fb28505b5d2..011703ee439 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOpKernel.h b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOpKernel.h index 2ee55522a75..b390d4bd2f4 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOpKernel.h +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOps.cpp b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOps.cpp index a86f9dc7396..a313ad7ee5f 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOps.cpp +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp index 4228b75c7df..899946711a2 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu index ad9cbb7f0d8..8faeb8c1420 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h index 0fa2766124f..9e9088e49eb 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOps.cpp b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOps.cpp index 613224b562c..349d5824bb5 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOps.cpp +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeBackpropFilterOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOpKernel.cpp b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOpKernel.cpp index 5b65e21e6e1..9de66d2de70 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOpKernel.cu b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOpKernel.cu index 672e9fcd84c..8ba176c4aa6 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOpKernel.h b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOpKernel.h index 5a257392e3d..cf4fd73f669 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOpKernel.h +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOps.cpp b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOps.cpp index b04c5b62afa..8b443d0b799 100644 --- a/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOps.cpp +++ b/cpp/open3d/ml/tensorflow/continuous_conv/ContinuousConvTransposeOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOpKernel.cpp b/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOpKernel.cpp index 32b43eb772c..4bfa200e0f6 100644 --- a/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOpKernel.cu b/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOpKernel.cu index 7829c54deeb..d89dc139761 100644 --- a/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOpKernel.h b/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOpKernel.h index 954cf8dbf2a..a0415504e53 100644 --- a/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOpKernel.h +++ b/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOps.cpp b/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOps.cpp index ff5289e95ac..16e0e7db408 100644 --- a/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOps.cpp +++ b/cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.cpp b/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.cpp index b5ecb979004..2a56d54904e 100644 --- a/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.cu b/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.cu index bfd0d36496c..6f09cb6d80d 100644 --- a/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.h b/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.h index 1af68ae4142..ccd900fdfff 100644 --- a/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.h +++ b/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOps.cpp b/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOps.cpp index eeb2f02cffb..8de410b71bd 100644 --- a/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOps.cpp +++ b/cpp/open3d/ml/tensorflow/misc/FixedRadiusSearchOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.cpp b/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.cpp index 5d7e2f35687..90bcd0c8510 100644 --- a/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.cu b/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.cu index 3f17b9fc11c..d05d37464bc 100644 --- a/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.h b/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.h index d088dd6604b..b808bd48af3 100644 --- a/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.h +++ b/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOps.cpp b/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOps.cpp index cc2c935bbb8..875b7fc13f6 100644 --- a/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOps.cpp +++ b/cpp/open3d/ml/tensorflow/misc/InvertNeighborsListOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/KnnSearchOpKernel.cpp b/cpp/open3d/ml/tensorflow/misc/KnnSearchOpKernel.cpp index fff8640ea29..c0a04c6c568 100644 --- a/cpp/open3d/ml/tensorflow/misc/KnnSearchOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/misc/KnnSearchOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/KnnSearchOpKernel.h b/cpp/open3d/ml/tensorflow/misc/KnnSearchOpKernel.h index 58d067bf572..9f34b0f1025 100644 --- a/cpp/open3d/ml/tensorflow/misc/KnnSearchOpKernel.h +++ b/cpp/open3d/ml/tensorflow/misc/KnnSearchOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/KnnSearchOps.cpp b/cpp/open3d/ml/tensorflow/misc/KnnSearchOps.cpp index 112d022e28c..9ec8ef4b373 100644 --- a/cpp/open3d/ml/tensorflow/misc/KnnSearchOps.cpp +++ b/cpp/open3d/ml/tensorflow/misc/KnnSearchOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/NmsOpKernel.cpp b/cpp/open3d/ml/tensorflow/misc/NmsOpKernel.cpp index 9dd7ea58148..9fdc87cf41e 100644 --- a/cpp/open3d/ml/tensorflow/misc/NmsOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/misc/NmsOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/NmsOpKernel.cu b/cpp/open3d/ml/tensorflow/misc/NmsOpKernel.cu index 6172781952c..66a85e72c08 100644 --- a/cpp/open3d/ml/tensorflow/misc/NmsOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/misc/NmsOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/NmsOpKernel.h b/cpp/open3d/ml/tensorflow/misc/NmsOpKernel.h index 4c3359467a7..50dda33cb0b 100644 --- a/cpp/open3d/ml/tensorflow/misc/NmsOpKernel.h +++ b/cpp/open3d/ml/tensorflow/misc/NmsOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/NmsOps.cpp b/cpp/open3d/ml/tensorflow/misc/NmsOps.cpp index b8341190ea1..c43fe710425 100644 --- a/cpp/open3d/ml/tensorflow/misc/NmsOps.cpp +++ b/cpp/open3d/ml/tensorflow/misc/NmsOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/RadiusSearchOpKernel.cpp b/cpp/open3d/ml/tensorflow/misc/RadiusSearchOpKernel.cpp index 91e327121b0..f31d8c1aef8 100644 --- a/cpp/open3d/ml/tensorflow/misc/RadiusSearchOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/misc/RadiusSearchOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/RadiusSearchOpKernel.h b/cpp/open3d/ml/tensorflow/misc/RadiusSearchOpKernel.h index a0682b4e4e5..8cc56ec60f1 100644 --- a/cpp/open3d/ml/tensorflow/misc/RadiusSearchOpKernel.h +++ b/cpp/open3d/ml/tensorflow/misc/RadiusSearchOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/RadiusSearchOps.cpp b/cpp/open3d/ml/tensorflow/misc/RadiusSearchOps.cpp index 3dd99b9e460..fd715a0d5a3 100644 --- a/cpp/open3d/ml/tensorflow/misc/RadiusSearchOps.cpp +++ b/cpp/open3d/ml/tensorflow/misc/RadiusSearchOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.cpp b/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.cpp index 989f9faefa4..a1cfc94bed1 100644 --- a/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.cu b/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.cu index b44f3d3582c..d7e93840ae4 100644 --- a/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.h b/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.h index da838d1a140..553105282f8 100644 --- a/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.h +++ b/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOps.cpp b/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOps.cpp index 5226079e783..295365ec87f 100644 --- a/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOps.cpp +++ b/cpp/open3d/ml/tensorflow/misc/ReduceSubarraysSumOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/VoxelPoolingGradOpKernel.cpp b/cpp/open3d/ml/tensorflow/misc/VoxelPoolingGradOpKernel.cpp index 38bc4820ebc..a925e191911 100644 --- a/cpp/open3d/ml/tensorflow/misc/VoxelPoolingGradOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/misc/VoxelPoolingGradOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/VoxelPoolingGradOpKernel.h b/cpp/open3d/ml/tensorflow/misc/VoxelPoolingGradOpKernel.h index 2d702666bf4..0cbb0b7071f 100644 --- a/cpp/open3d/ml/tensorflow/misc/VoxelPoolingGradOpKernel.h +++ b/cpp/open3d/ml/tensorflow/misc/VoxelPoolingGradOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/VoxelPoolingOpKernel.cpp b/cpp/open3d/ml/tensorflow/misc/VoxelPoolingOpKernel.cpp index 77e278d72ee..5407764bd65 100644 --- a/cpp/open3d/ml/tensorflow/misc/VoxelPoolingOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/misc/VoxelPoolingOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/VoxelPoolingOpKernel.h b/cpp/open3d/ml/tensorflow/misc/VoxelPoolingOpKernel.h index f9fafbc010c..4bebcb132d5 100644 --- a/cpp/open3d/ml/tensorflow/misc/VoxelPoolingOpKernel.h +++ b/cpp/open3d/ml/tensorflow/misc/VoxelPoolingOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/VoxelPoolingOps.cpp b/cpp/open3d/ml/tensorflow/misc/VoxelPoolingOps.cpp index ec163ea415b..934092c24d1 100644 --- a/cpp/open3d/ml/tensorflow/misc/VoxelPoolingOps.cpp +++ b/cpp/open3d/ml/tensorflow/misc/VoxelPoolingOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.cpp b/cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.cpp index 7034aab8068..88e65d4bd4c 100644 --- a/cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.cu b/cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.cu index 698e7253114..ef5107a8b64 100644 --- a/cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.h b/cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.h index 0142aef2420..72c7c13dcd9 100644 --- a/cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.h +++ b/cpp/open3d/ml/tensorflow/misc/VoxelizeOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/misc/VoxelizeOps.cpp b/cpp/open3d/ml/tensorflow/misc/VoxelizeOps.cpp index 7c345edfd3f..ffe2ed08f2e 100644 --- a/cpp/open3d/ml/tensorflow/misc/VoxelizeOps.cpp +++ b/cpp/open3d/ml/tensorflow/misc/VoxelizeOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/pointnet/BallQueryOpKernel.cu b/cpp/open3d/ml/tensorflow/pointnet/BallQueryOpKernel.cu index 587fd4adb95..473a328282d 100644 --- a/cpp/open3d/ml/tensorflow/pointnet/BallQueryOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/pointnet/BallQueryOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/tensorflow/pointnet/BallQueryOpKernel.h b/cpp/open3d/ml/tensorflow/pointnet/BallQueryOpKernel.h index 5fe927ce7d7..510d6d44219 100644 --- a/cpp/open3d/ml/tensorflow/pointnet/BallQueryOpKernel.h +++ b/cpp/open3d/ml/tensorflow/pointnet/BallQueryOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/pointnet/BallQueryOps.cpp b/cpp/open3d/ml/tensorflow/pointnet/BallQueryOps.cpp index 07d7a03d34f..b04fb83bccd 100644 --- a/cpp/open3d/ml/tensorflow/pointnet/BallQueryOps.cpp +++ b/cpp/open3d/ml/tensorflow/pointnet/BallQueryOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- /* Furthest point sampling diff --git a/cpp/open3d/ml/tensorflow/pointnet/InterpolateOpKernel.cu b/cpp/open3d/ml/tensorflow/pointnet/InterpolateOpKernel.cu index b9ce6ee8c6c..e7b4671fe46 100644 --- a/cpp/open3d/ml/tensorflow/pointnet/InterpolateOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/pointnet/InterpolateOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/tensorflow/pointnet/InterpolateOpKernel.h b/cpp/open3d/ml/tensorflow/pointnet/InterpolateOpKernel.h index 063d176e4ff..b30c68e075c 100644 --- a/cpp/open3d/ml/tensorflow/pointnet/InterpolateOpKernel.h +++ b/cpp/open3d/ml/tensorflow/pointnet/InterpolateOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/pointnet/InterpolateOps.cpp b/cpp/open3d/ml/tensorflow/pointnet/InterpolateOps.cpp index f16e9020609..2e26de2a744 100644 --- a/cpp/open3d/ml/tensorflow/pointnet/InterpolateOps.cpp +++ b/cpp/open3d/ml/tensorflow/pointnet/InterpolateOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- /* Furthest point sampling diff --git a/cpp/open3d/ml/tensorflow/pointnet/RoiPoolOpKernel.cu b/cpp/open3d/ml/tensorflow/pointnet/RoiPoolOpKernel.cu index e45c542fa53..54ddf16221a 100644 --- a/cpp/open3d/ml/tensorflow/pointnet/RoiPoolOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/pointnet/RoiPoolOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/tensorflow/pointnet/RoiPoolOpKernel.h b/cpp/open3d/ml/tensorflow/pointnet/RoiPoolOpKernel.h index de0dea19f30..0d32043305c 100644 --- a/cpp/open3d/ml/tensorflow/pointnet/RoiPoolOpKernel.h +++ b/cpp/open3d/ml/tensorflow/pointnet/RoiPoolOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/pointnet/RoiPoolOps.cpp b/cpp/open3d/ml/tensorflow/pointnet/RoiPoolOps.cpp index 8a72b3b0027..7df0130020b 100644 --- a/cpp/open3d/ml/tensorflow/pointnet/RoiPoolOps.cpp +++ b/cpp/open3d/ml/tensorflow/pointnet/RoiPoolOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- /* Furthest point sampling diff --git a/cpp/open3d/ml/tensorflow/pointnet/SamplingOpKernel.cu b/cpp/open3d/ml/tensorflow/pointnet/SamplingOpKernel.cu index 3cb9005ab3d..52188a2defb 100644 --- a/cpp/open3d/ml/tensorflow/pointnet/SamplingOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/pointnet/SamplingOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/tensorflow/pointnet/SamplingOpKernel.h b/cpp/open3d/ml/tensorflow/pointnet/SamplingOpKernel.h index 2f54a1f8daa..34db1c0c9eb 100644 --- a/cpp/open3d/ml/tensorflow/pointnet/SamplingOpKernel.h +++ b/cpp/open3d/ml/tensorflow/pointnet/SamplingOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/pointnet/SamplingOps.cpp b/cpp/open3d/ml/tensorflow/pointnet/SamplingOps.cpp index b33a636d3f1..0dacf4d7de0 100644 --- a/cpp/open3d/ml/tensorflow/pointnet/SamplingOps.cpp +++ b/cpp/open3d/ml/tensorflow/pointnet/SamplingOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- /* Furthest point sampling diff --git a/cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeKernel.cu b/cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeKernel.cu index 40a6678926e..f934575c9b0 100644 --- a/cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeKernel.cu +++ b/cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeKernel.h b/cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeKernel.h index 374a7ccdb04..871a8f50621 100644 --- a/cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeKernel.h +++ b/cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeOps.cpp b/cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeOps.cpp index 7097f5f3287..61a3acefd82 100644 --- a/cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeOps.cpp +++ b/cpp/open3d/ml/tensorflow/pvcnn/TrilinearDevoxelizeOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOpKernel.cpp b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOpKernel.cpp index f83be319957..69855fa34ec 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOpKernel.cu b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOpKernel.cu index c6594ff84b2..863abe40dfd 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOpKernel.h b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOpKernel.h index c5535393bbf..43b352edcb0 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOpKernel.h +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOps.cpp b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOps.cpp index 5cc83701568..658a4ec7305 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOps.cpp +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvBackpropFilterOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.cpp b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.cpp index 381457c8b2d..abc3f477357 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.cu b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.cu index 03c35edff27..aa04277a067 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.h b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.h index d5ed4c431eb..b960eb9207b 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.h +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOps.cpp b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOps.cpp index 264a443ef25..e08b06ef29b 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOps.cpp +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp index 9624c648c1f..06234b5bf05 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu index 4484dd1be34..460f0793062 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h index cf1e9396eca..4f662300dc4 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOps.cpp b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOps.cpp index af9741ad39e..6538bf41cb7 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOps.cpp +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeBackpropFilterOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.cpp b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.cpp index 90f835f147d..c86744b13dc 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.cpp +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.cu b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.cu index a5df79f9a44..3c4a4545364 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.cu +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.h b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.h index ff7fe31e448..8640764c03a 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.h +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOpKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOps.cpp b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOps.cpp index a1daf49a16c..2bbe3ac4b01 100644 --- a/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOps.cpp +++ b/cpp/open3d/ml/tensorflow/sparse_conv/SparseConvTransposeOps.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/ml/tensorflow/tf_subsampling/tf_batch_subsampling.cpp b/cpp/open3d/ml/tensorflow/tf_subsampling/tf_batch_subsampling.cpp index 74472a667f4..4902806669c 100644 --- a/cpp/open3d/ml/tensorflow/tf_subsampling/tf_batch_subsampling.cpp +++ b/cpp/open3d/ml/tensorflow/tf_subsampling/tf_batch_subsampling.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Source code from: https://github.com/HuguesTHOMAS/KPConv. diff --git a/cpp/open3d/ml/tensorflow/tf_subsampling/tf_subsampling.cpp b/cpp/open3d/ml/tensorflow/tf_subsampling/tf_subsampling.cpp index fd7162966f8..e67f2ab166c 100644 --- a/cpp/open3d/ml/tensorflow/tf_subsampling/tf_subsampling.cpp +++ b/cpp/open3d/ml/tensorflow/tf_subsampling/tf_subsampling.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Source code from: https://github.com/HuguesTHOMAS/KPConv. diff --git a/cpp/open3d/pipelines/color_map/ColorMapUtils.cpp b/cpp/open3d/pipelines/color_map/ColorMapUtils.cpp index 8ab677d3a3a..e7155da65d6 100644 --- a/cpp/open3d/pipelines/color_map/ColorMapUtils.cpp +++ b/cpp/open3d/pipelines/color_map/ColorMapUtils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/color_map/ColorMapUtils.h b/cpp/open3d/pipelines/color_map/ColorMapUtils.h index fe1b1559c5c..d2cb1182eaa 100644 --- a/cpp/open3d/pipelines/color_map/ColorMapUtils.h +++ b/cpp/open3d/pipelines/color_map/ColorMapUtils.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/color_map/ImageWarpingField.cpp b/cpp/open3d/pipelines/color_map/ImageWarpingField.cpp index c60c33ee35d..46a92223720 100644 --- a/cpp/open3d/pipelines/color_map/ImageWarpingField.cpp +++ b/cpp/open3d/pipelines/color_map/ImageWarpingField.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/color_map/ImageWarpingField.h b/cpp/open3d/pipelines/color_map/ImageWarpingField.h index 013221fa9e4..e01cecc6323 100644 --- a/cpp/open3d/pipelines/color_map/ImageWarpingField.h +++ b/cpp/open3d/pipelines/color_map/ImageWarpingField.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/color_map/NonRigidOptimizer.cpp b/cpp/open3d/pipelines/color_map/NonRigidOptimizer.cpp index 9dfc98fdfa8..72a68a085ea 100644 --- a/cpp/open3d/pipelines/color_map/NonRigidOptimizer.cpp +++ b/cpp/open3d/pipelines/color_map/NonRigidOptimizer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/color_map/NonRigidOptimizer.h b/cpp/open3d/pipelines/color_map/NonRigidOptimizer.h index a428dc3d479..5f93fb86d59 100644 --- a/cpp/open3d/pipelines/color_map/NonRigidOptimizer.h +++ b/cpp/open3d/pipelines/color_map/NonRigidOptimizer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/color_map/RigidOptimizer.cpp b/cpp/open3d/pipelines/color_map/RigidOptimizer.cpp index b506d401a6f..afc832b2c0d 100644 --- a/cpp/open3d/pipelines/color_map/RigidOptimizer.cpp +++ b/cpp/open3d/pipelines/color_map/RigidOptimizer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/color_map/RigidOptimizer.h b/cpp/open3d/pipelines/color_map/RigidOptimizer.h index 716c15cc78d..516b52a2528 100644 --- a/cpp/open3d/pipelines/color_map/RigidOptimizer.h +++ b/cpp/open3d/pipelines/color_map/RigidOptimizer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/integration/MarchingCubesConst.h b/cpp/open3d/pipelines/integration/MarchingCubesConst.h index cf60d82f2dd..ca50cdf367b 100644 --- a/cpp/open3d/pipelines/integration/MarchingCubesConst.h +++ b/cpp/open3d/pipelines/integration/MarchingCubesConst.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/integration/ScalableTSDFVolume.cpp b/cpp/open3d/pipelines/integration/ScalableTSDFVolume.cpp index 5895dbe8f10..652c628c3ac 100644 --- a/cpp/open3d/pipelines/integration/ScalableTSDFVolume.cpp +++ b/cpp/open3d/pipelines/integration/ScalableTSDFVolume.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/integration/ScalableTSDFVolume.h b/cpp/open3d/pipelines/integration/ScalableTSDFVolume.h index ba29950589c..425bb8b2137 100644 --- a/cpp/open3d/pipelines/integration/ScalableTSDFVolume.h +++ b/cpp/open3d/pipelines/integration/ScalableTSDFVolume.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/integration/TSDFVolume.h b/cpp/open3d/pipelines/integration/TSDFVolume.h index 4865dd2e262..6ea4f7b7a86 100644 --- a/cpp/open3d/pipelines/integration/TSDFVolume.h +++ b/cpp/open3d/pipelines/integration/TSDFVolume.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/integration/UniformTSDFVolume.cpp b/cpp/open3d/pipelines/integration/UniformTSDFVolume.cpp index 7cb4eba6f38..336572d9203 100644 --- a/cpp/open3d/pipelines/integration/UniformTSDFVolume.cpp +++ b/cpp/open3d/pipelines/integration/UniformTSDFVolume.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/integration/UniformTSDFVolume.h b/cpp/open3d/pipelines/integration/UniformTSDFVolume.h index eec3fe7a32a..3d72b9dcce1 100644 --- a/cpp/open3d/pipelines/integration/UniformTSDFVolume.h +++ b/cpp/open3d/pipelines/integration/UniformTSDFVolume.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/odometry/Odometry.cpp b/cpp/open3d/pipelines/odometry/Odometry.cpp index dd8b1569caa..c9cd12df095 100644 --- a/cpp/open3d/pipelines/odometry/Odometry.cpp +++ b/cpp/open3d/pipelines/odometry/Odometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/odometry/Odometry.h b/cpp/open3d/pipelines/odometry/Odometry.h index aea065d3873..75953dd4d96 100644 --- a/cpp/open3d/pipelines/odometry/Odometry.h +++ b/cpp/open3d/pipelines/odometry/Odometry.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/odometry/OdometryOption.h b/cpp/open3d/pipelines/odometry/OdometryOption.h index de410bcbbb2..1133a8a3e2f 100644 --- a/cpp/open3d/pipelines/odometry/OdometryOption.h +++ b/cpp/open3d/pipelines/odometry/OdometryOption.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/odometry/RGBDOdometryJacobian.cpp b/cpp/open3d/pipelines/odometry/RGBDOdometryJacobian.cpp index 81fbd647934..2a546762ea1 100644 --- a/cpp/open3d/pipelines/odometry/RGBDOdometryJacobian.cpp +++ b/cpp/open3d/pipelines/odometry/RGBDOdometryJacobian.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/odometry/RGBDOdometryJacobian.h b/cpp/open3d/pipelines/odometry/RGBDOdometryJacobian.h index 1d4ff242e5a..f9d01ee1dd4 100644 --- a/cpp/open3d/pipelines/odometry/RGBDOdometryJacobian.h +++ b/cpp/open3d/pipelines/odometry/RGBDOdometryJacobian.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/ColoredICP.cpp b/cpp/open3d/pipelines/registration/ColoredICP.cpp index 0365e3dc662..c9bea7e73fe 100644 --- a/cpp/open3d/pipelines/registration/ColoredICP.cpp +++ b/cpp/open3d/pipelines/registration/ColoredICP.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/ColoredICP.h b/cpp/open3d/pipelines/registration/ColoredICP.h index d7b61d57401..2e17054c00c 100644 --- a/cpp/open3d/pipelines/registration/ColoredICP.h +++ b/cpp/open3d/pipelines/registration/ColoredICP.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/CorrespondenceChecker.cpp b/cpp/open3d/pipelines/registration/CorrespondenceChecker.cpp index 82a35c004a0..57885a0eb09 100644 --- a/cpp/open3d/pipelines/registration/CorrespondenceChecker.cpp +++ b/cpp/open3d/pipelines/registration/CorrespondenceChecker.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/CorrespondenceChecker.h b/cpp/open3d/pipelines/registration/CorrespondenceChecker.h index 4d0fd89bee2..0ae92c3d9b2 100644 --- a/cpp/open3d/pipelines/registration/CorrespondenceChecker.h +++ b/cpp/open3d/pipelines/registration/CorrespondenceChecker.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/FastGlobalRegistration.cpp b/cpp/open3d/pipelines/registration/FastGlobalRegistration.cpp index f0e48b43afe..198a280c8e4 100644 --- a/cpp/open3d/pipelines/registration/FastGlobalRegistration.cpp +++ b/cpp/open3d/pipelines/registration/FastGlobalRegistration.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/FastGlobalRegistration.h b/cpp/open3d/pipelines/registration/FastGlobalRegistration.h index 2cec3bbfc25..23caff5ca03 100644 --- a/cpp/open3d/pipelines/registration/FastGlobalRegistration.h +++ b/cpp/open3d/pipelines/registration/FastGlobalRegistration.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/Feature.cpp b/cpp/open3d/pipelines/registration/Feature.cpp index 2815159dcc4..41b036ebbab 100644 --- a/cpp/open3d/pipelines/registration/Feature.cpp +++ b/cpp/open3d/pipelines/registration/Feature.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/Feature.h b/cpp/open3d/pipelines/registration/Feature.h index e102883b160..41bb4776a35 100644 --- a/cpp/open3d/pipelines/registration/Feature.h +++ b/cpp/open3d/pipelines/registration/Feature.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/GeneralizedICP.cpp b/cpp/open3d/pipelines/registration/GeneralizedICP.cpp index c529fdcc639..a6113d584aa 100644 --- a/cpp/open3d/pipelines/registration/GeneralizedICP.cpp +++ b/cpp/open3d/pipelines/registration/GeneralizedICP.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Altered from: diff --git a/cpp/open3d/pipelines/registration/GeneralizedICP.h b/cpp/open3d/pipelines/registration/GeneralizedICP.h index 30629fdaaae..b359ea10291 100644 --- a/cpp/open3d/pipelines/registration/GeneralizedICP.h +++ b/cpp/open3d/pipelines/registration/GeneralizedICP.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // @author Ignacio Vizzo [ivizzo@uni-bonn.de] diff --git a/cpp/open3d/pipelines/registration/GlobalOptimization.cpp b/cpp/open3d/pipelines/registration/GlobalOptimization.cpp index d70e160642e..3cd0387cef6 100644 --- a/cpp/open3d/pipelines/registration/GlobalOptimization.cpp +++ b/cpp/open3d/pipelines/registration/GlobalOptimization.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/GlobalOptimization.h b/cpp/open3d/pipelines/registration/GlobalOptimization.h index 7e878a2f184..426ff4b05e6 100644 --- a/cpp/open3d/pipelines/registration/GlobalOptimization.h +++ b/cpp/open3d/pipelines/registration/GlobalOptimization.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/GlobalOptimizationConvergenceCriteria.h b/cpp/open3d/pipelines/registration/GlobalOptimizationConvergenceCriteria.h index db13971ee7f..3d896dd0457 100644 --- a/cpp/open3d/pipelines/registration/GlobalOptimizationConvergenceCriteria.h +++ b/cpp/open3d/pipelines/registration/GlobalOptimizationConvergenceCriteria.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/GlobalOptimizationMethod.h b/cpp/open3d/pipelines/registration/GlobalOptimizationMethod.h index be40fcd755c..db399521e47 100644 --- a/cpp/open3d/pipelines/registration/GlobalOptimizationMethod.h +++ b/cpp/open3d/pipelines/registration/GlobalOptimizationMethod.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/PoseGraph.cpp b/cpp/open3d/pipelines/registration/PoseGraph.cpp index 62076bdfe7c..7bd92e2f777 100644 --- a/cpp/open3d/pipelines/registration/PoseGraph.cpp +++ b/cpp/open3d/pipelines/registration/PoseGraph.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/PoseGraph.h b/cpp/open3d/pipelines/registration/PoseGraph.h index f6c5a4dad1b..e10be77e675 100644 --- a/cpp/open3d/pipelines/registration/PoseGraph.h +++ b/cpp/open3d/pipelines/registration/PoseGraph.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/Registration.cpp b/cpp/open3d/pipelines/registration/Registration.cpp index 8527d620bf0..0ef084ede94 100644 --- a/cpp/open3d/pipelines/registration/Registration.cpp +++ b/cpp/open3d/pipelines/registration/Registration.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/Registration.h b/cpp/open3d/pipelines/registration/Registration.h index 276ef6b64e2..55623832278 100644 --- a/cpp/open3d/pipelines/registration/Registration.h +++ b/cpp/open3d/pipelines/registration/Registration.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/RobustKernel.cpp b/cpp/open3d/pipelines/registration/RobustKernel.cpp index 68e4bcd6c22..35aaec62481 100644 --- a/cpp/open3d/pipelines/registration/RobustKernel.cpp +++ b/cpp/open3d/pipelines/registration/RobustKernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // @author Ignacio Vizzo [ivizzo@uni-bonn.de] diff --git a/cpp/open3d/pipelines/registration/RobustKernel.h b/cpp/open3d/pipelines/registration/RobustKernel.h index d3d111e8865..a1dca36ab26 100644 --- a/cpp/open3d/pipelines/registration/RobustKernel.h +++ b/cpp/open3d/pipelines/registration/RobustKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // @author Ignacio Vizzo [ivizzo@uni-bonn.de] diff --git a/cpp/open3d/pipelines/registration/TransformationEstimation.cpp b/cpp/open3d/pipelines/registration/TransformationEstimation.cpp index ff14dce0950..af7903ea2e6 100644 --- a/cpp/open3d/pipelines/registration/TransformationEstimation.cpp +++ b/cpp/open3d/pipelines/registration/TransformationEstimation.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/pipelines/registration/TransformationEstimation.h b/cpp/open3d/pipelines/registration/TransformationEstimation.h index 4e450746877..0c35667408f 100644 --- a/cpp/open3d/pipelines/registration/TransformationEstimation.h +++ b/cpp/open3d/pipelines/registration/TransformationEstimation.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/BoundingVolume.cpp b/cpp/open3d/t/geometry/BoundingVolume.cpp index 6a221502efe..ad357608442 100644 --- a/cpp/open3d/t/geometry/BoundingVolume.cpp +++ b/cpp/open3d/t/geometry/BoundingVolume.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/BoundingVolume.h b/cpp/open3d/t/geometry/BoundingVolume.h index b11cae01777..0f3a3afa16b 100644 --- a/cpp/open3d/t/geometry/BoundingVolume.h +++ b/cpp/open3d/t/geometry/BoundingVolume.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/DrawableGeometry.h b/cpp/open3d/t/geometry/DrawableGeometry.h index 05ef4e41969..0b1af889746 100644 --- a/cpp/open3d/t/geometry/DrawableGeometry.h +++ b/cpp/open3d/t/geometry/DrawableGeometry.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/Geometry.h b/cpp/open3d/t/geometry/Geometry.h index df5681c0b2c..8d1b296f8bc 100644 --- a/cpp/open3d/t/geometry/Geometry.h +++ b/cpp/open3d/t/geometry/Geometry.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/Image.cpp b/cpp/open3d/t/geometry/Image.cpp index 3af4fc20b42..12d6d423153 100644 --- a/cpp/open3d/t/geometry/Image.cpp +++ b/cpp/open3d/t/geometry/Image.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/Image.h b/cpp/open3d/t/geometry/Image.h index 105bff8db82..01007c5cc77 100644 --- a/cpp/open3d/t/geometry/Image.h +++ b/cpp/open3d/t/geometry/Image.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/LineSet.cpp b/cpp/open3d/t/geometry/LineSet.cpp index c2d95f0ced2..74fa3d1362b 100644 --- a/cpp/open3d/t/geometry/LineSet.cpp +++ b/cpp/open3d/t/geometry/LineSet.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/LineSet.h b/cpp/open3d/t/geometry/LineSet.h index 6c3ecb66da8..91aa426ec7e 100644 --- a/cpp/open3d/t/geometry/LineSet.h +++ b/cpp/open3d/t/geometry/LineSet.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/PointCloud.cpp b/cpp/open3d/t/geometry/PointCloud.cpp index f4c5b47f068..2890e89c969 100644 --- a/cpp/open3d/t/geometry/PointCloud.cpp +++ b/cpp/open3d/t/geometry/PointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/PointCloud.h b/cpp/open3d/t/geometry/PointCloud.h index 995e1b5ba50..8bc8541cfbf 100644 --- a/cpp/open3d/t/geometry/PointCloud.h +++ b/cpp/open3d/t/geometry/PointCloud.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/RGBDImage.cpp b/cpp/open3d/t/geometry/RGBDImage.cpp index 631fa3ef0fd..b77019d5c90 100644 --- a/cpp/open3d/t/geometry/RGBDImage.cpp +++ b/cpp/open3d/t/geometry/RGBDImage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/RGBDImage.h b/cpp/open3d/t/geometry/RGBDImage.h index aa0d6ac3538..d0db11824ee 100644 --- a/cpp/open3d/t/geometry/RGBDImage.h +++ b/cpp/open3d/t/geometry/RGBDImage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/RaycastingScene.cpp b/cpp/open3d/t/geometry/RaycastingScene.cpp index af7dd3f1480..4788f77e886 100644 --- a/cpp/open3d/t/geometry/RaycastingScene.cpp +++ b/cpp/open3d/t/geometry/RaycastingScene.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/RaycastingScene.h b/cpp/open3d/t/geometry/RaycastingScene.h index f25d994b0b5..9847464084a 100644 --- a/cpp/open3d/t/geometry/RaycastingScene.h +++ b/cpp/open3d/t/geometry/RaycastingScene.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/TensorMap.cpp b/cpp/open3d/t/geometry/TensorMap.cpp index f47bcaf0955..aabec93b8fa 100644 --- a/cpp/open3d/t/geometry/TensorMap.cpp +++ b/cpp/open3d/t/geometry/TensorMap.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/TensorMap.h b/cpp/open3d/t/geometry/TensorMap.h index 699268cea37..9dc2d66c469 100644 --- a/cpp/open3d/t/geometry/TensorMap.h +++ b/cpp/open3d/t/geometry/TensorMap.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/TriangleMesh.cpp b/cpp/open3d/t/geometry/TriangleMesh.cpp index 6f33f8e44f7..1e3379b8450 100644 --- a/cpp/open3d/t/geometry/TriangleMesh.cpp +++ b/cpp/open3d/t/geometry/TriangleMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/TriangleMesh.h b/cpp/open3d/t/geometry/TriangleMesh.h index 7824f193b1c..7fc317df78a 100644 --- a/cpp/open3d/t/geometry/TriangleMesh.h +++ b/cpp/open3d/t/geometry/TriangleMesh.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/TriangleMeshFactory.cpp b/cpp/open3d/t/geometry/TriangleMeshFactory.cpp index fb04d856c7c..7716a3c7644 100644 --- a/cpp/open3d/t/geometry/TriangleMeshFactory.cpp +++ b/cpp/open3d/t/geometry/TriangleMeshFactory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/Utility.h b/cpp/open3d/t/geometry/Utility.h index a8a73ae2895..c96521953ae 100644 --- a/cpp/open3d/t/geometry/Utility.h +++ b/cpp/open3d/t/geometry/Utility.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/VoxelBlockGrid.cpp b/cpp/open3d/t/geometry/VoxelBlockGrid.cpp index b98c09b95f2..063e271658e 100644 --- a/cpp/open3d/t/geometry/VoxelBlockGrid.cpp +++ b/cpp/open3d/t/geometry/VoxelBlockGrid.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/VoxelBlockGrid.h b/cpp/open3d/t/geometry/VoxelBlockGrid.h index a6922585faa..32f7e451946 100644 --- a/cpp/open3d/t/geometry/VoxelBlockGrid.h +++ b/cpp/open3d/t/geometry/VoxelBlockGrid.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/VtkUtils.cpp b/cpp/open3d/t/geometry/VtkUtils.cpp index e6b7245d833..9e3754adf11 100644 --- a/cpp/open3d/t/geometry/VtkUtils.cpp +++ b/cpp/open3d/t/geometry/VtkUtils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/VtkUtils.h b/cpp/open3d/t/geometry/VtkUtils.h index 85aeabe6770..e0ea691e6d9 100644 --- a/cpp/open3d/t/geometry/VtkUtils.h +++ b/cpp/open3d/t/geometry/VtkUtils.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/GeometryIndexer.h b/cpp/open3d/t/geometry/kernel/GeometryIndexer.h index 2c0391b1a9f..60e047197d1 100644 --- a/cpp/open3d/t/geometry/kernel/GeometryIndexer.h +++ b/cpp/open3d/t/geometry/kernel/GeometryIndexer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/GeometryMacros.h b/cpp/open3d/t/geometry/kernel/GeometryMacros.h index 4421543ae92..bb5eab80416 100644 --- a/cpp/open3d/t/geometry/kernel/GeometryMacros.h +++ b/cpp/open3d/t/geometry/kernel/GeometryMacros.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/IPPImage.cpp b/cpp/open3d/t/geometry/kernel/IPPImage.cpp index 275d15b560b..f5994dedd93 100644 --- a/cpp/open3d/t/geometry/kernel/IPPImage.cpp +++ b/cpp/open3d/t/geometry/kernel/IPPImage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/IPPImage.h b/cpp/open3d/t/geometry/kernel/IPPImage.h index b861dd4d920..4589ebd2f7c 100644 --- a/cpp/open3d/t/geometry/kernel/IPPImage.h +++ b/cpp/open3d/t/geometry/kernel/IPPImage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once diff --git a/cpp/open3d/t/geometry/kernel/Image.cpp b/cpp/open3d/t/geometry/kernel/Image.cpp index 9523e809b46..670d80de9ac 100644 --- a/cpp/open3d/t/geometry/kernel/Image.cpp +++ b/cpp/open3d/t/geometry/kernel/Image.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/Image.h b/cpp/open3d/t/geometry/kernel/Image.h index 71ef2ba7602..f2d1cbafd17 100644 --- a/cpp/open3d/t/geometry/kernel/Image.h +++ b/cpp/open3d/t/geometry/kernel/Image.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/ImageCPU.cpp b/cpp/open3d/t/geometry/kernel/ImageCPU.cpp index ac8f808acbc..d61cdfe7780 100644 --- a/cpp/open3d/t/geometry/kernel/ImageCPU.cpp +++ b/cpp/open3d/t/geometry/kernel/ImageCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/ImageCUDA.cu b/cpp/open3d/t/geometry/kernel/ImageCUDA.cu index ac8f808acbc..d61cdfe7780 100644 --- a/cpp/open3d/t/geometry/kernel/ImageCUDA.cu +++ b/cpp/open3d/t/geometry/kernel/ImageCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/ImageImpl.h b/cpp/open3d/t/geometry/kernel/ImageImpl.h index e194e69c199..fbe2bcd1dca 100644 --- a/cpp/open3d/t/geometry/kernel/ImageImpl.h +++ b/cpp/open3d/t/geometry/kernel/ImageImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/NPPImage.cpp b/cpp/open3d/t/geometry/kernel/NPPImage.cpp index e0ff8d67e6b..eb47ec9ba30 100644 --- a/cpp/open3d/t/geometry/kernel/NPPImage.cpp +++ b/cpp/open3d/t/geometry/kernel/NPPImage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/NPPImage.h b/cpp/open3d/t/geometry/kernel/NPPImage.h index f0966f07f74..4db7ea19936 100644 --- a/cpp/open3d/t/geometry/kernel/NPPImage.h +++ b/cpp/open3d/t/geometry/kernel/NPPImage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once diff --git a/cpp/open3d/t/geometry/kernel/PCAPartition.cpp b/cpp/open3d/t/geometry/kernel/PCAPartition.cpp index e1cfedc11da..4f937ab065b 100644 --- a/cpp/open3d/t/geometry/kernel/PCAPartition.cpp +++ b/cpp/open3d/t/geometry/kernel/PCAPartition.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/PCAPartition.h b/cpp/open3d/t/geometry/kernel/PCAPartition.h index 4127fa64200..618eaefd09c 100644 --- a/cpp/open3d/t/geometry/kernel/PCAPartition.h +++ b/cpp/open3d/t/geometry/kernel/PCAPartition.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/PointCloud.cpp b/cpp/open3d/t/geometry/kernel/PointCloud.cpp index cac496344e2..329c703e50c 100644 --- a/cpp/open3d/t/geometry/kernel/PointCloud.cpp +++ b/cpp/open3d/t/geometry/kernel/PointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/PointCloud.h b/cpp/open3d/t/geometry/kernel/PointCloud.h index c66e6501035..104e6ff6bb7 100644 --- a/cpp/open3d/t/geometry/kernel/PointCloud.h +++ b/cpp/open3d/t/geometry/kernel/PointCloud.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/PointCloudCPU.cpp b/cpp/open3d/t/geometry/kernel/PointCloudCPU.cpp index 2fdc949fda3..50acad94e20 100644 --- a/cpp/open3d/t/geometry/kernel/PointCloudCPU.cpp +++ b/cpp/open3d/t/geometry/kernel/PointCloudCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/PointCloudCUDA.cu b/cpp/open3d/t/geometry/kernel/PointCloudCUDA.cu index 39090a2cd2d..82bce224fca 100644 --- a/cpp/open3d/t/geometry/kernel/PointCloudCUDA.cu +++ b/cpp/open3d/t/geometry/kernel/PointCloudCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/PointCloudImpl.h b/cpp/open3d/t/geometry/kernel/PointCloudImpl.h index 14a19c25c79..cf442e0081e 100644 --- a/cpp/open3d/t/geometry/kernel/PointCloudImpl.h +++ b/cpp/open3d/t/geometry/kernel/PointCloudImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/Transform.cpp b/cpp/open3d/t/geometry/kernel/Transform.cpp index d6b8cdcfd35..96a1078edb0 100644 --- a/cpp/open3d/t/geometry/kernel/Transform.cpp +++ b/cpp/open3d/t/geometry/kernel/Transform.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/Transform.h b/cpp/open3d/t/geometry/kernel/Transform.h index 1cd7b13cc05..d64d860572e 100644 --- a/cpp/open3d/t/geometry/kernel/Transform.h +++ b/cpp/open3d/t/geometry/kernel/Transform.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/TransformCPU.cpp b/cpp/open3d/t/geometry/kernel/TransformCPU.cpp index 272ecb99025..4252b9d20d1 100644 --- a/cpp/open3d/t/geometry/kernel/TransformCPU.cpp +++ b/cpp/open3d/t/geometry/kernel/TransformCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/TransformCUDA.cu b/cpp/open3d/t/geometry/kernel/TransformCUDA.cu index 272ecb99025..4252b9d20d1 100644 --- a/cpp/open3d/t/geometry/kernel/TransformCUDA.cu +++ b/cpp/open3d/t/geometry/kernel/TransformCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/TransformImpl.h b/cpp/open3d/t/geometry/kernel/TransformImpl.h index 9e70bff5329..14c08a01e52 100644 --- a/cpp/open3d/t/geometry/kernel/TransformImpl.h +++ b/cpp/open3d/t/geometry/kernel/TransformImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/TriangleMesh.cpp b/cpp/open3d/t/geometry/kernel/TriangleMesh.cpp index a2bd1e49f26..0d0d4b17263 100644 --- a/cpp/open3d/t/geometry/kernel/TriangleMesh.cpp +++ b/cpp/open3d/t/geometry/kernel/TriangleMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/TriangleMesh.h b/cpp/open3d/t/geometry/kernel/TriangleMesh.h index f5aca664fa5..cb4f39eeea5 100644 --- a/cpp/open3d/t/geometry/kernel/TriangleMesh.h +++ b/cpp/open3d/t/geometry/kernel/TriangleMesh.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/TriangleMeshCPU.cpp b/cpp/open3d/t/geometry/kernel/TriangleMeshCPU.cpp index 24a68a691f8..792cdc013c6 100644 --- a/cpp/open3d/t/geometry/kernel/TriangleMeshCPU.cpp +++ b/cpp/open3d/t/geometry/kernel/TriangleMeshCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/TriangleMeshCUDA.cu b/cpp/open3d/t/geometry/kernel/TriangleMeshCUDA.cu index d4bcd245d56..455e4e6e6eb 100644 --- a/cpp/open3d/t/geometry/kernel/TriangleMeshCUDA.cu +++ b/cpp/open3d/t/geometry/kernel/TriangleMeshCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/TriangleMeshImpl.h b/cpp/open3d/t/geometry/kernel/TriangleMeshImpl.h index 5b675344fa6..bbc032121f8 100644 --- a/cpp/open3d/t/geometry/kernel/TriangleMeshImpl.h +++ b/cpp/open3d/t/geometry/kernel/TriangleMeshImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/UVUnwrapping.cpp b/cpp/open3d/t/geometry/kernel/UVUnwrapping.cpp index 866e620d6bf..3cac1466654 100644 --- a/cpp/open3d/t/geometry/kernel/UVUnwrapping.cpp +++ b/cpp/open3d/t/geometry/kernel/UVUnwrapping.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/UVUnwrapping.h b/cpp/open3d/t/geometry/kernel/UVUnwrapping.h index e2262b15dc3..d0c16dc6730 100644 --- a/cpp/open3d/t/geometry/kernel/UVUnwrapping.h +++ b/cpp/open3d/t/geometry/kernel/UVUnwrapping.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/VoxelBlockGrid.cpp b/cpp/open3d/t/geometry/kernel/VoxelBlockGrid.cpp index 7a430459fbe..03064043c81 100644 --- a/cpp/open3d/t/geometry/kernel/VoxelBlockGrid.cpp +++ b/cpp/open3d/t/geometry/kernel/VoxelBlockGrid.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/VoxelBlockGrid.h b/cpp/open3d/t/geometry/kernel/VoxelBlockGrid.h index bb186a9aefe..43fb19df2e2 100644 --- a/cpp/open3d/t/geometry/kernel/VoxelBlockGrid.h +++ b/cpp/open3d/t/geometry/kernel/VoxelBlockGrid.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/VoxelBlockGridCPU.cpp b/cpp/open3d/t/geometry/kernel/VoxelBlockGridCPU.cpp index 45549c82714..018fd4b40d2 100644 --- a/cpp/open3d/t/geometry/kernel/VoxelBlockGridCPU.cpp +++ b/cpp/open3d/t/geometry/kernel/VoxelBlockGridCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/VoxelBlockGridCUDA.cu b/cpp/open3d/t/geometry/kernel/VoxelBlockGridCUDA.cu index 2d053c10248..fd44cc8d3d0 100644 --- a/cpp/open3d/t/geometry/kernel/VoxelBlockGridCUDA.cu +++ b/cpp/open3d/t/geometry/kernel/VoxelBlockGridCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/geometry/kernel/VoxelBlockGridImpl.h b/cpp/open3d/t/geometry/kernel/VoxelBlockGridImpl.h index f306436323e..bd40b18b37a 100644 --- a/cpp/open3d/t/geometry/kernel/VoxelBlockGridImpl.h +++ b/cpp/open3d/t/geometry/kernel/VoxelBlockGridImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/HashMapIO.cpp b/cpp/open3d/t/io/HashMapIO.cpp index 309cf3f3eb9..841b3cfecd8 100644 --- a/cpp/open3d/t/io/HashMapIO.cpp +++ b/cpp/open3d/t/io/HashMapIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/HashMapIO.h b/cpp/open3d/t/io/HashMapIO.h index 099ac44c23b..f685a905881 100644 --- a/cpp/open3d/t/io/HashMapIO.h +++ b/cpp/open3d/t/io/HashMapIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/ImageIO.cpp b/cpp/open3d/t/io/ImageIO.cpp index df1ca3625ce..600ac5caf1b 100644 --- a/cpp/open3d/t/io/ImageIO.cpp +++ b/cpp/open3d/t/io/ImageIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/ImageIO.h b/cpp/open3d/t/io/ImageIO.h index 6a7edd6e17b..44a1a9d6a66 100644 --- a/cpp/open3d/t/io/ImageIO.h +++ b/cpp/open3d/t/io/ImageIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/NumpyIO.cpp b/cpp/open3d/t/io/NumpyIO.cpp index c2986e8a482..f793f8feab6 100644 --- a/cpp/open3d/t/io/NumpyIO.cpp +++ b/cpp/open3d/t/io/NumpyIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/NumpyIO.h b/cpp/open3d/t/io/NumpyIO.h index 0870f73e310..4e4c518bbd4 100644 --- a/cpp/open3d/t/io/NumpyIO.h +++ b/cpp/open3d/t/io/NumpyIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/PointCloudIO.cpp b/cpp/open3d/t/io/PointCloudIO.cpp index fa66d0e2869..dbdd9b44391 100644 --- a/cpp/open3d/t/io/PointCloudIO.cpp +++ b/cpp/open3d/t/io/PointCloudIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/PointCloudIO.h b/cpp/open3d/t/io/PointCloudIO.h index de02b29053b..44dbd0f2ea3 100644 --- a/cpp/open3d/t/io/PointCloudIO.h +++ b/cpp/open3d/t/io/PointCloudIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/TriangleMeshIO.cpp b/cpp/open3d/t/io/TriangleMeshIO.cpp index 3f511eb984e..6f4974365a5 100644 --- a/cpp/open3d/t/io/TriangleMeshIO.cpp +++ b/cpp/open3d/t/io/TriangleMeshIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/TriangleMeshIO.h b/cpp/open3d/t/io/TriangleMeshIO.h index a4d975d471a..259259888d3 100644 --- a/cpp/open3d/t/io/TriangleMeshIO.h +++ b/cpp/open3d/t/io/TriangleMeshIO.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/file_format/FileASSIMP.cpp b/cpp/open3d/t/io/file_format/FileASSIMP.cpp index 5eae7a9ffdc..9e13fed422e 100644 --- a/cpp/open3d/t/io/file_format/FileASSIMP.cpp +++ b/cpp/open3d/t/io/file_format/FileASSIMP.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/file_format/FileJPG.cpp b/cpp/open3d/t/io/file_format/FileJPG.cpp index dc83fb3ad2e..888d2f5f5b7 100644 --- a/cpp/open3d/t/io/file_format/FileJPG.cpp +++ b/cpp/open3d/t/io/file_format/FileJPG.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/file_format/FilePCD.cpp b/cpp/open3d/t/io/file_format/FilePCD.cpp index 4aa229c0d55..b17f765059d 100644 --- a/cpp/open3d/t/io/file_format/FilePCD.cpp +++ b/cpp/open3d/t/io/file_format/FilePCD.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/file_format/FilePLY.cpp b/cpp/open3d/t/io/file_format/FilePLY.cpp index fe0db654b86..abc34238d09 100644 --- a/cpp/open3d/t/io/file_format/FilePLY.cpp +++ b/cpp/open3d/t/io/file_format/FilePLY.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/file_format/FilePNG.cpp b/cpp/open3d/t/io/file_format/FilePNG.cpp index 2497e2a71c8..4aa5191e392 100644 --- a/cpp/open3d/t/io/file_format/FilePNG.cpp +++ b/cpp/open3d/t/io/file_format/FilePNG.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/file_format/FilePTS.cpp b/cpp/open3d/t/io/file_format/FilePTS.cpp index 5bd7d932bfc..d5f1f52be54 100644 --- a/cpp/open3d/t/io/file_format/FilePTS.cpp +++ b/cpp/open3d/t/io/file_format/FilePTS.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/file_format/FileTXT.cpp b/cpp/open3d/t/io/file_format/FileTXT.cpp index e0bee8e7027..615e882d6b9 100644 --- a/cpp/open3d/t/io/file_format/FileTXT.cpp +++ b/cpp/open3d/t/io/file_format/FileTXT.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/sensor/RGBDSensor.h b/cpp/open3d/t/io/sensor/RGBDSensor.h index 93dd110b933..e82d37aa4a1 100644 --- a/cpp/open3d/t/io/sensor/RGBDSensor.h +++ b/cpp/open3d/t/io/sensor/RGBDSensor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/sensor/RGBDVideoMetadata.cpp b/cpp/open3d/t/io/sensor/RGBDVideoMetadata.cpp index 04fefbc8fc0..27d213ac999 100644 --- a/cpp/open3d/t/io/sensor/RGBDVideoMetadata.cpp +++ b/cpp/open3d/t/io/sensor/RGBDVideoMetadata.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/sensor/RGBDVideoMetadata.h b/cpp/open3d/t/io/sensor/RGBDVideoMetadata.h index a50eba2d0d2..90f7ba61708 100644 --- a/cpp/open3d/t/io/sensor/RGBDVideoMetadata.h +++ b/cpp/open3d/t/io/sensor/RGBDVideoMetadata.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/sensor/RGBDVideoReader.cpp b/cpp/open3d/t/io/sensor/RGBDVideoReader.cpp index 4115a42e12e..d85ccefa237 100644 --- a/cpp/open3d/t/io/sensor/RGBDVideoReader.cpp +++ b/cpp/open3d/t/io/sensor/RGBDVideoReader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/sensor/RGBDVideoReader.h b/cpp/open3d/t/io/sensor/RGBDVideoReader.h index ed0580afa46..4337d9eea0f 100644 --- a/cpp/open3d/t/io/sensor/RGBDVideoReader.h +++ b/cpp/open3d/t/io/sensor/RGBDVideoReader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/sensor/realsense/RSBagReader.cpp b/cpp/open3d/t/io/sensor/realsense/RSBagReader.cpp index 356fdbed6bc..90dcb168b76 100644 --- a/cpp/open3d/t/io/sensor/realsense/RSBagReader.cpp +++ b/cpp/open3d/t/io/sensor/realsense/RSBagReader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/sensor/realsense/RSBagReader.h b/cpp/open3d/t/io/sensor/realsense/RSBagReader.h index 8043398e960..bc843f97619 100644 --- a/cpp/open3d/t/io/sensor/realsense/RSBagReader.h +++ b/cpp/open3d/t/io/sensor/realsense/RSBagReader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/sensor/realsense/RealSensePrivate.h b/cpp/open3d/t/io/sensor/realsense/RealSensePrivate.h index c9de591cbe1..3ab7f9f7765 100644 --- a/cpp/open3d/t/io/sensor/realsense/RealSensePrivate.h +++ b/cpp/open3d/t/io/sensor/realsense/RealSensePrivate.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/sensor/realsense/RealSenseSensor.cpp b/cpp/open3d/t/io/sensor/realsense/RealSenseSensor.cpp index e20264b5b8f..18e2226254e 100644 --- a/cpp/open3d/t/io/sensor/realsense/RealSenseSensor.cpp +++ b/cpp/open3d/t/io/sensor/realsense/RealSenseSensor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/sensor/realsense/RealSenseSensor.h b/cpp/open3d/t/io/sensor/realsense/RealSenseSensor.h index 51ea8eb5e8a..3308e661f6f 100644 --- a/cpp/open3d/t/io/sensor/realsense/RealSenseSensor.h +++ b/cpp/open3d/t/io/sensor/realsense/RealSenseSensor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/sensor/realsense/RealSenseSensorConfig.cpp b/cpp/open3d/t/io/sensor/realsense/RealSenseSensorConfig.cpp index 30056f991ed..7ff43fb8457 100644 --- a/cpp/open3d/t/io/sensor/realsense/RealSenseSensorConfig.cpp +++ b/cpp/open3d/t/io/sensor/realsense/RealSenseSensorConfig.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/io/sensor/realsense/RealSenseSensorConfig.h b/cpp/open3d/t/io/sensor/realsense/RealSenseSensorConfig.h index 985a8e7b874..f075fb09aa6 100644 --- a/cpp/open3d/t/io/sensor/realsense/RealSenseSensorConfig.h +++ b/cpp/open3d/t/io/sensor/realsense/RealSenseSensorConfig.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/Feature.cpp b/cpp/open3d/t/pipelines/kernel/Feature.cpp index 575932df95d..bd4014ecb5d 100644 --- a/cpp/open3d/t/pipelines/kernel/Feature.cpp +++ b/cpp/open3d/t/pipelines/kernel/Feature.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/Feature.h b/cpp/open3d/t/pipelines/kernel/Feature.h index 7dad8aa2991..6dd4a405342 100644 --- a/cpp/open3d/t/pipelines/kernel/Feature.h +++ b/cpp/open3d/t/pipelines/kernel/Feature.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/FeatureCPU.cpp b/cpp/open3d/t/pipelines/kernel/FeatureCPU.cpp index 0261a83ef64..2cf8222f5ba 100644 --- a/cpp/open3d/t/pipelines/kernel/FeatureCPU.cpp +++ b/cpp/open3d/t/pipelines/kernel/FeatureCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/FeatureCUDA.cu b/cpp/open3d/t/pipelines/kernel/FeatureCUDA.cu index 0261a83ef64..2cf8222f5ba 100644 --- a/cpp/open3d/t/pipelines/kernel/FeatureCUDA.cu +++ b/cpp/open3d/t/pipelines/kernel/FeatureCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/FeatureImpl.h b/cpp/open3d/t/pipelines/kernel/FeatureImpl.h index 54a7e44f9e8..bd00f29fb77 100644 --- a/cpp/open3d/t/pipelines/kernel/FeatureImpl.h +++ b/cpp/open3d/t/pipelines/kernel/FeatureImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/FillInLinearSystem.cpp b/cpp/open3d/t/pipelines/kernel/FillInLinearSystem.cpp index 37e69fb5f62..9d5e825da9a 100644 --- a/cpp/open3d/t/pipelines/kernel/FillInLinearSystem.cpp +++ b/cpp/open3d/t/pipelines/kernel/FillInLinearSystem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/FillInLinearSystem.h b/cpp/open3d/t/pipelines/kernel/FillInLinearSystem.h index 39a4638cf78..1c529813841 100644 --- a/cpp/open3d/t/pipelines/kernel/FillInLinearSystem.h +++ b/cpp/open3d/t/pipelines/kernel/FillInLinearSystem.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/FillInLinearSystemCPU.cpp b/cpp/open3d/t/pipelines/kernel/FillInLinearSystemCPU.cpp index dfd5b25d8ef..1aa5c62663c 100644 --- a/cpp/open3d/t/pipelines/kernel/FillInLinearSystemCPU.cpp +++ b/cpp/open3d/t/pipelines/kernel/FillInLinearSystemCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/FillInLinearSystemCUDA.cu b/cpp/open3d/t/pipelines/kernel/FillInLinearSystemCUDA.cu index dfd5b25d8ef..1aa5c62663c 100644 --- a/cpp/open3d/t/pipelines/kernel/FillInLinearSystemCUDA.cu +++ b/cpp/open3d/t/pipelines/kernel/FillInLinearSystemCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/FillInLinearSystemImpl.h b/cpp/open3d/t/pipelines/kernel/FillInLinearSystemImpl.h index b541082e2d2..e158809f6a4 100644 --- a/cpp/open3d/t/pipelines/kernel/FillInLinearSystemImpl.h +++ b/cpp/open3d/t/pipelines/kernel/FillInLinearSystemImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/RGBDOdometry.cpp b/cpp/open3d/t/pipelines/kernel/RGBDOdometry.cpp index 783f263a322..ac61daeaa2c 100644 --- a/cpp/open3d/t/pipelines/kernel/RGBDOdometry.cpp +++ b/cpp/open3d/t/pipelines/kernel/RGBDOdometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/RGBDOdometry.h b/cpp/open3d/t/pipelines/kernel/RGBDOdometry.h index 04bf1f83371..27e44dce158 100644 --- a/cpp/open3d/t/pipelines/kernel/RGBDOdometry.h +++ b/cpp/open3d/t/pipelines/kernel/RGBDOdometry.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/RGBDOdometryCPU.cpp b/cpp/open3d/t/pipelines/kernel/RGBDOdometryCPU.cpp index e140c455e96..10ed434d5b0 100644 --- a/cpp/open3d/t/pipelines/kernel/RGBDOdometryCPU.cpp +++ b/cpp/open3d/t/pipelines/kernel/RGBDOdometryCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/RGBDOdometryCUDA.cu b/cpp/open3d/t/pipelines/kernel/RGBDOdometryCUDA.cu index 2fbc1567f2d..8709196ee4a 100644 --- a/cpp/open3d/t/pipelines/kernel/RGBDOdometryCUDA.cu +++ b/cpp/open3d/t/pipelines/kernel/RGBDOdometryCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/RGBDOdometryImpl.h b/cpp/open3d/t/pipelines/kernel/RGBDOdometryImpl.h index 429419b0b9b..d1aacbbeac3 100644 --- a/cpp/open3d/t/pipelines/kernel/RGBDOdometryImpl.h +++ b/cpp/open3d/t/pipelines/kernel/RGBDOdometryImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/RGBDOdometryJacobianImpl.h b/cpp/open3d/t/pipelines/kernel/RGBDOdometryJacobianImpl.h index 53ad47444e3..0dbe0d97f94 100644 --- a/cpp/open3d/t/pipelines/kernel/RGBDOdometryJacobianImpl.h +++ b/cpp/open3d/t/pipelines/kernel/RGBDOdometryJacobianImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/Registration.cpp b/cpp/open3d/t/pipelines/kernel/Registration.cpp index b99a5065359..326671431f3 100644 --- a/cpp/open3d/t/pipelines/kernel/Registration.cpp +++ b/cpp/open3d/t/pipelines/kernel/Registration.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/Registration.h b/cpp/open3d/t/pipelines/kernel/Registration.h index 3a375b85c3c..3358d30a9ac 100644 --- a/cpp/open3d/t/pipelines/kernel/Registration.h +++ b/cpp/open3d/t/pipelines/kernel/Registration.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/RegistrationCPU.cpp b/cpp/open3d/t/pipelines/kernel/RegistrationCPU.cpp index d2ea8b584ab..5fd20f196bb 100644 --- a/cpp/open3d/t/pipelines/kernel/RegistrationCPU.cpp +++ b/cpp/open3d/t/pipelines/kernel/RegistrationCPU.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/RegistrationCUDA.cu b/cpp/open3d/t/pipelines/kernel/RegistrationCUDA.cu index 20532dde857..1fe76815a2f 100644 --- a/cpp/open3d/t/pipelines/kernel/RegistrationCUDA.cu +++ b/cpp/open3d/t/pipelines/kernel/RegistrationCUDA.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/RegistrationImpl.h b/cpp/open3d/t/pipelines/kernel/RegistrationImpl.h index 9d0309b16c7..3f08ca4c811 100644 --- a/cpp/open3d/t/pipelines/kernel/RegistrationImpl.h +++ b/cpp/open3d/t/pipelines/kernel/RegistrationImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/TransformationConverter.cpp b/cpp/open3d/t/pipelines/kernel/TransformationConverter.cpp index ec5bac0c9de..c181ade770e 100644 --- a/cpp/open3d/t/pipelines/kernel/TransformationConverter.cpp +++ b/cpp/open3d/t/pipelines/kernel/TransformationConverter.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/TransformationConverter.cu b/cpp/open3d/t/pipelines/kernel/TransformationConverter.cu index 7eb97abb1b3..55fe8bcb14c 100644 --- a/cpp/open3d/t/pipelines/kernel/TransformationConverter.cu +++ b/cpp/open3d/t/pipelines/kernel/TransformationConverter.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/TransformationConverter.h b/cpp/open3d/t/pipelines/kernel/TransformationConverter.h index 1155f20b4d5..4d4d43c5d8d 100644 --- a/cpp/open3d/t/pipelines/kernel/TransformationConverter.h +++ b/cpp/open3d/t/pipelines/kernel/TransformationConverter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/kernel/TransformationConverterImpl.h b/cpp/open3d/t/pipelines/kernel/TransformationConverterImpl.h index 86879dbf863..e75484ce3f5 100644 --- a/cpp/open3d/t/pipelines/kernel/TransformationConverterImpl.h +++ b/cpp/open3d/t/pipelines/kernel/TransformationConverterImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/odometry/RGBDOdometry.cpp b/cpp/open3d/t/pipelines/odometry/RGBDOdometry.cpp index 3d0ee8a2aec..ac2e26af0c4 100644 --- a/cpp/open3d/t/pipelines/odometry/RGBDOdometry.cpp +++ b/cpp/open3d/t/pipelines/odometry/RGBDOdometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/odometry/RGBDOdometry.h b/cpp/open3d/t/pipelines/odometry/RGBDOdometry.h index 20c2de8e3bc..b868d1aa69a 100644 --- a/cpp/open3d/t/pipelines/odometry/RGBDOdometry.h +++ b/cpp/open3d/t/pipelines/odometry/RGBDOdometry.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/registration/Feature.cpp b/cpp/open3d/t/pipelines/registration/Feature.cpp index d20e1a1b58c..8fc78a535ef 100644 --- a/cpp/open3d/t/pipelines/registration/Feature.cpp +++ b/cpp/open3d/t/pipelines/registration/Feature.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/registration/Feature.h b/cpp/open3d/t/pipelines/registration/Feature.h index 59b6ba489d8..65a88408833 100644 --- a/cpp/open3d/t/pipelines/registration/Feature.h +++ b/cpp/open3d/t/pipelines/registration/Feature.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/registration/Registration.cpp b/cpp/open3d/t/pipelines/registration/Registration.cpp index 2b7cbb19976..7487828b379 100644 --- a/cpp/open3d/t/pipelines/registration/Registration.cpp +++ b/cpp/open3d/t/pipelines/registration/Registration.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/registration/Registration.h b/cpp/open3d/t/pipelines/registration/Registration.h index 036c126ca43..ed933b60132 100644 --- a/cpp/open3d/t/pipelines/registration/Registration.h +++ b/cpp/open3d/t/pipelines/registration/Registration.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/registration/RobustKernel.h b/cpp/open3d/t/pipelines/registration/RobustKernel.h index 215ab9d8018..62613a71722 100644 --- a/cpp/open3d/t/pipelines/registration/RobustKernel.h +++ b/cpp/open3d/t/pipelines/registration/RobustKernel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/registration/RobustKernelImpl.h b/cpp/open3d/t/pipelines/registration/RobustKernelImpl.h index 95e551a05f7..623f59db8e1 100644 --- a/cpp/open3d/t/pipelines/registration/RobustKernelImpl.h +++ b/cpp/open3d/t/pipelines/registration/RobustKernelImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/registration/TransformationEstimation.cpp b/cpp/open3d/t/pipelines/registration/TransformationEstimation.cpp index 5c19333c00a..922cc31ef70 100644 --- a/cpp/open3d/t/pipelines/registration/TransformationEstimation.cpp +++ b/cpp/open3d/t/pipelines/registration/TransformationEstimation.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/registration/TransformationEstimation.h b/cpp/open3d/t/pipelines/registration/TransformationEstimation.h index acc13f7d726..ab72cc33f10 100644 --- a/cpp/open3d/t/pipelines/registration/TransformationEstimation.h +++ b/cpp/open3d/t/pipelines/registration/TransformationEstimation.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/slac/ControlGrid.cpp b/cpp/open3d/t/pipelines/slac/ControlGrid.cpp index c440c57005b..857d6c4913f 100644 --- a/cpp/open3d/t/pipelines/slac/ControlGrid.cpp +++ b/cpp/open3d/t/pipelines/slac/ControlGrid.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/slac/ControlGrid.h b/cpp/open3d/t/pipelines/slac/ControlGrid.h index bdb5a5e21c7..10f2b6ac801 100644 --- a/cpp/open3d/t/pipelines/slac/ControlGrid.h +++ b/cpp/open3d/t/pipelines/slac/ControlGrid.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/slac/FillInLinearSystemImpl.h b/cpp/open3d/t/pipelines/slac/FillInLinearSystemImpl.h index 4ad6a5d89d1..1e155a69ef6 100644 --- a/cpp/open3d/t/pipelines/slac/FillInLinearSystemImpl.h +++ b/cpp/open3d/t/pipelines/slac/FillInLinearSystemImpl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/slac/SLACOptimizer.cpp b/cpp/open3d/t/pipelines/slac/SLACOptimizer.cpp index f51f59ce4fd..005c5f06dc3 100644 --- a/cpp/open3d/t/pipelines/slac/SLACOptimizer.cpp +++ b/cpp/open3d/t/pipelines/slac/SLACOptimizer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/slac/SLACOptimizer.h b/cpp/open3d/t/pipelines/slac/SLACOptimizer.h index fb0aafde516..838eec89a02 100644 --- a/cpp/open3d/t/pipelines/slac/SLACOptimizer.h +++ b/cpp/open3d/t/pipelines/slac/SLACOptimizer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/slac/Visualization.cpp b/cpp/open3d/t/pipelines/slac/Visualization.cpp index d84bfb3cbca..23de27d0b42 100644 --- a/cpp/open3d/t/pipelines/slac/Visualization.cpp +++ b/cpp/open3d/t/pipelines/slac/Visualization.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/slac/Visualization.h b/cpp/open3d/t/pipelines/slac/Visualization.h index 9c70bcdaa4a..d576b919c4e 100644 --- a/cpp/open3d/t/pipelines/slac/Visualization.h +++ b/cpp/open3d/t/pipelines/slac/Visualization.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/slam/Frame.h b/cpp/open3d/t/pipelines/slam/Frame.h index 70e4955cfee..794588d4b8d 100644 --- a/cpp/open3d/t/pipelines/slam/Frame.h +++ b/cpp/open3d/t/pipelines/slam/Frame.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/slam/Model.cpp b/cpp/open3d/t/pipelines/slam/Model.cpp index 9ca3cad0ac5..18fc3e0bfec 100644 --- a/cpp/open3d/t/pipelines/slam/Model.cpp +++ b/cpp/open3d/t/pipelines/slam/Model.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/t/pipelines/slam/Model.h b/cpp/open3d/t/pipelines/slam/Model.h index b9f0c6105e1..84ab6c32f56 100644 --- a/cpp/open3d/t/pipelines/slam/Model.h +++ b/cpp/open3d/t/pipelines/slam/Model.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/CPUInfo.cpp b/cpp/open3d/utility/CPUInfo.cpp index 12a9e99ddb5..502e1241e19 100644 --- a/cpp/open3d/utility/CPUInfo.cpp +++ b/cpp/open3d/utility/CPUInfo.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/CPUInfo.h b/cpp/open3d/utility/CPUInfo.h index 0dd80fa9466..b02c470fd13 100644 --- a/cpp/open3d/utility/CPUInfo.h +++ b/cpp/open3d/utility/CPUInfo.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once diff --git a/cpp/open3d/utility/CompilerInfo.cpp b/cpp/open3d/utility/CompilerInfo.cpp index 41981cf9810..ecd538ce92d 100644 --- a/cpp/open3d/utility/CompilerInfo.cpp +++ b/cpp/open3d/utility/CompilerInfo.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/CompilerInfo.h b/cpp/open3d/utility/CompilerInfo.h index 61c0a4404be..8bfbecb6a93 100644 --- a/cpp/open3d/utility/CompilerInfo.h +++ b/cpp/open3d/utility/CompilerInfo.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once diff --git a/cpp/open3d/utility/Console.cpp b/cpp/open3d/utility/Console.cpp index 27e719ec63b..2faae23aabb 100644 --- a/cpp/open3d/utility/Console.cpp +++ b/cpp/open3d/utility/Console.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Console.h b/cpp/open3d/utility/Console.h index 976f776feb6..eb3f3b65066 100644 --- a/cpp/open3d/utility/Console.h +++ b/cpp/open3d/utility/Console.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Download.cpp b/cpp/open3d/utility/Download.cpp index 025dbc6641e..6f3443cc907 100644 --- a/cpp/open3d/utility/Download.cpp +++ b/cpp/open3d/utility/Download.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Download.h b/cpp/open3d/utility/Download.h index 84ec68c42bb..0ab24f6e78b 100644 --- a/cpp/open3d/utility/Download.h +++ b/cpp/open3d/utility/Download.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Eigen.cpp b/cpp/open3d/utility/Eigen.cpp index b3f6fb34476..eb60c357fb7 100644 --- a/cpp/open3d/utility/Eigen.cpp +++ b/cpp/open3d/utility/Eigen.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Eigen.h b/cpp/open3d/utility/Eigen.h index d3438d6d547..871b6be12bc 100644 --- a/cpp/open3d/utility/Eigen.h +++ b/cpp/open3d/utility/Eigen.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Extract.cpp b/cpp/open3d/utility/Extract.cpp index 888de14b455..8004cc380bd 100644 --- a/cpp/open3d/utility/Extract.cpp +++ b/cpp/open3d/utility/Extract.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Extract.h b/cpp/open3d/utility/Extract.h index 355ff6277b8..7a847d49744 100644 --- a/cpp/open3d/utility/Extract.h +++ b/cpp/open3d/utility/Extract.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/ExtractZIP.cpp b/cpp/open3d/utility/ExtractZIP.cpp index 9d80393d72a..eba295992c2 100644 --- a/cpp/open3d/utility/ExtractZIP.cpp +++ b/cpp/open3d/utility/ExtractZIP.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/ExtractZIP.h b/cpp/open3d/utility/ExtractZIP.h index a9e406be616..e11923492d0 100644 --- a/cpp/open3d/utility/ExtractZIP.h +++ b/cpp/open3d/utility/ExtractZIP.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/FileSystem.cpp b/cpp/open3d/utility/FileSystem.cpp index 98ff4926f2b..604507edc35 100644 --- a/cpp/open3d/utility/FileSystem.cpp +++ b/cpp/open3d/utility/FileSystem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/FileSystem.h b/cpp/open3d/utility/FileSystem.h index de77a863299..f1f56f99a5e 100644 --- a/cpp/open3d/utility/FileSystem.h +++ b/cpp/open3d/utility/FileSystem.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Helper.cpp b/cpp/open3d/utility/Helper.cpp index 47530070249..4a1db5f37db 100644 --- a/cpp/open3d/utility/Helper.cpp +++ b/cpp/open3d/utility/Helper.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Helper.h b/cpp/open3d/utility/Helper.h index 067a93d47b4..5b026437f84 100644 --- a/cpp/open3d/utility/Helper.h +++ b/cpp/open3d/utility/Helper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Helper.isph b/cpp/open3d/utility/Helper.isph index 25a785a0966..e7b3becb669 100644 --- a/cpp/open3d/utility/Helper.isph +++ b/cpp/open3d/utility/Helper.isph @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/IJsonConvertible.cpp b/cpp/open3d/utility/IJsonConvertible.cpp index b9f9fa9b07d..2d4a4959b83 100644 --- a/cpp/open3d/utility/IJsonConvertible.cpp +++ b/cpp/open3d/utility/IJsonConvertible.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/IJsonConvertible.h b/cpp/open3d/utility/IJsonConvertible.h index 8febffa566f..5b4f391fe2e 100644 --- a/cpp/open3d/utility/IJsonConvertible.h +++ b/cpp/open3d/utility/IJsonConvertible.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/ISAInfo.cpp b/cpp/open3d/utility/ISAInfo.cpp index fb7f9841ad2..a712eac448b 100644 --- a/cpp/open3d/utility/ISAInfo.cpp +++ b/cpp/open3d/utility/ISAInfo.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/ISAInfo.h b/cpp/open3d/utility/ISAInfo.h index 46947ce5993..8d9577127ce 100644 --- a/cpp/open3d/utility/ISAInfo.h +++ b/cpp/open3d/utility/ISAInfo.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once diff --git a/cpp/open3d/utility/ISAInfo.ispc b/cpp/open3d/utility/ISAInfo.ispc index 89dbf92175b..e8c1273c896 100644 --- a/cpp/open3d/utility/ISAInfo.ispc +++ b/cpp/open3d/utility/ISAInfo.ispc @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/ISAInfo.isph b/cpp/open3d/utility/ISAInfo.isph index 468b7cd4d7f..be32e17b7cf 100644 --- a/cpp/open3d/utility/ISAInfo.isph +++ b/cpp/open3d/utility/ISAInfo.isph @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Logging.cpp b/cpp/open3d/utility/Logging.cpp index 782c51553f3..7440212f097 100644 --- a/cpp/open3d/utility/Logging.cpp +++ b/cpp/open3d/utility/Logging.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Logging.h b/cpp/open3d/utility/Logging.h index 15fe28fa539..fb4a21c862c 100644 --- a/cpp/open3d/utility/Logging.h +++ b/cpp/open3d/utility/Logging.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/MiniVec.h b/cpp/open3d/utility/MiniVec.h index 6bf608d6082..17eca20b129 100644 --- a/cpp/open3d/utility/MiniVec.h +++ b/cpp/open3d/utility/MiniVec.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Optional.h b/cpp/open3d/utility/Optional.h index ccbbb27d38b..345c9b15eb7 100644 --- a/cpp/open3d/utility/Optional.h +++ b/cpp/open3d/utility/Optional.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Copyright (C) 2011 - 2012 Andrzej Krzemienski. diff --git a/cpp/open3d/utility/Overload.h b/cpp/open3d/utility/Overload.h index 0b6282184bb..d42a023518d 100644 --- a/cpp/open3d/utility/Overload.h +++ b/cpp/open3d/utility/Overload.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Parallel.cpp b/cpp/open3d/utility/Parallel.cpp index b05f2375a95..79989eeeddd 100644 --- a/cpp/open3d/utility/Parallel.cpp +++ b/cpp/open3d/utility/Parallel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Parallel.h b/cpp/open3d/utility/Parallel.h index 9763f533221..ad37dfaa1be 100644 --- a/cpp/open3d/utility/Parallel.h +++ b/cpp/open3d/utility/Parallel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/ParallelScan.h b/cpp/open3d/utility/ParallelScan.h index a98015053f8..8aa645d38ea 100644 --- a/cpp/open3d/utility/ParallelScan.h +++ b/cpp/open3d/utility/ParallelScan.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Preprocessor.h b/cpp/open3d/utility/Preprocessor.h index 707b516a623..3111562d9ad 100644 --- a/cpp/open3d/utility/Preprocessor.h +++ b/cpp/open3d/utility/Preprocessor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/ProgressBar.cpp b/cpp/open3d/utility/ProgressBar.cpp index 5a5c6fce1ab..efbe57023c4 100644 --- a/cpp/open3d/utility/ProgressBar.cpp +++ b/cpp/open3d/utility/ProgressBar.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/ProgressBar.h b/cpp/open3d/utility/ProgressBar.h index dcff07c0d2e..39fdc52a4bd 100644 --- a/cpp/open3d/utility/ProgressBar.h +++ b/cpp/open3d/utility/ProgressBar.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/ProgressReporters.h b/cpp/open3d/utility/ProgressReporters.h index 53657d7746a..ccd29d5386a 100644 --- a/cpp/open3d/utility/ProgressReporters.h +++ b/cpp/open3d/utility/ProgressReporters.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Random.cpp b/cpp/open3d/utility/Random.cpp index 8d0c54a9697..554439e0674 100644 --- a/cpp/open3d/utility/Random.cpp +++ b/cpp/open3d/utility/Random.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Random.h b/cpp/open3d/utility/Random.h index 87a0eca4d5e..9a502dd2732 100644 --- a/cpp/open3d/utility/Random.h +++ b/cpp/open3d/utility/Random.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Timer.cpp b/cpp/open3d/utility/Timer.cpp index 93ff5012bba..31122587497 100644 --- a/cpp/open3d/utility/Timer.cpp +++ b/cpp/open3d/utility/Timer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/utility/Timer.h b/cpp/open3d/utility/Timer.h index 2a508a78dc2..a5896a1127a 100644 --- a/cpp/open3d/utility/Timer.h +++ b/cpp/open3d/utility/Timer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/app/Viewer.cpp b/cpp/open3d/visualization/app/Viewer.cpp index 8dc5de39875..c24c37fe849 100644 --- a/cpp/open3d/visualization/app/Viewer.cpp +++ b/cpp/open3d/visualization/app/Viewer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/app/Viewer.h b/cpp/open3d/visualization/app/Viewer.h index f36f42f729d..4978342dddf 100644 --- a/cpp/open3d/visualization/app/Viewer.h +++ b/cpp/open3d/visualization/app/Viewer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Application.cpp b/cpp/open3d/visualization/gui/Application.cpp index 89cfa9746b2..55ca48cd8ff 100644 --- a/cpp/open3d/visualization/gui/Application.cpp +++ b/cpp/open3d/visualization/gui/Application.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Application.h b/cpp/open3d/visualization/gui/Application.h index e7bbef4fe13..49de13e5d37 100644 --- a/cpp/open3d/visualization/gui/Application.h +++ b/cpp/open3d/visualization/gui/Application.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/BitmapWindowSystem.cpp b/cpp/open3d/visualization/gui/BitmapWindowSystem.cpp index 49fe527eeca..f40e5545556 100644 --- a/cpp/open3d/visualization/gui/BitmapWindowSystem.cpp +++ b/cpp/open3d/visualization/gui/BitmapWindowSystem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/BitmapWindowSystem.h b/cpp/open3d/visualization/gui/BitmapWindowSystem.h index 8b7268630a7..a0558c6898b 100644 --- a/cpp/open3d/visualization/gui/BitmapWindowSystem.h +++ b/cpp/open3d/visualization/gui/BitmapWindowSystem.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Button.cpp b/cpp/open3d/visualization/gui/Button.cpp index 129ed0d4fec..f87a3456d8d 100644 --- a/cpp/open3d/visualization/gui/Button.cpp +++ b/cpp/open3d/visualization/gui/Button.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Button.h b/cpp/open3d/visualization/gui/Button.h index 03d7c1f17d0..cf3d32b666c 100644 --- a/cpp/open3d/visualization/gui/Button.h +++ b/cpp/open3d/visualization/gui/Button.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Checkbox.cpp b/cpp/open3d/visualization/gui/Checkbox.cpp index 1c95e97206a..f25b3af70ae 100644 --- a/cpp/open3d/visualization/gui/Checkbox.cpp +++ b/cpp/open3d/visualization/gui/Checkbox.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Checkbox.h b/cpp/open3d/visualization/gui/Checkbox.h index 0863fb7e790..313756a599a 100644 --- a/cpp/open3d/visualization/gui/Checkbox.h +++ b/cpp/open3d/visualization/gui/Checkbox.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Color.cpp b/cpp/open3d/visualization/gui/Color.cpp index b4d4d0a9dd3..5d11e093a07 100644 --- a/cpp/open3d/visualization/gui/Color.cpp +++ b/cpp/open3d/visualization/gui/Color.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Color.h b/cpp/open3d/visualization/gui/Color.h index fe1c9025685..44f70fa605b 100644 --- a/cpp/open3d/visualization/gui/Color.h +++ b/cpp/open3d/visualization/gui/Color.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/ColorEdit.cpp b/cpp/open3d/visualization/gui/ColorEdit.cpp index 1a21c676156..13eb65a3c68 100644 --- a/cpp/open3d/visualization/gui/ColorEdit.cpp +++ b/cpp/open3d/visualization/gui/ColorEdit.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/ColorEdit.h b/cpp/open3d/visualization/gui/ColorEdit.h index 89ca5a2d3db..050a9208a0e 100644 --- a/cpp/open3d/visualization/gui/ColorEdit.h +++ b/cpp/open3d/visualization/gui/ColorEdit.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Combobox.cpp b/cpp/open3d/visualization/gui/Combobox.cpp index 2bba54cc0f5..eb4c59d7625 100644 --- a/cpp/open3d/visualization/gui/Combobox.cpp +++ b/cpp/open3d/visualization/gui/Combobox.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Combobox.h b/cpp/open3d/visualization/gui/Combobox.h index b1f4e0d60f4..e17d9b7d483 100644 --- a/cpp/open3d/visualization/gui/Combobox.h +++ b/cpp/open3d/visualization/gui/Combobox.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Dialog.cpp b/cpp/open3d/visualization/gui/Dialog.cpp index 1563735083b..0f4dba1aaef 100644 --- a/cpp/open3d/visualization/gui/Dialog.cpp +++ b/cpp/open3d/visualization/gui/Dialog.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Dialog.h b/cpp/open3d/visualization/gui/Dialog.h index b15f7226d12..8823086d705 100644 --- a/cpp/open3d/visualization/gui/Dialog.h +++ b/cpp/open3d/visualization/gui/Dialog.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Events.cpp b/cpp/open3d/visualization/gui/Events.cpp index e0819be8164..046be63a950 100644 --- a/cpp/open3d/visualization/gui/Events.cpp +++ b/cpp/open3d/visualization/gui/Events.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Events.h b/cpp/open3d/visualization/gui/Events.h index 90f94364910..fcdaebf126a 100644 --- a/cpp/open3d/visualization/gui/Events.h +++ b/cpp/open3d/visualization/gui/Events.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/FileDialog.cpp b/cpp/open3d/visualization/gui/FileDialog.cpp index 28f6efe2b92..d9a1d82175e 100644 --- a/cpp/open3d/visualization/gui/FileDialog.cpp +++ b/cpp/open3d/visualization/gui/FileDialog.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/FileDialog.h b/cpp/open3d/visualization/gui/FileDialog.h index f28ee11c463..59e60955b96 100644 --- a/cpp/open3d/visualization/gui/FileDialog.h +++ b/cpp/open3d/visualization/gui/FileDialog.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/FileDialogNative.cpp b/cpp/open3d/visualization/gui/FileDialogNative.cpp index 7e42930f9b9..27b69d7ecb5 100644 --- a/cpp/open3d/visualization/gui/FileDialogNative.cpp +++ b/cpp/open3d/visualization/gui/FileDialogNative.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Font.cpp b/cpp/open3d/visualization/gui/Font.cpp index 39e30fccd53..0067b28537d 100644 --- a/cpp/open3d/visualization/gui/Font.cpp +++ b/cpp/open3d/visualization/gui/Font.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Font.h b/cpp/open3d/visualization/gui/Font.h index 62467154ac7..071326b9943 100644 --- a/cpp/open3d/visualization/gui/Font.h +++ b/cpp/open3d/visualization/gui/Font.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/GLFWWindowSystem.cpp b/cpp/open3d/visualization/gui/GLFWWindowSystem.cpp index 37f17121007..f1011a7cfff 100644 --- a/cpp/open3d/visualization/gui/GLFWWindowSystem.cpp +++ b/cpp/open3d/visualization/gui/GLFWWindowSystem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/GLFWWindowSystem.h b/cpp/open3d/visualization/gui/GLFWWindowSystem.h index a74a37af3e6..a8ef84f62f5 100644 --- a/cpp/open3d/visualization/gui/GLFWWindowSystem.h +++ b/cpp/open3d/visualization/gui/GLFWWindowSystem.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Gui.cpp b/cpp/open3d/visualization/gui/Gui.cpp index 2ea50c767c2..193691d6b8b 100644 --- a/cpp/open3d/visualization/gui/Gui.cpp +++ b/cpp/open3d/visualization/gui/Gui.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Gui.h b/cpp/open3d/visualization/gui/Gui.h index 55ff2f32036..3ab40897a88 100644 --- a/cpp/open3d/visualization/gui/Gui.h +++ b/cpp/open3d/visualization/gui/Gui.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/ImageWidget.cpp b/cpp/open3d/visualization/gui/ImageWidget.cpp index 89daee1b26d..5287791e856 100644 --- a/cpp/open3d/visualization/gui/ImageWidget.cpp +++ b/cpp/open3d/visualization/gui/ImageWidget.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/ImageWidget.h b/cpp/open3d/visualization/gui/ImageWidget.h index 778a2885aed..a251fdf90f2 100644 --- a/cpp/open3d/visualization/gui/ImageWidget.h +++ b/cpp/open3d/visualization/gui/ImageWidget.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/ImguiFilamentBridge.cpp b/cpp/open3d/visualization/gui/ImguiFilamentBridge.cpp index 243e3868a77..21a81a77b4a 100644 --- a/cpp/open3d/visualization/gui/ImguiFilamentBridge.cpp +++ b/cpp/open3d/visualization/gui/ImguiFilamentBridge.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Altered from Filament's ImGuiHelper.cpp diff --git a/cpp/open3d/visualization/gui/ImguiFilamentBridge.h b/cpp/open3d/visualization/gui/ImguiFilamentBridge.h index 8eae6c97b57..69708f7f761 100644 --- a/cpp/open3d/visualization/gui/ImguiFilamentBridge.h +++ b/cpp/open3d/visualization/gui/ImguiFilamentBridge.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Altered from Filament's ImGuiHelper.cpp diff --git a/cpp/open3d/visualization/gui/Label.cpp b/cpp/open3d/visualization/gui/Label.cpp index 60e257c7101..253c390f2ea 100644 --- a/cpp/open3d/visualization/gui/Label.cpp +++ b/cpp/open3d/visualization/gui/Label.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Label.h b/cpp/open3d/visualization/gui/Label.h index aa1e5cb071f..1192542b30e 100644 --- a/cpp/open3d/visualization/gui/Label.h +++ b/cpp/open3d/visualization/gui/Label.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Label3D.cpp b/cpp/open3d/visualization/gui/Label3D.cpp index 172f338f153..97bed9bb3c9 100644 --- a/cpp/open3d/visualization/gui/Label3D.cpp +++ b/cpp/open3d/visualization/gui/Label3D.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Label3D.h b/cpp/open3d/visualization/gui/Label3D.h index 06788b2f5a2..419da087842 100644 --- a/cpp/open3d/visualization/gui/Label3D.h +++ b/cpp/open3d/visualization/gui/Label3D.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Layout.cpp b/cpp/open3d/visualization/gui/Layout.cpp index f61c26eafe6..9df4c2b3735 100644 --- a/cpp/open3d/visualization/gui/Layout.cpp +++ b/cpp/open3d/visualization/gui/Layout.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Layout.h b/cpp/open3d/visualization/gui/Layout.h index 8d069e49273..96b9546994f 100644 --- a/cpp/open3d/visualization/gui/Layout.h +++ b/cpp/open3d/visualization/gui/Layout.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/ListView.cpp b/cpp/open3d/visualization/gui/ListView.cpp index 4d77f0bd1cd..184234dd974 100644 --- a/cpp/open3d/visualization/gui/ListView.cpp +++ b/cpp/open3d/visualization/gui/ListView.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/ListView.h b/cpp/open3d/visualization/gui/ListView.h index ac764be0974..c94cbbcf14f 100644 --- a/cpp/open3d/visualization/gui/ListView.h +++ b/cpp/open3d/visualization/gui/ListView.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Menu.cpp b/cpp/open3d/visualization/gui/Menu.cpp index 7c0e19e9eeb..1c340bdc178 100644 --- a/cpp/open3d/visualization/gui/Menu.cpp +++ b/cpp/open3d/visualization/gui/Menu.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Menu.h b/cpp/open3d/visualization/gui/Menu.h index 9efecd370b9..80381e99387 100644 --- a/cpp/open3d/visualization/gui/Menu.h +++ b/cpp/open3d/visualization/gui/Menu.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/MenuBase.h b/cpp/open3d/visualization/gui/MenuBase.h index f4ecebdf042..29c2f5a9776 100644 --- a/cpp/open3d/visualization/gui/MenuBase.h +++ b/cpp/open3d/visualization/gui/MenuBase.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/MenuImgui.cpp b/cpp/open3d/visualization/gui/MenuImgui.cpp index aba98ddb19c..430aedbd1db 100644 --- a/cpp/open3d/visualization/gui/MenuImgui.cpp +++ b/cpp/open3d/visualization/gui/MenuImgui.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/MenuImgui.h b/cpp/open3d/visualization/gui/MenuImgui.h index 01fc324cd71..b3d9e410941 100644 --- a/cpp/open3d/visualization/gui/MenuImgui.h +++ b/cpp/open3d/visualization/gui/MenuImgui.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/MenuMacOS.h b/cpp/open3d/visualization/gui/MenuMacOS.h index 6b1a8f277ab..b1b9132e00a 100644 --- a/cpp/open3d/visualization/gui/MenuMacOS.h +++ b/cpp/open3d/visualization/gui/MenuMacOS.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/MenuMacOS.mm b/cpp/open3d/visualization/gui/MenuMacOS.mm index 0f958d15f6c..812262536ab 100644 --- a/cpp/open3d/visualization/gui/MenuMacOS.mm +++ b/cpp/open3d/visualization/gui/MenuMacOS.mm @@ -3,7 +3,7 @@ // ---------------------------------------------------------------------------- // The MIT License (MIT) // -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cpp/open3d/visualization/gui/Native.h b/cpp/open3d/visualization/gui/Native.h index 1ad03de99df..e8b93f74690 100644 --- a/cpp/open3d/visualization/gui/Native.h +++ b/cpp/open3d/visualization/gui/Native.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/NativeLinux.cpp b/cpp/open3d/visualization/gui/NativeLinux.cpp index d6a64f1068c..89768633b9f 100644 --- a/cpp/open3d/visualization/gui/NativeLinux.cpp +++ b/cpp/open3d/visualization/gui/NativeLinux.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/NativeMacOS.mm b/cpp/open3d/visualization/gui/NativeMacOS.mm index 5803f731286..d3f113ff182 100644 --- a/cpp/open3d/visualization/gui/NativeMacOS.mm +++ b/cpp/open3d/visualization/gui/NativeMacOS.mm @@ -3,7 +3,7 @@ // ---------------------------------------------------------------------------- // The MIT License (MIT) // -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cpp/open3d/visualization/gui/NativeWin32.cpp b/cpp/open3d/visualization/gui/NativeWin32.cpp index 17918030e68..42c2f48b1e0 100644 --- a/cpp/open3d/visualization/gui/NativeWin32.cpp +++ b/cpp/open3d/visualization/gui/NativeWin32.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/NumberEdit.cpp b/cpp/open3d/visualization/gui/NumberEdit.cpp index 46bcfaa81d1..9f59d3dff02 100644 --- a/cpp/open3d/visualization/gui/NumberEdit.cpp +++ b/cpp/open3d/visualization/gui/NumberEdit.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/NumberEdit.h b/cpp/open3d/visualization/gui/NumberEdit.h index 3a86f97d3c3..04403bc030e 100644 --- a/cpp/open3d/visualization/gui/NumberEdit.h +++ b/cpp/open3d/visualization/gui/NumberEdit.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/PickPointsInteractor.cpp b/cpp/open3d/visualization/gui/PickPointsInteractor.cpp index 45ca7c44c1e..6df84f4d6a0 100644 --- a/cpp/open3d/visualization/gui/PickPointsInteractor.cpp +++ b/cpp/open3d/visualization/gui/PickPointsInteractor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/PickPointsInteractor.h b/cpp/open3d/visualization/gui/PickPointsInteractor.h index dd2e2646fba..9d173c4ad94 100644 --- a/cpp/open3d/visualization/gui/PickPointsInteractor.h +++ b/cpp/open3d/visualization/gui/PickPointsInteractor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/ProgressBar.cpp b/cpp/open3d/visualization/gui/ProgressBar.cpp index 0c930155a41..06b47c89278 100644 --- a/cpp/open3d/visualization/gui/ProgressBar.cpp +++ b/cpp/open3d/visualization/gui/ProgressBar.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/ProgressBar.h b/cpp/open3d/visualization/gui/ProgressBar.h index 5b86162022c..898c4a05af8 100644 --- a/cpp/open3d/visualization/gui/ProgressBar.h +++ b/cpp/open3d/visualization/gui/ProgressBar.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/RadioButton.cpp b/cpp/open3d/visualization/gui/RadioButton.cpp index 0c26b63ccff..e3eac680d3d 100644 --- a/cpp/open3d/visualization/gui/RadioButton.cpp +++ b/cpp/open3d/visualization/gui/RadioButton.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/RadioButton.h b/cpp/open3d/visualization/gui/RadioButton.h index c9f3021a032..d111efca1bf 100644 --- a/cpp/open3d/visualization/gui/RadioButton.h +++ b/cpp/open3d/visualization/gui/RadioButton.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/SceneWidget.cpp b/cpp/open3d/visualization/gui/SceneWidget.cpp index fe03ec73a7f..d0df7af860e 100644 --- a/cpp/open3d/visualization/gui/SceneWidget.cpp +++ b/cpp/open3d/visualization/gui/SceneWidget.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/SceneWidget.h b/cpp/open3d/visualization/gui/SceneWidget.h index 233c7918c01..3d9941cde42 100644 --- a/cpp/open3d/visualization/gui/SceneWidget.h +++ b/cpp/open3d/visualization/gui/SceneWidget.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Slider.cpp b/cpp/open3d/visualization/gui/Slider.cpp index 04267113377..425579c5a13 100644 --- a/cpp/open3d/visualization/gui/Slider.cpp +++ b/cpp/open3d/visualization/gui/Slider.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Slider.h b/cpp/open3d/visualization/gui/Slider.h index 5ad3c263e5a..0c81d41cb14 100644 --- a/cpp/open3d/visualization/gui/Slider.h +++ b/cpp/open3d/visualization/gui/Slider.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/StackedWidget.cpp b/cpp/open3d/visualization/gui/StackedWidget.cpp index 4bbca165aef..0e68dddaaca 100644 --- a/cpp/open3d/visualization/gui/StackedWidget.cpp +++ b/cpp/open3d/visualization/gui/StackedWidget.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/StackedWidget.h b/cpp/open3d/visualization/gui/StackedWidget.h index 455b1be11e1..13ed1f70d80 100644 --- a/cpp/open3d/visualization/gui/StackedWidget.h +++ b/cpp/open3d/visualization/gui/StackedWidget.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/TabControl.cpp b/cpp/open3d/visualization/gui/TabControl.cpp index baf516337af..81188b090c2 100644 --- a/cpp/open3d/visualization/gui/TabControl.cpp +++ b/cpp/open3d/visualization/gui/TabControl.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/TabControl.h b/cpp/open3d/visualization/gui/TabControl.h index 3912ec8f119..af6cae30c7a 100644 --- a/cpp/open3d/visualization/gui/TabControl.h +++ b/cpp/open3d/visualization/gui/TabControl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Task.cpp b/cpp/open3d/visualization/gui/Task.cpp index 075fb2f30de..79dde9eb552 100644 --- a/cpp/open3d/visualization/gui/Task.cpp +++ b/cpp/open3d/visualization/gui/Task.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Task.h b/cpp/open3d/visualization/gui/Task.h index c58080fdca6..3007f6680e5 100644 --- a/cpp/open3d/visualization/gui/Task.h +++ b/cpp/open3d/visualization/gui/Task.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/TextEdit.cpp b/cpp/open3d/visualization/gui/TextEdit.cpp index 13f859908ad..d720e1bb511 100644 --- a/cpp/open3d/visualization/gui/TextEdit.cpp +++ b/cpp/open3d/visualization/gui/TextEdit.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/TextEdit.h b/cpp/open3d/visualization/gui/TextEdit.h index 1e1ca5a2952..c94fd5305ba 100644 --- a/cpp/open3d/visualization/gui/TextEdit.h +++ b/cpp/open3d/visualization/gui/TextEdit.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Theme.cpp b/cpp/open3d/visualization/gui/Theme.cpp index e1736901835..e59f1027228 100644 --- a/cpp/open3d/visualization/gui/Theme.cpp +++ b/cpp/open3d/visualization/gui/Theme.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Theme.h b/cpp/open3d/visualization/gui/Theme.h index d00366bcd45..0ef630abf4f 100644 --- a/cpp/open3d/visualization/gui/Theme.h +++ b/cpp/open3d/visualization/gui/Theme.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/ToggleSwitch.cpp b/cpp/open3d/visualization/gui/ToggleSwitch.cpp index 24bc4f011dd..16c843f5fb1 100644 --- a/cpp/open3d/visualization/gui/ToggleSwitch.cpp +++ b/cpp/open3d/visualization/gui/ToggleSwitch.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/ToggleSwitch.h b/cpp/open3d/visualization/gui/ToggleSwitch.h index a1214635377..2b0aa5bf90c 100644 --- a/cpp/open3d/visualization/gui/ToggleSwitch.h +++ b/cpp/open3d/visualization/gui/ToggleSwitch.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/TreeView.cpp b/cpp/open3d/visualization/gui/TreeView.cpp index 19f934915f4..72fca10bd0e 100644 --- a/cpp/open3d/visualization/gui/TreeView.cpp +++ b/cpp/open3d/visualization/gui/TreeView.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/TreeView.h b/cpp/open3d/visualization/gui/TreeView.h index 176544f49ab..956f896149e 100644 --- a/cpp/open3d/visualization/gui/TreeView.h +++ b/cpp/open3d/visualization/gui/TreeView.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/UIImage.cpp b/cpp/open3d/visualization/gui/UIImage.cpp index 8932227fa65..561d9a15c3f 100644 --- a/cpp/open3d/visualization/gui/UIImage.cpp +++ b/cpp/open3d/visualization/gui/UIImage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/UIImage.h b/cpp/open3d/visualization/gui/UIImage.h index 235ff3d44bd..f95327b9d14 100644 --- a/cpp/open3d/visualization/gui/UIImage.h +++ b/cpp/open3d/visualization/gui/UIImage.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Util.cpp b/cpp/open3d/visualization/gui/Util.cpp index 123d1485507..05f4e49f190 100644 --- a/cpp/open3d/visualization/gui/Util.cpp +++ b/cpp/open3d/visualization/gui/Util.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Util.h b/cpp/open3d/visualization/gui/Util.h index 375933bd6dd..a7c7ead2909 100644 --- a/cpp/open3d/visualization/gui/Util.h +++ b/cpp/open3d/visualization/gui/Util.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/VectorEdit.cpp b/cpp/open3d/visualization/gui/VectorEdit.cpp index e2fccbb870e..646dd5bc602 100644 --- a/cpp/open3d/visualization/gui/VectorEdit.cpp +++ b/cpp/open3d/visualization/gui/VectorEdit.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/VectorEdit.h b/cpp/open3d/visualization/gui/VectorEdit.h index c92f7519d80..6ed6e718092 100644 --- a/cpp/open3d/visualization/gui/VectorEdit.h +++ b/cpp/open3d/visualization/gui/VectorEdit.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Widget.cpp b/cpp/open3d/visualization/gui/Widget.cpp index 2b577a4c809..d8ab028acda 100644 --- a/cpp/open3d/visualization/gui/Widget.cpp +++ b/cpp/open3d/visualization/gui/Widget.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Widget.h b/cpp/open3d/visualization/gui/Widget.h index 26a743c9258..a3fc46ac723 100644 --- a/cpp/open3d/visualization/gui/Widget.h +++ b/cpp/open3d/visualization/gui/Widget.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/WidgetProxy.cpp b/cpp/open3d/visualization/gui/WidgetProxy.cpp index 00ffc1522de..2ab2de2cd3a 100644 --- a/cpp/open3d/visualization/gui/WidgetProxy.cpp +++ b/cpp/open3d/visualization/gui/WidgetProxy.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/WidgetProxy.h b/cpp/open3d/visualization/gui/WidgetProxy.h index 30132ee506f..13389917300 100644 --- a/cpp/open3d/visualization/gui/WidgetProxy.h +++ b/cpp/open3d/visualization/gui/WidgetProxy.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/WidgetStack.cpp b/cpp/open3d/visualization/gui/WidgetStack.cpp index 5a7675b5fce..ac6ea6bc135 100644 --- a/cpp/open3d/visualization/gui/WidgetStack.cpp +++ b/cpp/open3d/visualization/gui/WidgetStack.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/WidgetStack.h b/cpp/open3d/visualization/gui/WidgetStack.h index 560539d45a3..4e591131a8a 100644 --- a/cpp/open3d/visualization/gui/WidgetStack.h +++ b/cpp/open3d/visualization/gui/WidgetStack.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Window.cpp b/cpp/open3d/visualization/gui/Window.cpp index bb023903792..3c9f2a315c5 100644 --- a/cpp/open3d/visualization/gui/Window.cpp +++ b/cpp/open3d/visualization/gui/Window.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/Window.h b/cpp/open3d/visualization/gui/Window.h index b186d760699..78e366329c5 100644 --- a/cpp/open3d/visualization/gui/Window.h +++ b/cpp/open3d/visualization/gui/Window.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/gui/WindowSystem.h b/cpp/open3d/visualization/gui/WindowSystem.h index 682e732acb7..f77ce15886f 100644 --- a/cpp/open3d/visualization/gui/WindowSystem.h +++ b/cpp/open3d/visualization/gui/WindowSystem.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Camera.cpp b/cpp/open3d/visualization/rendering/Camera.cpp index 0b0fac15654..071a36e9e0f 100644 --- a/cpp/open3d/visualization/rendering/Camera.cpp +++ b/cpp/open3d/visualization/rendering/Camera.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Camera.h b/cpp/open3d/visualization/rendering/Camera.h index 136d1e5f743..d1502ba7553 100644 --- a/cpp/open3d/visualization/rendering/Camera.h +++ b/cpp/open3d/visualization/rendering/Camera.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/CameraInteractorLogic.cpp b/cpp/open3d/visualization/rendering/CameraInteractorLogic.cpp index 1b4f2b5e10e..bc934303239 100644 --- a/cpp/open3d/visualization/rendering/CameraInteractorLogic.cpp +++ b/cpp/open3d/visualization/rendering/CameraInteractorLogic.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/CameraInteractorLogic.h b/cpp/open3d/visualization/rendering/CameraInteractorLogic.h index 5e80e4336bc..ea066c30073 100644 --- a/cpp/open3d/visualization/rendering/CameraInteractorLogic.h +++ b/cpp/open3d/visualization/rendering/CameraInteractorLogic.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/CameraSphereInteractorLogic.cpp b/cpp/open3d/visualization/rendering/CameraSphereInteractorLogic.cpp index 366fea30550..31e88338c7d 100644 --- a/cpp/open3d/visualization/rendering/CameraSphereInteractorLogic.cpp +++ b/cpp/open3d/visualization/rendering/CameraSphereInteractorLogic.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/CameraSphereInteractorLogic.h b/cpp/open3d/visualization/rendering/CameraSphereInteractorLogic.h index a2e8e67516f..0d92abbd57f 100644 --- a/cpp/open3d/visualization/rendering/CameraSphereInteractorLogic.h +++ b/cpp/open3d/visualization/rendering/CameraSphereInteractorLogic.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/ColorGrading.cpp b/cpp/open3d/visualization/rendering/ColorGrading.cpp index a7bd647965d..a10bb9f5b97 100644 --- a/cpp/open3d/visualization/rendering/ColorGrading.cpp +++ b/cpp/open3d/visualization/rendering/ColorGrading.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/ColorGrading.h b/cpp/open3d/visualization/rendering/ColorGrading.h index 7df7c8dde1f..4db57db4bef 100644 --- a/cpp/open3d/visualization/rendering/ColorGrading.h +++ b/cpp/open3d/visualization/rendering/ColorGrading.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Gradient.cpp b/cpp/open3d/visualization/rendering/Gradient.cpp index 04c6e287d4e..6a0d312003c 100644 --- a/cpp/open3d/visualization/rendering/Gradient.cpp +++ b/cpp/open3d/visualization/rendering/Gradient.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Gradient.h b/cpp/open3d/visualization/rendering/Gradient.h index 6c1b9f07401..74ad5398664 100644 --- a/cpp/open3d/visualization/rendering/Gradient.h +++ b/cpp/open3d/visualization/rendering/Gradient.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/IBLRotationInteractorLogic.cpp b/cpp/open3d/visualization/rendering/IBLRotationInteractorLogic.cpp index cbd6c511f06..b5d902dba7f 100644 --- a/cpp/open3d/visualization/rendering/IBLRotationInteractorLogic.cpp +++ b/cpp/open3d/visualization/rendering/IBLRotationInteractorLogic.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/IBLRotationInteractorLogic.h b/cpp/open3d/visualization/rendering/IBLRotationInteractorLogic.h index 10f33876bbe..bcac90a3053 100644 --- a/cpp/open3d/visualization/rendering/IBLRotationInteractorLogic.h +++ b/cpp/open3d/visualization/rendering/IBLRotationInteractorLogic.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Light.h b/cpp/open3d/visualization/rendering/Light.h index f0ca0a460c4..5538073b5f8 100644 --- a/cpp/open3d/visualization/rendering/Light.h +++ b/cpp/open3d/visualization/rendering/Light.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/LightDirectionInteractorLogic.cpp b/cpp/open3d/visualization/rendering/LightDirectionInteractorLogic.cpp index ab0d2cd1e42..ed840aea16d 100644 --- a/cpp/open3d/visualization/rendering/LightDirectionInteractorLogic.cpp +++ b/cpp/open3d/visualization/rendering/LightDirectionInteractorLogic.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/LightDirectionInteractorLogic.h b/cpp/open3d/visualization/rendering/LightDirectionInteractorLogic.h index 22bd97ba87b..92a22052248 100644 --- a/cpp/open3d/visualization/rendering/LightDirectionInteractorLogic.h +++ b/cpp/open3d/visualization/rendering/LightDirectionInteractorLogic.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Material.cpp b/cpp/open3d/visualization/rendering/Material.cpp index fad82623382..7c3ff9a6e94 100644 --- a/cpp/open3d/visualization/rendering/Material.cpp +++ b/cpp/open3d/visualization/rendering/Material.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Material.h b/cpp/open3d/visualization/rendering/Material.h index 7ee1396b281..8402730d152 100644 --- a/cpp/open3d/visualization/rendering/Material.h +++ b/cpp/open3d/visualization/rendering/Material.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/MaterialModifier.cpp b/cpp/open3d/visualization/rendering/MaterialModifier.cpp index c7490f3b888..77b560d0a13 100644 --- a/cpp/open3d/visualization/rendering/MaterialModifier.cpp +++ b/cpp/open3d/visualization/rendering/MaterialModifier.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/MaterialModifier.h b/cpp/open3d/visualization/rendering/MaterialModifier.h index 7c4a87bab03..e9cc11eaa24 100644 --- a/cpp/open3d/visualization/rendering/MaterialModifier.h +++ b/cpp/open3d/visualization/rendering/MaterialModifier.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/MaterialRecord.h b/cpp/open3d/visualization/rendering/MaterialRecord.h index 987099f1816..6822cbaf1ff 100644 --- a/cpp/open3d/visualization/rendering/MaterialRecord.h +++ b/cpp/open3d/visualization/rendering/MaterialRecord.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/MatrixInteractorLogic.cpp b/cpp/open3d/visualization/rendering/MatrixInteractorLogic.cpp index f61e4628217..bf547fe7d4e 100644 --- a/cpp/open3d/visualization/rendering/MatrixInteractorLogic.cpp +++ b/cpp/open3d/visualization/rendering/MatrixInteractorLogic.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/MatrixInteractorLogic.h b/cpp/open3d/visualization/rendering/MatrixInteractorLogic.h index c8976fc43cf..7457c579e8b 100644 --- a/cpp/open3d/visualization/rendering/MatrixInteractorLogic.h +++ b/cpp/open3d/visualization/rendering/MatrixInteractorLogic.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Model.h b/cpp/open3d/visualization/rendering/Model.h index 68ad6d4f5ed..070cecd1e28 100644 --- a/cpp/open3d/visualization/rendering/Model.h +++ b/cpp/open3d/visualization/rendering/Model.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/ModelInteractorLogic.cpp b/cpp/open3d/visualization/rendering/ModelInteractorLogic.cpp index 8814200627a..b6d3331aad4 100644 --- a/cpp/open3d/visualization/rendering/ModelInteractorLogic.cpp +++ b/cpp/open3d/visualization/rendering/ModelInteractorLogic.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/ModelInteractorLogic.h b/cpp/open3d/visualization/rendering/ModelInteractorLogic.h index e072d9ea336..7c5781f84cc 100644 --- a/cpp/open3d/visualization/rendering/ModelInteractorLogic.h +++ b/cpp/open3d/visualization/rendering/ModelInteractorLogic.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Open3DScene.cpp b/cpp/open3d/visualization/rendering/Open3DScene.cpp index dacd926ec1f..c0142da8fb2 100644 --- a/cpp/open3d/visualization/rendering/Open3DScene.cpp +++ b/cpp/open3d/visualization/rendering/Open3DScene.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Open3DScene.h b/cpp/open3d/visualization/rendering/Open3DScene.h index 28e7bdb36e2..5c3e0dce8f8 100644 --- a/cpp/open3d/visualization/rendering/Open3DScene.h +++ b/cpp/open3d/visualization/rendering/Open3DScene.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/RenderToBuffer.h b/cpp/open3d/visualization/rendering/RenderToBuffer.h index ee124a63859..97265e66ed7 100644 --- a/cpp/open3d/visualization/rendering/RenderToBuffer.h +++ b/cpp/open3d/visualization/rendering/RenderToBuffer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Renderer.cpp b/cpp/open3d/visualization/rendering/Renderer.cpp index 7ccf91a876b..78eae53f981 100644 --- a/cpp/open3d/visualization/rendering/Renderer.cpp +++ b/cpp/open3d/visualization/rendering/Renderer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Renderer.h b/cpp/open3d/visualization/rendering/Renderer.h index b642e4b6d46..fc787662103 100644 --- a/cpp/open3d/visualization/rendering/Renderer.h +++ b/cpp/open3d/visualization/rendering/Renderer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/RendererHandle.cpp b/cpp/open3d/visualization/rendering/RendererHandle.cpp index 127606f7dd5..42d150788a7 100644 --- a/cpp/open3d/visualization/rendering/RendererHandle.cpp +++ b/cpp/open3d/visualization/rendering/RendererHandle.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/RendererHandle.h b/cpp/open3d/visualization/rendering/RendererHandle.h index 45b59a70c60..c27f7749963 100644 --- a/cpp/open3d/visualization/rendering/RendererHandle.h +++ b/cpp/open3d/visualization/rendering/RendererHandle.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/RendererStructs.h b/cpp/open3d/visualization/rendering/RendererStructs.h index e07901c9ac0..e1b053a72a6 100644 --- a/cpp/open3d/visualization/rendering/RendererStructs.h +++ b/cpp/open3d/visualization/rendering/RendererStructs.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/RotationInteractorLogic.cpp b/cpp/open3d/visualization/rendering/RotationInteractorLogic.cpp index e909412b846..f311ce1e841 100644 --- a/cpp/open3d/visualization/rendering/RotationInteractorLogic.cpp +++ b/cpp/open3d/visualization/rendering/RotationInteractorLogic.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/RotationInteractorLogic.h b/cpp/open3d/visualization/rendering/RotationInteractorLogic.h index 1371950cff8..9b108ea102d 100644 --- a/cpp/open3d/visualization/rendering/RotationInteractorLogic.h +++ b/cpp/open3d/visualization/rendering/RotationInteractorLogic.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/Scene.h b/cpp/open3d/visualization/rendering/Scene.h index 75578f39f89..cbf9eb3efb4 100644 --- a/cpp/open3d/visualization/rendering/Scene.h +++ b/cpp/open3d/visualization/rendering/Scene.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/View.h b/cpp/open3d/visualization/rendering/View.h index f9a586b59fc..cd29b6a4df2 100644 --- a/cpp/open3d/visualization/rendering/View.h +++ b/cpp/open3d/visualization/rendering/View.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentCamera.cpp b/cpp/open3d/visualization/rendering/filament/FilamentCamera.cpp index 31f8572392e..553bfe91815 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentCamera.cpp +++ b/cpp/open3d/visualization/rendering/filament/FilamentCamera.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentCamera.h b/cpp/open3d/visualization/rendering/filament/FilamentCamera.h index 29d30249257..90da81a245e 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentCamera.h +++ b/cpp/open3d/visualization/rendering/filament/FilamentCamera.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentEngine.cpp b/cpp/open3d/visualization/rendering/filament/FilamentEngine.cpp index f3d03ebec40..f90b00d5a03 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentEngine.cpp +++ b/cpp/open3d/visualization/rendering/filament/FilamentEngine.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentEngine.h b/cpp/open3d/visualization/rendering/filament/FilamentEngine.h index 834acca20b8..f270279ff97 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentEngine.h +++ b/cpp/open3d/visualization/rendering/filament/FilamentEngine.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentEntitiesMods.cpp b/cpp/open3d/visualization/rendering/filament/FilamentEntitiesMods.cpp index feadc341780..68fa808b8b3 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentEntitiesMods.cpp +++ b/cpp/open3d/visualization/rendering/filament/FilamentEntitiesMods.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentEntitiesMods.h b/cpp/open3d/visualization/rendering/filament/FilamentEntitiesMods.h index ea99c2fa145..80fa1971f3e 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentEntitiesMods.h +++ b/cpp/open3d/visualization/rendering/filament/FilamentEntitiesMods.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentGeometryBuffersBuilder.cpp b/cpp/open3d/visualization/rendering/filament/FilamentGeometryBuffersBuilder.cpp index fc2c40ea1b2..fe3dbd39bf7 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentGeometryBuffersBuilder.cpp +++ b/cpp/open3d/visualization/rendering/filament/FilamentGeometryBuffersBuilder.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentGeometryBuffersBuilder.h b/cpp/open3d/visualization/rendering/filament/FilamentGeometryBuffersBuilder.h index 0d6271c8894..afaa4a84831 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentGeometryBuffersBuilder.h +++ b/cpp/open3d/visualization/rendering/filament/FilamentGeometryBuffersBuilder.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentRenderToBuffer.cpp b/cpp/open3d/visualization/rendering/filament/FilamentRenderToBuffer.cpp index cb5525754e9..cbcdabde889 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentRenderToBuffer.cpp +++ b/cpp/open3d/visualization/rendering/filament/FilamentRenderToBuffer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentRenderToBuffer.h b/cpp/open3d/visualization/rendering/filament/FilamentRenderToBuffer.h index cf19fd9c01c..3817b27e96b 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentRenderToBuffer.h +++ b/cpp/open3d/visualization/rendering/filament/FilamentRenderToBuffer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentRenderer.cpp b/cpp/open3d/visualization/rendering/filament/FilamentRenderer.cpp index e7ea9771cae..8600de2db4f 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentRenderer.cpp +++ b/cpp/open3d/visualization/rendering/filament/FilamentRenderer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentRenderer.h b/cpp/open3d/visualization/rendering/filament/FilamentRenderer.h index 097f341108d..8c89cfd0a80 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentRenderer.h +++ b/cpp/open3d/visualization/rendering/filament/FilamentRenderer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentResourceManager.cpp b/cpp/open3d/visualization/rendering/filament/FilamentResourceManager.cpp index 0c831e9d2d0..e4fc90faa8f 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentResourceManager.cpp +++ b/cpp/open3d/visualization/rendering/filament/FilamentResourceManager.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentResourceManager.h b/cpp/open3d/visualization/rendering/filament/FilamentResourceManager.h index 606d590f447..d3a6716bbab 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentResourceManager.h +++ b/cpp/open3d/visualization/rendering/filament/FilamentResourceManager.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentScene.cpp b/cpp/open3d/visualization/rendering/filament/FilamentScene.cpp index 64dffe9dc69..f3698bdaa72 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentScene.cpp +++ b/cpp/open3d/visualization/rendering/filament/FilamentScene.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentScene.h b/cpp/open3d/visualization/rendering/filament/FilamentScene.h index f956d7c5888..4556f895441 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentScene.h +++ b/cpp/open3d/visualization/rendering/filament/FilamentScene.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentView.cpp b/cpp/open3d/visualization/rendering/filament/FilamentView.cpp index 2a11feff3f0..8022905dd10 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentView.cpp +++ b/cpp/open3d/visualization/rendering/filament/FilamentView.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/FilamentView.h b/cpp/open3d/visualization/rendering/filament/FilamentView.h index 8af6b63d9a6..792e0d2c149 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentView.h +++ b/cpp/open3d/visualization/rendering/filament/FilamentView.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/LineSetBuffers.cpp b/cpp/open3d/visualization/rendering/filament/LineSetBuffers.cpp index 88d5230556f..2e14cfbca48 100644 --- a/cpp/open3d/visualization/rendering/filament/LineSetBuffers.cpp +++ b/cpp/open3d/visualization/rendering/filament/LineSetBuffers.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/PointCloudBuffers.cpp b/cpp/open3d/visualization/rendering/filament/PointCloudBuffers.cpp index 014d4b0562a..2d0c1295ed6 100644 --- a/cpp/open3d/visualization/rendering/filament/PointCloudBuffers.cpp +++ b/cpp/open3d/visualization/rendering/filament/PointCloudBuffers.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/rendering/filament/TriangleMeshBuffers.cpp b/cpp/open3d/visualization/rendering/filament/TriangleMeshBuffers.cpp index a3edcccd540..776e7011191 100644 --- a/cpp/open3d/visualization/rendering/filament/TriangleMeshBuffers.cpp +++ b/cpp/open3d/visualization/rendering/filament/TriangleMeshBuffers.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/GeometryRenderer.cpp b/cpp/open3d/visualization/shader/GeometryRenderer.cpp index 9725103d080..fb24a822ebf 100644 --- a/cpp/open3d/visualization/shader/GeometryRenderer.cpp +++ b/cpp/open3d/visualization/shader/GeometryRenderer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/GeometryRenderer.h b/cpp/open3d/visualization/shader/GeometryRenderer.h index 21230eab20f..5952c6a3e48 100644 --- a/cpp/open3d/visualization/shader/GeometryRenderer.h +++ b/cpp/open3d/visualization/shader/GeometryRenderer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/ImageMaskShader.cpp b/cpp/open3d/visualization/shader/ImageMaskShader.cpp index a63046e0dd6..9bfbeb57e89 100644 --- a/cpp/open3d/visualization/shader/ImageMaskShader.cpp +++ b/cpp/open3d/visualization/shader/ImageMaskShader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/ImageMaskShader.h b/cpp/open3d/visualization/shader/ImageMaskShader.h index c5ed2239ff0..c549525fd49 100644 --- a/cpp/open3d/visualization/shader/ImageMaskShader.h +++ b/cpp/open3d/visualization/shader/ImageMaskShader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/ImageShader.cpp b/cpp/open3d/visualization/shader/ImageShader.cpp index ed9c952028e..9f3baffc586 100644 --- a/cpp/open3d/visualization/shader/ImageShader.cpp +++ b/cpp/open3d/visualization/shader/ImageShader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/ImageShader.h b/cpp/open3d/visualization/shader/ImageShader.h index 9b5d78ac717..e6340ca5232 100644 --- a/cpp/open3d/visualization/shader/ImageShader.h +++ b/cpp/open3d/visualization/shader/ImageShader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/NormalShader.cpp b/cpp/open3d/visualization/shader/NormalShader.cpp index 46fc78a7c83..33ffe9d3400 100644 --- a/cpp/open3d/visualization/shader/NormalShader.cpp +++ b/cpp/open3d/visualization/shader/NormalShader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/NormalShader.h b/cpp/open3d/visualization/shader/NormalShader.h index cb0c6a95b13..4f05686554d 100644 --- a/cpp/open3d/visualization/shader/NormalShader.h +++ b/cpp/open3d/visualization/shader/NormalShader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/PhongShader.cpp b/cpp/open3d/visualization/shader/PhongShader.cpp index 5b4ac86df50..b50694579cd 100644 --- a/cpp/open3d/visualization/shader/PhongShader.cpp +++ b/cpp/open3d/visualization/shader/PhongShader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/PhongShader.h b/cpp/open3d/visualization/shader/PhongShader.h index d58b68d1bac..9859aee1f8f 100644 --- a/cpp/open3d/visualization/shader/PhongShader.h +++ b/cpp/open3d/visualization/shader/PhongShader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/PickingShader.cpp b/cpp/open3d/visualization/shader/PickingShader.cpp index d712e3a2af1..2b35b285388 100644 --- a/cpp/open3d/visualization/shader/PickingShader.cpp +++ b/cpp/open3d/visualization/shader/PickingShader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/PickingShader.h b/cpp/open3d/visualization/shader/PickingShader.h index f76f2314953..040f2c1cbb3 100644 --- a/cpp/open3d/visualization/shader/PickingShader.h +++ b/cpp/open3d/visualization/shader/PickingShader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/RGBDImageShader.cpp b/cpp/open3d/visualization/shader/RGBDImageShader.cpp index d63c608a601..e311d421542 100644 --- a/cpp/open3d/visualization/shader/RGBDImageShader.cpp +++ b/cpp/open3d/visualization/shader/RGBDImageShader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/RGBDImageShader.h b/cpp/open3d/visualization/shader/RGBDImageShader.h index 02a83f6da73..642672d28ee 100644 --- a/cpp/open3d/visualization/shader/RGBDImageShader.h +++ b/cpp/open3d/visualization/shader/RGBDImageShader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/ShaderWrapper.cpp b/cpp/open3d/visualization/shader/ShaderWrapper.cpp index 84f770fc64c..84e35d26f41 100644 --- a/cpp/open3d/visualization/shader/ShaderWrapper.cpp +++ b/cpp/open3d/visualization/shader/ShaderWrapper.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/ShaderWrapper.h b/cpp/open3d/visualization/shader/ShaderWrapper.h index 7f41b9aff23..db053fb80cb 100644 --- a/cpp/open3d/visualization/shader/ShaderWrapper.h +++ b/cpp/open3d/visualization/shader/ShaderWrapper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/Simple2DShader.cpp b/cpp/open3d/visualization/shader/Simple2DShader.cpp index e96da9acb0e..4a204d0dbf7 100644 --- a/cpp/open3d/visualization/shader/Simple2DShader.cpp +++ b/cpp/open3d/visualization/shader/Simple2DShader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/Simple2DShader.h b/cpp/open3d/visualization/shader/Simple2DShader.h index 44d147310f2..32fa3e935f1 100644 --- a/cpp/open3d/visualization/shader/Simple2DShader.h +++ b/cpp/open3d/visualization/shader/Simple2DShader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/SimpleBlackShader.cpp b/cpp/open3d/visualization/shader/SimpleBlackShader.cpp index 48e2a69bdc1..e45d5d1abb1 100644 --- a/cpp/open3d/visualization/shader/SimpleBlackShader.cpp +++ b/cpp/open3d/visualization/shader/SimpleBlackShader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/SimpleBlackShader.h b/cpp/open3d/visualization/shader/SimpleBlackShader.h index 06384f86d6c..94059ec10bb 100644 --- a/cpp/open3d/visualization/shader/SimpleBlackShader.h +++ b/cpp/open3d/visualization/shader/SimpleBlackShader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/SimpleShader.cpp b/cpp/open3d/visualization/shader/SimpleShader.cpp index d25bfb3412a..c14db429639 100644 --- a/cpp/open3d/visualization/shader/SimpleShader.cpp +++ b/cpp/open3d/visualization/shader/SimpleShader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/SimpleShader.h b/cpp/open3d/visualization/shader/SimpleShader.h index 5262f5485ed..e5bd2cbaa23 100644 --- a/cpp/open3d/visualization/shader/SimpleShader.h +++ b/cpp/open3d/visualization/shader/SimpleShader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/TexturePhongShader.cpp b/cpp/open3d/visualization/shader/TexturePhongShader.cpp index 0c69f18a177..c4256c070a7 100644 --- a/cpp/open3d/visualization/shader/TexturePhongShader.cpp +++ b/cpp/open3d/visualization/shader/TexturePhongShader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/TexturePhongShader.h b/cpp/open3d/visualization/shader/TexturePhongShader.h index 6f469546808..86ef6e2a94b 100644 --- a/cpp/open3d/visualization/shader/TexturePhongShader.h +++ b/cpp/open3d/visualization/shader/TexturePhongShader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/TextureSimpleShader.cpp b/cpp/open3d/visualization/shader/TextureSimpleShader.cpp index 7b1b88723da..0e9a428728d 100644 --- a/cpp/open3d/visualization/shader/TextureSimpleShader.cpp +++ b/cpp/open3d/visualization/shader/TextureSimpleShader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/shader/TextureSimpleShader.h b/cpp/open3d/visualization/shader/TextureSimpleShader.h index 6980beabee8..ae696e24afb 100644 --- a/cpp/open3d/visualization/shader/TextureSimpleShader.h +++ b/cpp/open3d/visualization/shader/TextureSimpleShader.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/ColorMap.cpp b/cpp/open3d/visualization/utility/ColorMap.cpp index cd2f9f02c03..71530c1982a 100644 --- a/cpp/open3d/visualization/utility/ColorMap.cpp +++ b/cpp/open3d/visualization/utility/ColorMap.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/ColorMap.h b/cpp/open3d/visualization/utility/ColorMap.h index 59c6b66b6fe..6f620581a9e 100644 --- a/cpp/open3d/visualization/utility/ColorMap.h +++ b/cpp/open3d/visualization/utility/ColorMap.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/Draw.cpp b/cpp/open3d/visualization/utility/Draw.cpp index fac8b6fe1ec..6bb9e8817af 100644 --- a/cpp/open3d/visualization/utility/Draw.cpp +++ b/cpp/open3d/visualization/utility/Draw.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/Draw.h b/cpp/open3d/visualization/utility/Draw.h index 9a51dffa16a..dba40b3e355 100644 --- a/cpp/open3d/visualization/utility/Draw.h +++ b/cpp/open3d/visualization/utility/Draw.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/DrawGeometry.cpp b/cpp/open3d/visualization/utility/DrawGeometry.cpp index a03c54ead87..e057e393f29 100644 --- a/cpp/open3d/visualization/utility/DrawGeometry.cpp +++ b/cpp/open3d/visualization/utility/DrawGeometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/DrawGeometry.h b/cpp/open3d/visualization/utility/DrawGeometry.h index 6650787bc2a..3d55e1e78cb 100644 --- a/cpp/open3d/visualization/utility/DrawGeometry.h +++ b/cpp/open3d/visualization/utility/DrawGeometry.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/GLHelper.cpp b/cpp/open3d/visualization/utility/GLHelper.cpp index c0ab2d992ef..81e1cb3087c 100644 --- a/cpp/open3d/visualization/utility/GLHelper.cpp +++ b/cpp/open3d/visualization/utility/GLHelper.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/GLHelper.h b/cpp/open3d/visualization/utility/GLHelper.h index 02020b75067..76e5eab94a0 100644 --- a/cpp/open3d/visualization/utility/GLHelper.h +++ b/cpp/open3d/visualization/utility/GLHelper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/PointCloudPicker.cpp b/cpp/open3d/visualization/utility/PointCloudPicker.cpp index 6e43f541e0f..77c8f2f05a3 100644 --- a/cpp/open3d/visualization/utility/PointCloudPicker.cpp +++ b/cpp/open3d/visualization/utility/PointCloudPicker.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/PointCloudPicker.h b/cpp/open3d/visualization/utility/PointCloudPicker.h index 213f935445c..915e65b44e9 100644 --- a/cpp/open3d/visualization/utility/PointCloudPicker.h +++ b/cpp/open3d/visualization/utility/PointCloudPicker.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/SelectionPolygon.cpp b/cpp/open3d/visualization/utility/SelectionPolygon.cpp index d1437b24fe9..227ff55db01 100644 --- a/cpp/open3d/visualization/utility/SelectionPolygon.cpp +++ b/cpp/open3d/visualization/utility/SelectionPolygon.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/SelectionPolygon.h b/cpp/open3d/visualization/utility/SelectionPolygon.h index 4cb778f7e5e..4cdc40cae87 100644 --- a/cpp/open3d/visualization/utility/SelectionPolygon.h +++ b/cpp/open3d/visualization/utility/SelectionPolygon.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/SelectionPolygonVolume.cpp b/cpp/open3d/visualization/utility/SelectionPolygonVolume.cpp index f02472ca6e8..fbbfaa38eeb 100644 --- a/cpp/open3d/visualization/utility/SelectionPolygonVolume.cpp +++ b/cpp/open3d/visualization/utility/SelectionPolygonVolume.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/utility/SelectionPolygonVolume.h b/cpp/open3d/visualization/utility/SelectionPolygonVolume.h index 614058eba3d..c6e6ec87e0f 100644 --- a/cpp/open3d/visualization/utility/SelectionPolygonVolume.h +++ b/cpp/open3d/visualization/utility/SelectionPolygonVolume.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/GuiSettingsModel.cpp b/cpp/open3d/visualization/visualizer/GuiSettingsModel.cpp index 71c5db0ebff..ddb21ff5ba5 100644 --- a/cpp/open3d/visualization/visualizer/GuiSettingsModel.cpp +++ b/cpp/open3d/visualization/visualizer/GuiSettingsModel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/GuiSettingsModel.h b/cpp/open3d/visualization/visualizer/GuiSettingsModel.h index 307ebec9691..cb179a6b51c 100644 --- a/cpp/open3d/visualization/visualizer/GuiSettingsModel.h +++ b/cpp/open3d/visualization/visualizer/GuiSettingsModel.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/GuiSettingsView.cpp b/cpp/open3d/visualization/visualizer/GuiSettingsView.cpp index f9ecd658358..a7d44acc2dd 100644 --- a/cpp/open3d/visualization/visualizer/GuiSettingsView.cpp +++ b/cpp/open3d/visualization/visualizer/GuiSettingsView.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/GuiSettingsView.h b/cpp/open3d/visualization/visualizer/GuiSettingsView.h index 0eab298b8b6..10e81f9fc43 100644 --- a/cpp/open3d/visualization/visualizer/GuiSettingsView.h +++ b/cpp/open3d/visualization/visualizer/GuiSettingsView.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/GuiVisualizer.cpp b/cpp/open3d/visualization/visualizer/GuiVisualizer.cpp index 545ee98001e..4994a9297e7 100644 --- a/cpp/open3d/visualization/visualizer/GuiVisualizer.cpp +++ b/cpp/open3d/visualization/visualizer/GuiVisualizer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- @@ -65,7 +65,7 @@ std::shared_ptr CreateAboutDialog(gui::Window *window) { (std::string("Open3D ") + OPEN3D_VERSION).c_str()); auto text = std::make_shared( "The MIT License (MIT)\n" - "Copyright (c) 2018-2023 www.open3d.org\n\n" + "Copyright (c) 2018-2024 www.open3d.org\n\n" "Permission is hereby granted, free of charge, to any person " "obtaining a copy of this software and associated documentation " diff --git a/cpp/open3d/visualization/visualizer/GuiVisualizer.h b/cpp/open3d/visualization/visualizer/GuiVisualizer.h index 4f8a0e9087d..7ae59ae22dd 100644 --- a/cpp/open3d/visualization/visualizer/GuiVisualizer.h +++ b/cpp/open3d/visualization/visualizer/GuiVisualizer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/GuiWidgets.cpp b/cpp/open3d/visualization/visualizer/GuiWidgets.cpp index 3d6ac28ecbd..5cd444afc58 100644 --- a/cpp/open3d/visualization/visualizer/GuiWidgets.cpp +++ b/cpp/open3d/visualization/visualizer/GuiWidgets.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/GuiWidgets.h b/cpp/open3d/visualization/visualizer/GuiWidgets.h index dcc2ef38b71..1ddf304617d 100644 --- a/cpp/open3d/visualization/visualizer/GuiWidgets.h +++ b/cpp/open3d/visualization/visualizer/GuiWidgets.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/MessageProcessor.cpp b/cpp/open3d/visualization/visualizer/MessageProcessor.cpp index ea637efe76a..1300ec915c3 100644 --- a/cpp/open3d/visualization/visualizer/MessageProcessor.cpp +++ b/cpp/open3d/visualization/visualizer/MessageProcessor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/MessageProcessor.h b/cpp/open3d/visualization/visualizer/MessageProcessor.h index 3525c5e0e30..c75773f1a47 100644 --- a/cpp/open3d/visualization/visualizer/MessageProcessor.h +++ b/cpp/open3d/visualization/visualizer/MessageProcessor.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp b/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp index 3ab06cec1b9..46c0141b997 100644 --- a/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp +++ b/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- @@ -2112,7 +2112,7 @@ struct O3DVisualizer::Impl { (std::string("Open3D ") + OPEN3D_VERSION).c_str()); auto text = std::make_shared( "The MIT License (MIT)\n" - "Copyright (c) 2018-2023 www.open3d.org\n\n" + "Copyright (c) 2018-2024 www.open3d.org\n\n" "Permission is hereby granted, free of charge, to any person " "obtaining a copy of this software and associated " diff --git a/cpp/open3d/visualization/visualizer/O3DVisualizer.h b/cpp/open3d/visualization/visualizer/O3DVisualizer.h index 4ceec56de76..6196f6daea2 100644 --- a/cpp/open3d/visualization/visualizer/O3DVisualizer.h +++ b/cpp/open3d/visualization/visualizer/O3DVisualizer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/O3DVisualizerSelections.cpp b/cpp/open3d/visualization/visualizer/O3DVisualizerSelections.cpp index ed2370adc3a..e245dda3b23 100644 --- a/cpp/open3d/visualization/visualizer/O3DVisualizerSelections.cpp +++ b/cpp/open3d/visualization/visualizer/O3DVisualizerSelections.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/O3DVisualizerSelections.h b/cpp/open3d/visualization/visualizer/O3DVisualizerSelections.h index 38d4c5898e1..dd1f8eddb43 100644 --- a/cpp/open3d/visualization/visualizer/O3DVisualizerSelections.h +++ b/cpp/open3d/visualization/visualizer/O3DVisualizerSelections.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/RenderOption.cpp b/cpp/open3d/visualization/visualizer/RenderOption.cpp index d4617edff69..1ae831d0400 100644 --- a/cpp/open3d/visualization/visualizer/RenderOption.cpp +++ b/cpp/open3d/visualization/visualizer/RenderOption.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/RenderOption.h b/cpp/open3d/visualization/visualizer/RenderOption.h index 83f22e9bc41..918b339cca4 100644 --- a/cpp/open3d/visualization/visualizer/RenderOption.h +++ b/cpp/open3d/visualization/visualizer/RenderOption.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/RenderOptionWithEditing.cpp b/cpp/open3d/visualization/visualizer/RenderOptionWithEditing.cpp index 3fecb139af9..690e3a8617b 100644 --- a/cpp/open3d/visualization/visualizer/RenderOptionWithEditing.cpp +++ b/cpp/open3d/visualization/visualizer/RenderOptionWithEditing.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/RenderOptionWithEditing.h b/cpp/open3d/visualization/visualizer/RenderOptionWithEditing.h index bd4bf0befdd..9f642f81b10 100644 --- a/cpp/open3d/visualization/visualizer/RenderOptionWithEditing.h +++ b/cpp/open3d/visualization/visualizer/RenderOptionWithEditing.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/ViewControl.cpp b/cpp/open3d/visualization/visualizer/ViewControl.cpp index a4dff55a64a..164254e0a2e 100644 --- a/cpp/open3d/visualization/visualizer/ViewControl.cpp +++ b/cpp/open3d/visualization/visualizer/ViewControl.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/ViewControl.h b/cpp/open3d/visualization/visualizer/ViewControl.h index 7d438427210..19dd7c7f92b 100644 --- a/cpp/open3d/visualization/visualizer/ViewControl.h +++ b/cpp/open3d/visualization/visualizer/ViewControl.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/ViewControlWithCustomAnimation.cpp b/cpp/open3d/visualization/visualizer/ViewControlWithCustomAnimation.cpp index b176706aece..dc4d9a77408 100644 --- a/cpp/open3d/visualization/visualizer/ViewControlWithCustomAnimation.cpp +++ b/cpp/open3d/visualization/visualizer/ViewControlWithCustomAnimation.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/ViewControlWithCustomAnimation.h b/cpp/open3d/visualization/visualizer/ViewControlWithCustomAnimation.h index 0155ecf80e5..e2fba484dc5 100644 --- a/cpp/open3d/visualization/visualizer/ViewControlWithCustomAnimation.h +++ b/cpp/open3d/visualization/visualizer/ViewControlWithCustomAnimation.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/ViewControlWithEditing.cpp b/cpp/open3d/visualization/visualizer/ViewControlWithEditing.cpp index a11b0ad3eba..3122b4e133b 100644 --- a/cpp/open3d/visualization/visualizer/ViewControlWithEditing.cpp +++ b/cpp/open3d/visualization/visualizer/ViewControlWithEditing.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/ViewControlWithEditing.h b/cpp/open3d/visualization/visualizer/ViewControlWithEditing.h index c1fa57e992d..ae652912051 100644 --- a/cpp/open3d/visualization/visualizer/ViewControlWithEditing.h +++ b/cpp/open3d/visualization/visualizer/ViewControlWithEditing.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/ViewParameters.cpp b/cpp/open3d/visualization/visualizer/ViewParameters.cpp index c3d3dd3f0a7..d80358d2b0f 100644 --- a/cpp/open3d/visualization/visualizer/ViewParameters.cpp +++ b/cpp/open3d/visualization/visualizer/ViewParameters.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/ViewParameters.h b/cpp/open3d/visualization/visualizer/ViewParameters.h index 41541895677..7ee6bb72510 100644 --- a/cpp/open3d/visualization/visualizer/ViewParameters.h +++ b/cpp/open3d/visualization/visualizer/ViewParameters.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/ViewTrajectory.cpp b/cpp/open3d/visualization/visualizer/ViewTrajectory.cpp index e3435b76a71..947c2bb51a1 100644 --- a/cpp/open3d/visualization/visualizer/ViewTrajectory.cpp +++ b/cpp/open3d/visualization/visualizer/ViewTrajectory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/ViewTrajectory.h b/cpp/open3d/visualization/visualizer/ViewTrajectory.h index e3f93303420..8ce08403164 100644 --- a/cpp/open3d/visualization/visualizer/ViewTrajectory.h +++ b/cpp/open3d/visualization/visualizer/ViewTrajectory.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/Visualizer.cpp b/cpp/open3d/visualization/visualizer/Visualizer.cpp index 216c4898a0a..37b24827e49 100644 --- a/cpp/open3d/visualization/visualizer/Visualizer.cpp +++ b/cpp/open3d/visualization/visualizer/Visualizer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/Visualizer.h b/cpp/open3d/visualization/visualizer/Visualizer.h index 3d72d54ee41..7a2cd149baa 100644 --- a/cpp/open3d/visualization/visualizer/Visualizer.h +++ b/cpp/open3d/visualization/visualizer/Visualizer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/VisualizerCallback.cpp b/cpp/open3d/visualization/visualizer/VisualizerCallback.cpp index d9482407e89..93eeec8d35c 100644 --- a/cpp/open3d/visualization/visualizer/VisualizerCallback.cpp +++ b/cpp/open3d/visualization/visualizer/VisualizerCallback.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/VisualizerRender.cpp b/cpp/open3d/visualization/visualizer/VisualizerRender.cpp index 175d11f99f8..9ca5c966da2 100644 --- a/cpp/open3d/visualization/visualizer/VisualizerRender.cpp +++ b/cpp/open3d/visualization/visualizer/VisualizerRender.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/VisualizerWithCustomAnimation.cpp b/cpp/open3d/visualization/visualizer/VisualizerWithCustomAnimation.cpp index afc39224794..8f1c6e387c4 100644 --- a/cpp/open3d/visualization/visualizer/VisualizerWithCustomAnimation.cpp +++ b/cpp/open3d/visualization/visualizer/VisualizerWithCustomAnimation.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/VisualizerWithCustomAnimation.h b/cpp/open3d/visualization/visualizer/VisualizerWithCustomAnimation.h index f3d8e1b0c55..836995eb823 100644 --- a/cpp/open3d/visualization/visualizer/VisualizerWithCustomAnimation.h +++ b/cpp/open3d/visualization/visualizer/VisualizerWithCustomAnimation.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/VisualizerWithEditing.cpp b/cpp/open3d/visualization/visualizer/VisualizerWithEditing.cpp index 7a56a6f8d86..69328302dfa 100644 --- a/cpp/open3d/visualization/visualizer/VisualizerWithEditing.cpp +++ b/cpp/open3d/visualization/visualizer/VisualizerWithEditing.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/VisualizerWithEditing.h b/cpp/open3d/visualization/visualizer/VisualizerWithEditing.h index 66ee4477df0..b6b34242dac 100644 --- a/cpp/open3d/visualization/visualizer/VisualizerWithEditing.h +++ b/cpp/open3d/visualization/visualizer/VisualizerWithEditing.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/VisualizerWithKeyCallback.cpp b/cpp/open3d/visualization/visualizer/VisualizerWithKeyCallback.cpp index a4845166b8a..7ce65d9b559 100644 --- a/cpp/open3d/visualization/visualizer/VisualizerWithKeyCallback.cpp +++ b/cpp/open3d/visualization/visualizer/VisualizerWithKeyCallback.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/VisualizerWithKeyCallback.h b/cpp/open3d/visualization/visualizer/VisualizerWithKeyCallback.h index 92274978d81..03910ab87c7 100644 --- a/cpp/open3d/visualization/visualizer/VisualizerWithKeyCallback.h +++ b/cpp/open3d/visualization/visualizer/VisualizerWithKeyCallback.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/VisualizerWithVertexSelection.cpp b/cpp/open3d/visualization/visualizer/VisualizerWithVertexSelection.cpp index 3bf224f2368..fcc6ad48140 100644 --- a/cpp/open3d/visualization/visualizer/VisualizerWithVertexSelection.cpp +++ b/cpp/open3d/visualization/visualizer/VisualizerWithVertexSelection.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/visualizer/VisualizerWithVertexSelection.h b/cpp/open3d/visualization/visualizer/VisualizerWithVertexSelection.h index bc9c3298cd0..d360c996bf8 100644 --- a/cpp/open3d/visualization/visualizer/VisualizerWithVertexSelection.h +++ b/cpp/open3d/visualization/visualizer/VisualizerWithVertexSelection.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/webrtc_server/BitmapTrackSource.cpp b/cpp/open3d/visualization/webrtc_server/BitmapTrackSource.cpp index f28c7684cff..6fd753baf43 100644 --- a/cpp/open3d/visualization/webrtc_server/BitmapTrackSource.cpp +++ b/cpp/open3d/visualization/webrtc_server/BitmapTrackSource.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/webrtc_server/BitmapTrackSource.h b/cpp/open3d/visualization/webrtc_server/BitmapTrackSource.h index 2605b8f592e..81ea8243392 100644 --- a/cpp/open3d/visualization/webrtc_server/BitmapTrackSource.h +++ b/cpp/open3d/visualization/webrtc_server/BitmapTrackSource.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/webrtc_server/HttpServerRequestHandler.cpp b/cpp/open3d/visualization/webrtc_server/HttpServerRequestHandler.cpp index 3d933f6070f..1a1030714cd 100644 --- a/cpp/open3d/visualization/webrtc_server/HttpServerRequestHandler.cpp +++ b/cpp/open3d/visualization/webrtc_server/HttpServerRequestHandler.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/webrtc_server/HttpServerRequestHandler.h b/cpp/open3d/visualization/webrtc_server/HttpServerRequestHandler.h index 44367f12270..91af2fdbb5c 100644 --- a/cpp/open3d/visualization/webrtc_server/HttpServerRequestHandler.h +++ b/cpp/open3d/visualization/webrtc_server/HttpServerRequestHandler.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/webrtc_server/ImageCapturer.cpp b/cpp/open3d/visualization/webrtc_server/ImageCapturer.cpp index d870c2170bb..a7ad0109607 100644 --- a/cpp/open3d/visualization/webrtc_server/ImageCapturer.cpp +++ b/cpp/open3d/visualization/webrtc_server/ImageCapturer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/webrtc_server/ImageCapturer.h b/cpp/open3d/visualization/webrtc_server/ImageCapturer.h index b83624f05cf..f1b094ba3ca 100644 --- a/cpp/open3d/visualization/webrtc_server/ImageCapturer.h +++ b/cpp/open3d/visualization/webrtc_server/ImageCapturer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // diff --git a/cpp/open3d/visualization/webrtc_server/PeerConnectionManager.cpp b/cpp/open3d/visualization/webrtc_server/PeerConnectionManager.cpp index 7b61ac144f5..c29696c39e2 100644 --- a/cpp/open3d/visualization/webrtc_server/PeerConnectionManager.cpp +++ b/cpp/open3d/visualization/webrtc_server/PeerConnectionManager.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/webrtc_server/PeerConnectionManager.h b/cpp/open3d/visualization/webrtc_server/PeerConnectionManager.h index ceb0fc9df74..8a39da3e0f8 100644 --- a/cpp/open3d/visualization/webrtc_server/PeerConnectionManager.h +++ b/cpp/open3d/visualization/webrtc_server/PeerConnectionManager.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/webrtc_server/VideoFilter.h b/cpp/open3d/visualization/webrtc_server/VideoFilter.h index 6a9ddc2f2dd..16588c96a2a 100644 --- a/cpp/open3d/visualization/webrtc_server/VideoFilter.h +++ b/cpp/open3d/visualization/webrtc_server/VideoFilter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/webrtc_server/VideoScaler.h b/cpp/open3d/visualization/webrtc_server/VideoScaler.h index 733ef7a8517..cd57e3dc898 100644 --- a/cpp/open3d/visualization/webrtc_server/VideoScaler.h +++ b/cpp/open3d/visualization/webrtc_server/VideoScaler.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/webrtc_server/WebRTCWindowSystem.cpp b/cpp/open3d/visualization/webrtc_server/WebRTCWindowSystem.cpp index 4440f0d865b..667a7c88be4 100644 --- a/cpp/open3d/visualization/webrtc_server/WebRTCWindowSystem.cpp +++ b/cpp/open3d/visualization/webrtc_server/WebRTCWindowSystem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/open3d/visualization/webrtc_server/WebRTCWindowSystem.h b/cpp/open3d/visualization/webrtc_server/WebRTCWindowSystem.h index 1904187ba54..c2769333639 100644 --- a/cpp/open3d/visualization/webrtc_server/WebRTCWindowSystem.h +++ b/cpp/open3d/visualization/webrtc_server/WebRTCWindowSystem.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- /// \file WebRTCWindowSystem.h diff --git a/cpp/open3d/visualization/webrtc_server/html/webrtcstreamer.js b/cpp/open3d/visualization/webrtc_server/html/webrtcstreamer.js index 418139df27e..b4f31af4e1b 100755 --- a/cpp/open3d/visualization/webrtc_server/html/webrtcstreamer.js +++ b/cpp/open3d/visualization/webrtc_server/html/webrtcstreamer.js @@ -3,7 +3,7 @@ // ---------------------------------------------------------------------------- // The MIT License (MIT) // -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/cpp/pybind/camera/camera.cpp b/cpp/pybind/camera/camera.cpp index fa4f201e70a..4f3ed6195f1 100644 --- a/cpp/pybind/camera/camera.cpp +++ b/cpp/pybind/camera/camera.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/camera/camera.h b/cpp/pybind/camera/camera.h index 38ef9c76afc..ddd5e59d7fa 100644 --- a/cpp/pybind/camera/camera.h +++ b/cpp/pybind/camera/camera.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/blob.cpp b/cpp/pybind/core/blob.cpp index 309e9381f9b..68772e3d004 100644 --- a/cpp/pybind/core/blob.cpp +++ b/cpp/pybind/core/blob.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/core.cpp b/cpp/pybind/core/core.cpp index 3ce45511c0a..4e21b95b761 100644 --- a/cpp/pybind/core/core.cpp +++ b/cpp/pybind/core/core.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/core.h b/cpp/pybind/core/core.h index 14897df8fdb..e3f1e40f8a2 100644 --- a/cpp/pybind/core/core.h +++ b/cpp/pybind/core/core.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/cuda_utils.cpp b/cpp/pybind/core/cuda_utils.cpp index 3befab655c2..1cb72efa0ef 100644 --- a/cpp/pybind/core/cuda_utils.cpp +++ b/cpp/pybind/core/cuda_utils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/device.cpp b/cpp/pybind/core/device.cpp index bcf11805173..1e62bd73c9b 100644 --- a/cpp/pybind/core/device.cpp +++ b/cpp/pybind/core/device.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/dtype.cpp b/cpp/pybind/core/dtype.cpp index e4ab4489c4b..88fbd4f7645 100644 --- a/cpp/pybind/core/dtype.cpp +++ b/cpp/pybind/core/dtype.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/hashmap.cpp b/cpp/pybind/core/hashmap.cpp index 4c6740d1bfa..024e3013461 100644 --- a/cpp/pybind/core/hashmap.cpp +++ b/cpp/pybind/core/hashmap.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/kernel.cpp b/cpp/pybind/core/kernel.cpp index 1d083778997..6216dd53661 100644 --- a/cpp/pybind/core/kernel.cpp +++ b/cpp/pybind/core/kernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/linalg.cpp b/cpp/pybind/core/linalg.cpp index 39ec10650f2..9df9e322421 100644 --- a/cpp/pybind/core/linalg.cpp +++ b/cpp/pybind/core/linalg.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/nns/nearest_neighbor_search.cpp b/cpp/pybind/core/nns/nearest_neighbor_search.cpp index feab8bbcdbf..00b704188a5 100644 --- a/cpp/pybind/core/nns/nearest_neighbor_search.cpp +++ b/cpp/pybind/core/nns/nearest_neighbor_search.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/nns/nearest_neighbor_search.h b/cpp/pybind/core/nns/nearest_neighbor_search.h index a391160b525..93a98d5cf9e 100644 --- a/cpp/pybind/core/nns/nearest_neighbor_search.h +++ b/cpp/pybind/core/nns/nearest_neighbor_search.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/scalar.cpp b/cpp/pybind/core/scalar.cpp index 8a16a690f97..d9f0076731a 100644 --- a/cpp/pybind/core/scalar.cpp +++ b/cpp/pybind/core/scalar.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/size_vector.cpp b/cpp/pybind/core/size_vector.cpp index 434dcb6ff59..dac098c0a0e 100644 --- a/cpp/pybind/core/size_vector.cpp +++ b/cpp/pybind/core/size_vector.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/sycl_utils.cpp b/cpp/pybind/core/sycl_utils.cpp index b0b486ba6f0..2115cde5831 100644 --- a/cpp/pybind/core/sycl_utils.cpp +++ b/cpp/pybind/core/sycl_utils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/tensor.cpp b/cpp/pybind/core/tensor.cpp index 56e1aaa2f2c..79f84044154 100644 --- a/cpp/pybind/core/tensor.cpp +++ b/cpp/pybind/core/tensor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/tensor_accessor.cpp b/cpp/pybind/core/tensor_accessor.cpp index 01825ca8662..15b028bb78c 100644 --- a/cpp/pybind/core/tensor_accessor.cpp +++ b/cpp/pybind/core/tensor_accessor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/tensor_converter.cpp b/cpp/pybind/core/tensor_converter.cpp index 018d857e5ed..1fbb52fed71 100644 --- a/cpp/pybind/core/tensor_converter.cpp +++ b/cpp/pybind/core/tensor_converter.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/tensor_converter.h b/cpp/pybind/core/tensor_converter.h index 975910e56f5..cf255925830 100644 --- a/cpp/pybind/core/tensor_converter.h +++ b/cpp/pybind/core/tensor_converter.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/tensor_function.cpp b/cpp/pybind/core/tensor_function.cpp index 78a6da686a1..e59f04ff9bb 100644 --- a/cpp/pybind/core/tensor_function.cpp +++ b/cpp/pybind/core/tensor_function.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/tensor_type_caster.cpp b/cpp/pybind/core/tensor_type_caster.cpp index 2fb4ff99d67..cb69fddfef0 100644 --- a/cpp/pybind/core/tensor_type_caster.cpp +++ b/cpp/pybind/core/tensor_type_caster.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/core/tensor_type_caster.h b/cpp/pybind/core/tensor_type_caster.h index 6cc50935957..19455769f2f 100644 --- a/cpp/pybind/core/tensor_type_caster.h +++ b/cpp/pybind/core/tensor_type_caster.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/data/dataset.cpp b/cpp/pybind/data/dataset.cpp index 6526088fc5c..bbd331d1010 100644 --- a/cpp/pybind/data/dataset.cpp +++ b/cpp/pybind/data/dataset.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/data/dataset.h b/cpp/pybind/data/dataset.h index 57b1183a255..b5323357bb7 100644 --- a/cpp/pybind/data/dataset.h +++ b/cpp/pybind/data/dataset.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/docstring.cpp b/cpp/pybind/docstring.cpp index f6ed0d1a4b3..6db1ff883fe 100644 --- a/cpp/pybind/docstring.cpp +++ b/cpp/pybind/docstring.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/docstring.h b/cpp/pybind/docstring.h index 3b6d29043e1..6a91681097a 100644 --- a/cpp/pybind/docstring.h +++ b/cpp/pybind/docstring.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/generate_paddle_ops_wrapper.py b/cpp/pybind/generate_paddle_ops_wrapper.py index 3f8c48fa2b7..40038e044e7 100644 --- a/cpp/pybind/generate_paddle_ops_wrapper.py +++ b/cpp/pybind/generate_paddle_ops_wrapper.py @@ -29,7 +29,7 @@ def custom_api_header(): # ---------------------------------------------------------------------------- # The MIT License (MIT) # - # Copyright (c) 2018-2023 www.open3d.org + # Copyright (c) 2018-2024 www.open3d.org # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal diff --git a/cpp/pybind/generate_tf_ops_wrapper.py b/cpp/pybind/generate_tf_ops_wrapper.py index 68fd76cda08..7544a5854e0 100644 --- a/cpp/pybind/generate_tf_ops_wrapper.py +++ b/cpp/pybind/generate_tf_ops_wrapper.py @@ -3,7 +3,7 @@ # ---------------------------------------------------------------------------- # The MIT License (MIT) # -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal diff --git a/cpp/pybind/generate_torch_ops_wrapper.py b/cpp/pybind/generate_torch_ops_wrapper.py index 38b381d7e28..b26da9bef70 100644 --- a/cpp/pybind/generate_torch_ops_wrapper.py +++ b/cpp/pybind/generate_torch_ops_wrapper.py @@ -3,7 +3,7 @@ # ---------------------------------------------------------------------------- # The MIT License (MIT) # -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal diff --git a/cpp/pybind/geometry/boundingvolume.cpp b/cpp/pybind/geometry/boundingvolume.cpp index 719e4edfa55..aa9c0f6b651 100644 --- a/cpp/pybind/geometry/boundingvolume.cpp +++ b/cpp/pybind/geometry/boundingvolume.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/geometry.cpp b/cpp/pybind/geometry/geometry.cpp index 8158c0de25c..de97ec53408 100644 --- a/cpp/pybind/geometry/geometry.cpp +++ b/cpp/pybind/geometry/geometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/geometry.h b/cpp/pybind/geometry/geometry.h index 41a9e31cd01..bb71ee15070 100644 --- a/cpp/pybind/geometry/geometry.h +++ b/cpp/pybind/geometry/geometry.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/geometry_trampoline.h b/cpp/pybind/geometry/geometry_trampoline.h index f81a44f6d43..84afa97efbf 100644 --- a/cpp/pybind/geometry/geometry_trampoline.h +++ b/cpp/pybind/geometry/geometry_trampoline.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/halfedgetrianglemesh.cpp b/cpp/pybind/geometry/halfedgetrianglemesh.cpp index 437c4f12dfd..a1a5f03fa71 100644 --- a/cpp/pybind/geometry/halfedgetrianglemesh.cpp +++ b/cpp/pybind/geometry/halfedgetrianglemesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/image.cpp b/cpp/pybind/geometry/image.cpp index 70e63184e64..c0f51c7f16b 100644 --- a/cpp/pybind/geometry/image.cpp +++ b/cpp/pybind/geometry/image.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/kdtreeflann.cpp b/cpp/pybind/geometry/kdtreeflann.cpp index 785aa2a09f9..fcbf72e7fc9 100644 --- a/cpp/pybind/geometry/kdtreeflann.cpp +++ b/cpp/pybind/geometry/kdtreeflann.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/keypoint.cpp b/cpp/pybind/geometry/keypoint.cpp index a4253670255..82523deb208 100644 --- a/cpp/pybind/geometry/keypoint.cpp +++ b/cpp/pybind/geometry/keypoint.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // @author Ignacio Vizzo [ivizzo@uni-bonn.de] diff --git a/cpp/pybind/geometry/lineset.cpp b/cpp/pybind/geometry/lineset.cpp index 41e47a1c7ca..9296e95a8f1 100644 --- a/cpp/pybind/geometry/lineset.cpp +++ b/cpp/pybind/geometry/lineset.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/meshbase.cpp b/cpp/pybind/geometry/meshbase.cpp index cbc71520e4f..e38e73e3ce9 100644 --- a/cpp/pybind/geometry/meshbase.cpp +++ b/cpp/pybind/geometry/meshbase.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/octree.cpp b/cpp/pybind/geometry/octree.cpp index e9ebafae522..afd3434a6d1 100644 --- a/cpp/pybind/geometry/octree.cpp +++ b/cpp/pybind/geometry/octree.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/octree.h b/cpp/pybind/geometry/octree.h index 4dbe5cd44aa..5d488fbdfd1 100644 --- a/cpp/pybind/geometry/octree.h +++ b/cpp/pybind/geometry/octree.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/pointcloud.cpp b/cpp/pybind/geometry/pointcloud.cpp index 2af8319e93d..d7b1c53b8d9 100644 --- a/cpp/pybind/geometry/pointcloud.cpp +++ b/cpp/pybind/geometry/pointcloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/tetramesh.cpp b/cpp/pybind/geometry/tetramesh.cpp index 5ef8ce0d757..c9446ef832f 100644 --- a/cpp/pybind/geometry/tetramesh.cpp +++ b/cpp/pybind/geometry/tetramesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/trianglemesh.cpp b/cpp/pybind/geometry/trianglemesh.cpp index 311aa311b86..8e713556eec 100644 --- a/cpp/pybind/geometry/trianglemesh.cpp +++ b/cpp/pybind/geometry/trianglemesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/geometry/voxelgrid.cpp b/cpp/pybind/geometry/voxelgrid.cpp index 0528979b0f3..a136fd4c110 100644 --- a/cpp/pybind/geometry/voxelgrid.cpp +++ b/cpp/pybind/geometry/voxelgrid.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/io/class_io.cpp b/cpp/pybind/io/class_io.cpp index 0602f93e577..9b29fd33c8c 100644 --- a/cpp/pybind/io/class_io.cpp +++ b/cpp/pybind/io/class_io.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/io/io.cpp b/cpp/pybind/io/io.cpp index 63afc83e85a..13fa5989233 100644 --- a/cpp/pybind/io/io.cpp +++ b/cpp/pybind/io/io.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/io/io.h b/cpp/pybind/io/io.h index 6d54dfeada1..de9ddcd90fc 100644 --- a/cpp/pybind/io/io.h +++ b/cpp/pybind/io/io.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/io/rpc.cpp b/cpp/pybind/io/rpc.cpp index 8d04d1265c9..fc800ae7d9a 100644 --- a/cpp/pybind/io/rpc.cpp +++ b/cpp/pybind/io/rpc.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/io/sensor.cpp b/cpp/pybind/io/sensor.cpp index 3b07e0d10a5..e9a7d2ec1ff 100644 --- a/cpp/pybind/io/sensor.cpp +++ b/cpp/pybind/io/sensor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/ml/contrib/contrib.cpp b/cpp/pybind/ml/contrib/contrib.cpp index 9ed422ee12d..ff5f7e6e6fb 100644 --- a/cpp/pybind/ml/contrib/contrib.cpp +++ b/cpp/pybind/ml/contrib/contrib.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/ml/contrib/contrib.h b/cpp/pybind/ml/contrib/contrib.h index 9caff96487b..eb623c0a241 100644 --- a/cpp/pybind/ml/contrib/contrib.h +++ b/cpp/pybind/ml/contrib/contrib.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/ml/contrib/contrib_subsample.cpp b/cpp/pybind/ml/contrib/contrib_subsample.cpp index b7946a69451..689eff8285b 100644 --- a/cpp/pybind/ml/contrib/contrib_subsample.cpp +++ b/cpp/pybind/ml/contrib/contrib_subsample.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/ml/contrib/iou.cpp b/cpp/pybind/ml/contrib/iou.cpp index 1f14af19814..fa139c539e9 100644 --- a/cpp/pybind/ml/contrib/iou.cpp +++ b/cpp/pybind/ml/contrib/iou.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/ml/ml.cpp b/cpp/pybind/ml/ml.cpp index de71caf71b0..aa344428192 100644 --- a/cpp/pybind/ml/ml.cpp +++ b/cpp/pybind/ml/ml.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/ml/ml.h b/cpp/pybind/ml/ml.h index 3cbbc0e6a8e..b0e7ca8a74b 100644 --- a/cpp/pybind/ml/ml.h +++ b/cpp/pybind/ml/ml.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/open3d_pybind.cpp b/cpp/pybind/open3d_pybind.cpp index a6b71969804..93cb9c7a2d6 100644 --- a/cpp/pybind/open3d_pybind.cpp +++ b/cpp/pybind/open3d_pybind.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/open3d_pybind.h b/cpp/pybind/open3d_pybind.h index 32380c5af9c..5a822afa044 100644 --- a/cpp/pybind/open3d_pybind.h +++ b/cpp/pybind/open3d_pybind.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/color_map/color_map.cpp b/cpp/pybind/pipelines/color_map/color_map.cpp index 141d0bdab28..fa79b0e69ec 100644 --- a/cpp/pybind/pipelines/color_map/color_map.cpp +++ b/cpp/pybind/pipelines/color_map/color_map.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/color_map/color_map.h b/cpp/pybind/pipelines/color_map/color_map.h index 12bffb93c91..3fe888dd0a4 100644 --- a/cpp/pybind/pipelines/color_map/color_map.h +++ b/cpp/pybind/pipelines/color_map/color_map.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/integration/integration.cpp b/cpp/pybind/pipelines/integration/integration.cpp index d0482bcc8fe..d7af99a6c7e 100644 --- a/cpp/pybind/pipelines/integration/integration.cpp +++ b/cpp/pybind/pipelines/integration/integration.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/integration/integration.h b/cpp/pybind/pipelines/integration/integration.h index ed316740bb5..0f2d9e050f4 100644 --- a/cpp/pybind/pipelines/integration/integration.h +++ b/cpp/pybind/pipelines/integration/integration.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/odometry/odometry.cpp b/cpp/pybind/pipelines/odometry/odometry.cpp index 972a4452aad..2b5d2e617ed 100644 --- a/cpp/pybind/pipelines/odometry/odometry.cpp +++ b/cpp/pybind/pipelines/odometry/odometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/odometry/odometry.h b/cpp/pybind/pipelines/odometry/odometry.h index 48cd0edc657..072d226388e 100644 --- a/cpp/pybind/pipelines/odometry/odometry.h +++ b/cpp/pybind/pipelines/odometry/odometry.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/pipelines.cpp b/cpp/pybind/pipelines/pipelines.cpp index aa696a50245..2cd2e65ec41 100644 --- a/cpp/pybind/pipelines/pipelines.cpp +++ b/cpp/pybind/pipelines/pipelines.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/pipelines.h b/cpp/pybind/pipelines/pipelines.h index 3f01c128cfe..590e0c2ffaa 100644 --- a/cpp/pybind/pipelines/pipelines.h +++ b/cpp/pybind/pipelines/pipelines.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/registration/feature.cpp b/cpp/pybind/pipelines/registration/feature.cpp index bdc4b5d8e51..71573f24bad 100644 --- a/cpp/pybind/pipelines/registration/feature.cpp +++ b/cpp/pybind/pipelines/registration/feature.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/registration/global_optimization.cpp b/cpp/pybind/pipelines/registration/global_optimization.cpp index 58607de6597..b43ead266d1 100644 --- a/cpp/pybind/pipelines/registration/global_optimization.cpp +++ b/cpp/pybind/pipelines/registration/global_optimization.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/registration/registration.cpp b/cpp/pybind/pipelines/registration/registration.cpp index f5165537fea..68ef0af4331 100644 --- a/cpp/pybind/pipelines/registration/registration.cpp +++ b/cpp/pybind/pipelines/registration/registration.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/registration/registration.h b/cpp/pybind/pipelines/registration/registration.h index 17eb18a3b02..dcd22375697 100644 --- a/cpp/pybind/pipelines/registration/registration.h +++ b/cpp/pybind/pipelines/registration/registration.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pipelines/registration/robust_kernels.cpp b/cpp/pybind/pipelines/registration/robust_kernels.cpp index 5cd8bb83181..333128ef1eb 100644 --- a/cpp/pybind/pipelines/registration/robust_kernels.cpp +++ b/cpp/pybind/pipelines/registration/robust_kernels.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // @author Ignacio Vizzo [ivizzo@uni-bonn.de] diff --git a/cpp/pybind/pybind_utils.cpp b/cpp/pybind/pybind_utils.cpp index 50fafea4a85..f907d0d9c17 100644 --- a/cpp/pybind/pybind_utils.cpp +++ b/cpp/pybind/pybind_utils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/pybind_utils.h b/cpp/pybind/pybind_utils.h index d99ea505351..066b54b0112 100644 --- a/cpp/pybind/pybind_utils.h +++ b/cpp/pybind/pybind_utils.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/geometry/boundingvolume.cpp b/cpp/pybind/t/geometry/boundingvolume.cpp index 946fb9617df..5ab95cd16cb 100644 --- a/cpp/pybind/t/geometry/boundingvolume.cpp +++ b/cpp/pybind/t/geometry/boundingvolume.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/geometry/drawablegeometry.cpp b/cpp/pybind/t/geometry/drawablegeometry.cpp index 7d4a11493fc..836c197aa56 100644 --- a/cpp/pybind/t/geometry/drawablegeometry.cpp +++ b/cpp/pybind/t/geometry/drawablegeometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/geometry/geometry.cpp b/cpp/pybind/t/geometry/geometry.cpp index 9563fbb215f..2881d3c0fa3 100644 --- a/cpp/pybind/t/geometry/geometry.cpp +++ b/cpp/pybind/t/geometry/geometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/geometry/geometry.h b/cpp/pybind/t/geometry/geometry.h index 6e1271083df..c8719bcdfa6 100644 --- a/cpp/pybind/t/geometry/geometry.h +++ b/cpp/pybind/t/geometry/geometry.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/geometry/image.cpp b/cpp/pybind/t/geometry/image.cpp index b9fe3c20725..6c0b0914daf 100644 --- a/cpp/pybind/t/geometry/image.cpp +++ b/cpp/pybind/t/geometry/image.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/geometry/lineset.cpp b/cpp/pybind/t/geometry/lineset.cpp index d9bf8adbe43..a5f40342cab 100644 --- a/cpp/pybind/t/geometry/lineset.cpp +++ b/cpp/pybind/t/geometry/lineset.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/geometry/pointcloud.cpp b/cpp/pybind/t/geometry/pointcloud.cpp index a36813fd353..e7f65441d32 100644 --- a/cpp/pybind/t/geometry/pointcloud.cpp +++ b/cpp/pybind/t/geometry/pointcloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/geometry/raycasting_scene.cpp b/cpp/pybind/t/geometry/raycasting_scene.cpp index e7f6dcecbd5..907849ee26b 100644 --- a/cpp/pybind/t/geometry/raycasting_scene.cpp +++ b/cpp/pybind/t/geometry/raycasting_scene.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/geometry/tensormap.cpp b/cpp/pybind/t/geometry/tensormap.cpp index 36fea31b472..f972da36b62 100644 --- a/cpp/pybind/t/geometry/tensormap.cpp +++ b/cpp/pybind/t/geometry/tensormap.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/geometry/trianglemesh.cpp b/cpp/pybind/t/geometry/trianglemesh.cpp index 6285b00c6b3..53ab6b5920c 100644 --- a/cpp/pybind/t/geometry/trianglemesh.cpp +++ b/cpp/pybind/t/geometry/trianglemesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/geometry/voxel_block_grid.cpp b/cpp/pybind/t/geometry/voxel_block_grid.cpp index ff47ffa0e85..8c8ef649d1b 100644 --- a/cpp/pybind/t/geometry/voxel_block_grid.cpp +++ b/cpp/pybind/t/geometry/voxel_block_grid.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/io/class_io.cpp b/cpp/pybind/t/io/class_io.cpp index e91b6d35095..d37d3df901e 100644 --- a/cpp/pybind/t/io/class_io.cpp +++ b/cpp/pybind/t/io/class_io.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/io/io.cpp b/cpp/pybind/t/io/io.cpp index 5cbdb441879..97799ba9bf5 100644 --- a/cpp/pybind/t/io/io.cpp +++ b/cpp/pybind/t/io/io.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/io/io.h b/cpp/pybind/t/io/io.h index dc3aef9327a..d8d0e8a3252 100644 --- a/cpp/pybind/t/io/io.h +++ b/cpp/pybind/t/io/io.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/io/sensor.cpp b/cpp/pybind/t/io/sensor.cpp index 880342eb4b6..f55559d91fb 100644 --- a/cpp/pybind/t/io/sensor.cpp +++ b/cpp/pybind/t/io/sensor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/pipelines/odometry/odometry.cpp b/cpp/pybind/t/pipelines/odometry/odometry.cpp index a6744e6a0b9..1016450c591 100644 --- a/cpp/pybind/t/pipelines/odometry/odometry.cpp +++ b/cpp/pybind/t/pipelines/odometry/odometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/pipelines/odometry/odometry.h b/cpp/pybind/t/pipelines/odometry/odometry.h index 2a603765675..dd637cede8a 100644 --- a/cpp/pybind/t/pipelines/odometry/odometry.h +++ b/cpp/pybind/t/pipelines/odometry/odometry.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/pipelines/pipelines.cpp b/cpp/pybind/t/pipelines/pipelines.cpp index 6407923bf91..39a276994e8 100644 --- a/cpp/pybind/t/pipelines/pipelines.cpp +++ b/cpp/pybind/t/pipelines/pipelines.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/pipelines/pipelines.h b/cpp/pybind/t/pipelines/pipelines.h index 015a3959b56..f8570a00bb2 100644 --- a/cpp/pybind/t/pipelines/pipelines.h +++ b/cpp/pybind/t/pipelines/pipelines.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/pipelines/registration/feature.cpp b/cpp/pybind/t/pipelines/registration/feature.cpp index 74de409115d..92759de37b3 100644 --- a/cpp/pybind/t/pipelines/registration/feature.cpp +++ b/cpp/pybind/t/pipelines/registration/feature.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/pipelines/registration/registration.cpp b/cpp/pybind/t/pipelines/registration/registration.cpp index 6dbe3f1d27a..613c6034110 100644 --- a/cpp/pybind/t/pipelines/registration/registration.cpp +++ b/cpp/pybind/t/pipelines/registration/registration.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/pipelines/registration/registration.h b/cpp/pybind/t/pipelines/registration/registration.h index 671f6e96d0d..424d248b641 100644 --- a/cpp/pybind/t/pipelines/registration/registration.h +++ b/cpp/pybind/t/pipelines/registration/registration.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/pipelines/registration/robust_kernel.cpp b/cpp/pybind/t/pipelines/registration/robust_kernel.cpp index 2b2e7f5bccc..19e2e04932c 100644 --- a/cpp/pybind/t/pipelines/registration/robust_kernel.cpp +++ b/cpp/pybind/t/pipelines/registration/robust_kernel.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/pipelines/slac/slac.cpp b/cpp/pybind/t/pipelines/slac/slac.cpp index a2874e0b172..938b013c9a6 100644 --- a/cpp/pybind/t/pipelines/slac/slac.cpp +++ b/cpp/pybind/t/pipelines/slac/slac.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/pipelines/slac/slac.h b/cpp/pybind/t/pipelines/slac/slac.h index aa161593640..7101bcec2e4 100644 --- a/cpp/pybind/t/pipelines/slac/slac.h +++ b/cpp/pybind/t/pipelines/slac/slac.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/pipelines/slam/slam.cpp b/cpp/pybind/t/pipelines/slam/slam.cpp index 5a2cf260d60..5e26b0e46cc 100644 --- a/cpp/pybind/t/pipelines/slam/slam.cpp +++ b/cpp/pybind/t/pipelines/slam/slam.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/pipelines/slam/slam.h b/cpp/pybind/t/pipelines/slam/slam.h index eea3c937abf..c6e7bf7e274 100644 --- a/cpp/pybind/t/pipelines/slam/slam.h +++ b/cpp/pybind/t/pipelines/slam/slam.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/t.cpp b/cpp/pybind/t/t.cpp index b3a166efc1c..8ce1080092f 100644 --- a/cpp/pybind/t/t.cpp +++ b/cpp/pybind/t/t.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/t/t.h b/cpp/pybind/t/t.h index c941372b5b8..b34cd927638 100644 --- a/cpp/pybind/t/t.h +++ b/cpp/pybind/t/t.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/utility/eigen.cpp b/cpp/pybind/utility/eigen.cpp index f23e94060f3..b9178cbaeb7 100644 --- a/cpp/pybind/utility/eigen.cpp +++ b/cpp/pybind/utility/eigen.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/utility/logging.cpp b/cpp/pybind/utility/logging.cpp index 2be3832c883..16bea3e03fd 100644 --- a/cpp/pybind/utility/logging.cpp +++ b/cpp/pybind/utility/logging.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/utility/random.cpp b/cpp/pybind/utility/random.cpp index 38fefa7869f..fbecce49f0d 100644 --- a/cpp/pybind/utility/random.cpp +++ b/cpp/pybind/utility/random.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/utility/utility.cpp b/cpp/pybind/utility/utility.cpp index 315aa0a2125..ecd5e1f8228 100644 --- a/cpp/pybind/utility/utility.cpp +++ b/cpp/pybind/utility/utility.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/utility/utility.h b/cpp/pybind/utility/utility.h index eeb40cb4e8f..60e7207c7e7 100644 --- a/cpp/pybind/utility/utility.h +++ b/cpp/pybind/utility/utility.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/app/viewer.cpp b/cpp/pybind/visualization/app/viewer.cpp index 524d154d45e..1f56dfa9dc4 100644 --- a/cpp/pybind/visualization/app/viewer.cpp +++ b/cpp/pybind/visualization/app/viewer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/app/viewer.h b/cpp/pybind/visualization/app/viewer.h index 8c62fdc71a0..38730b66545 100644 --- a/cpp/pybind/visualization/app/viewer.h +++ b/cpp/pybind/visualization/app/viewer.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/gui/events.cpp b/cpp/pybind/visualization/gui/events.cpp index d35d1f7bf6d..135f1d477b0 100644 --- a/cpp/pybind/visualization/gui/events.cpp +++ b/cpp/pybind/visualization/gui/events.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/gui/gui.cpp b/cpp/pybind/visualization/gui/gui.cpp index a211d233a05..7ef59a4f5ee 100644 --- a/cpp/pybind/visualization/gui/gui.cpp +++ b/cpp/pybind/visualization/gui/gui.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/gui/gui.h b/cpp/pybind/visualization/gui/gui.h index 7e5a7972c26..6df2580f6c0 100644 --- a/cpp/pybind/visualization/gui/gui.h +++ b/cpp/pybind/visualization/gui/gui.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/o3dvisualizer.cpp b/cpp/pybind/visualization/o3dvisualizer.cpp index a97d108f918..685a1395808 100644 --- a/cpp/pybind/visualization/o3dvisualizer.cpp +++ b/cpp/pybind/visualization/o3dvisualizer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/rendering/material.cpp b/cpp/pybind/visualization/rendering/material.cpp index 82225c9c90a..7f791940f0c 100644 --- a/cpp/pybind/visualization/rendering/material.cpp +++ b/cpp/pybind/visualization/rendering/material.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/rendering/material.h b/cpp/pybind/visualization/rendering/material.h index dd9e7404759..33bf912c2b2 100644 --- a/cpp/pybind/visualization/rendering/material.h +++ b/cpp/pybind/visualization/rendering/material.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/rendering/rendering.cpp b/cpp/pybind/visualization/rendering/rendering.cpp index b243531d859..532a661197a 100644 --- a/cpp/pybind/visualization/rendering/rendering.cpp +++ b/cpp/pybind/visualization/rendering/rendering.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/rendering/rendering.h b/cpp/pybind/visualization/rendering/rendering.h index 007ba2fbce2..c6fc6c31b3b 100644 --- a/cpp/pybind/visualization/rendering/rendering.h +++ b/cpp/pybind/visualization/rendering/rendering.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/renderoption.cpp b/cpp/pybind/visualization/renderoption.cpp index daf88cc72de..3c1c51ea353 100644 --- a/cpp/pybind/visualization/renderoption.cpp +++ b/cpp/pybind/visualization/renderoption.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/utility.cpp b/cpp/pybind/visualization/utility.cpp index 417438b1bff..b0c9d42c2a0 100644 --- a/cpp/pybind/visualization/utility.cpp +++ b/cpp/pybind/visualization/utility.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/viewcontrol.cpp b/cpp/pybind/visualization/viewcontrol.cpp index 80a8aaa7895..ff3d76b298a 100644 --- a/cpp/pybind/visualization/viewcontrol.cpp +++ b/cpp/pybind/visualization/viewcontrol.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/visualization.cpp b/cpp/pybind/visualization/visualization.cpp index b6e3455fa6d..554e249abb0 100644 --- a/cpp/pybind/visualization/visualization.cpp +++ b/cpp/pybind/visualization/visualization.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/visualization.h b/cpp/pybind/visualization/visualization.h index de6d7aa5757..530b4a1a249 100644 --- a/cpp/pybind/visualization/visualization.h +++ b/cpp/pybind/visualization/visualization.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/visualization_trampoline.h b/cpp/pybind/visualization/visualization_trampoline.h index bb605a2fb4d..8a6a5509abe 100644 --- a/cpp/pybind/visualization/visualization_trampoline.h +++ b/cpp/pybind/visualization/visualization_trampoline.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/visualizer.cpp b/cpp/pybind/visualization/visualizer.cpp index dba049503f9..859a7322a50 100644 --- a/cpp/pybind/visualization/visualizer.cpp +++ b/cpp/pybind/visualization/visualizer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/webrtc_server/webrtc_window_system.cpp b/cpp/pybind/visualization/webrtc_server/webrtc_window_system.cpp index 84ae5d391c2..5d070a3cb6d 100644 --- a/cpp/pybind/visualization/webrtc_server/webrtc_window_system.cpp +++ b/cpp/pybind/visualization/webrtc_server/webrtc_window_system.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/pybind/visualization/webrtc_server/webrtc_window_system.h b/cpp/pybind/visualization/webrtc_server/webrtc_window_system.h index cae067d7e85..46b5037216d 100644 --- a/cpp/pybind/visualization/webrtc_server/webrtc_window_system.h +++ b/cpp/pybind/visualization/webrtc_server/webrtc_window_system.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/Main.cpp b/cpp/tests/Main.cpp index f839dc3556b..ece271ee137 100644 --- a/cpp/tests/Main.cpp +++ b/cpp/tests/Main.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/Tests.cpp b/cpp/tests/Tests.cpp index ee6fcdead6b..af0df371df8 100644 --- a/cpp/tests/Tests.cpp +++ b/cpp/tests/Tests.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/Tests.h b/cpp/tests/Tests.h index 10e8ca6cbb4..f5c0cfd5b97 100644 --- a/cpp/tests/Tests.h +++ b/cpp/tests/Tests.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/camera/PinholeCameraIntrinsic.cpp b/cpp/tests/camera/PinholeCameraIntrinsic.cpp index 6da9cd85594..ccb274f23e5 100644 --- a/cpp/tests/camera/PinholeCameraIntrinsic.cpp +++ b/cpp/tests/camera/PinholeCameraIntrinsic.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/camera/PinholeCameraParameters.cpp b/cpp/tests/camera/PinholeCameraParameters.cpp index e979acfe616..47c7a06222d 100644 --- a/cpp/tests/camera/PinholeCameraParameters.cpp +++ b/cpp/tests/camera/PinholeCameraParameters.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/camera/PinholeCameraTrajectory.cpp b/cpp/tests/camera/PinholeCameraTrajectory.cpp index 01c4002ee44..3d771f1ea26 100644 --- a/cpp/tests/camera/PinholeCameraTrajectory.cpp +++ b/cpp/tests/camera/PinholeCameraTrajectory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/Blob.cpp b/cpp/tests/core/Blob.cpp index 7996c744468..85be95d31cc 100644 --- a/cpp/tests/core/Blob.cpp +++ b/cpp/tests/core/Blob.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/CUDAUtils.cpp b/cpp/tests/core/CUDAUtils.cpp index 10cda864d95..3a0634fe3d7 100644 --- a/cpp/tests/core/CUDAUtils.cpp +++ b/cpp/tests/core/CUDAUtils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/CoreTest.cpp b/cpp/tests/core/CoreTest.cpp index 3bb29941993..babfc30a0e3 100644 --- a/cpp/tests/core/CoreTest.cpp +++ b/cpp/tests/core/CoreTest.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/CoreTest.h b/cpp/tests/core/CoreTest.h index 3b2f6f6dd29..ab874b8b485 100644 --- a/cpp/tests/core/CoreTest.h +++ b/cpp/tests/core/CoreTest.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/Device.cpp b/cpp/tests/core/Device.cpp index a93aba7caf7..0f54a962d4e 100644 --- a/cpp/tests/core/Device.cpp +++ b/cpp/tests/core/Device.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/EigenConverter.cpp b/cpp/tests/core/EigenConverter.cpp index 41a810ede47..7754657cc13 100644 --- a/cpp/tests/core/EigenConverter.cpp +++ b/cpp/tests/core/EigenConverter.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/FixedRadiusIndex.cpp b/cpp/tests/core/FixedRadiusIndex.cpp index 04a457a23dc..fb735b799e0 100644 --- a/cpp/tests/core/FixedRadiusIndex.cpp +++ b/cpp/tests/core/FixedRadiusIndex.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/HashMap.cpp b/cpp/tests/core/HashMap.cpp index 3d048e68883..c3077ebef16 100644 --- a/cpp/tests/core/HashMap.cpp +++ b/cpp/tests/core/HashMap.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/Indexer.cpp b/cpp/tests/core/Indexer.cpp index bc53c4f3c59..305c08693a0 100644 --- a/cpp/tests/core/Indexer.cpp +++ b/cpp/tests/core/Indexer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/Indexer.ispc b/cpp/tests/core/Indexer.ispc index 19c9d41e4a9..c25ba876f26 100644 --- a/cpp/tests/core/Indexer.ispc +++ b/cpp/tests/core/Indexer.ispc @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/KnnIndex.cpp b/cpp/tests/core/KnnIndex.cpp index d8af7c72983..1ceb32d4835 100644 --- a/cpp/tests/core/KnnIndex.cpp +++ b/cpp/tests/core/KnnIndex.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #include "open3d/core/nns/KnnIndex.h" diff --git a/cpp/tests/core/Linalg.cpp b/cpp/tests/core/Linalg.cpp index 20dce1117f5..2c8be12323b 100644 --- a/cpp/tests/core/Linalg.cpp +++ b/cpp/tests/core/Linalg.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/MemoryManager.cpp b/cpp/tests/core/MemoryManager.cpp index c4904bb2f1c..9e3570a5af0 100644 --- a/cpp/tests/core/MemoryManager.cpp +++ b/cpp/tests/core/MemoryManager.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/NanoFlannIndex.cpp b/cpp/tests/core/NanoFlannIndex.cpp index 83daf3b8916..6deb8bca639 100644 --- a/cpp/tests/core/NanoFlannIndex.cpp +++ b/cpp/tests/core/NanoFlannIndex.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/NearestNeighborSearch.cpp b/cpp/tests/core/NearestNeighborSearch.cpp index 57722b83ab0..a53e33642e1 100644 --- a/cpp/tests/core/NearestNeighborSearch.cpp +++ b/cpp/tests/core/NearestNeighborSearch.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/ParallelFor.cpp b/cpp/tests/core/ParallelFor.cpp index 36d0dfc3c87..db366758b18 100644 --- a/cpp/tests/core/ParallelFor.cpp +++ b/cpp/tests/core/ParallelFor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/ParallelFor.cu b/cpp/tests/core/ParallelFor.cu index c5806c264dc..b83517b8f45 100644 --- a/cpp/tests/core/ParallelFor.cu +++ b/cpp/tests/core/ParallelFor.cu @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/ParallelFor.ispc b/cpp/tests/core/ParallelFor.ispc index 3eb68daa00a..f3d9edfa8fb 100644 --- a/cpp/tests/core/ParallelFor.ispc +++ b/cpp/tests/core/ParallelFor.ispc @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/SYCLUtils.cpp b/cpp/tests/core/SYCLUtils.cpp index d10d99f09fa..b22911c720a 100644 --- a/cpp/tests/core/SYCLUtils.cpp +++ b/cpp/tests/core/SYCLUtils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/Scalar.cpp b/cpp/tests/core/Scalar.cpp index f3148facc20..12d538aa244 100644 --- a/cpp/tests/core/Scalar.cpp +++ b/cpp/tests/core/Scalar.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/ShapeUtil.cpp b/cpp/tests/core/ShapeUtil.cpp index 3991c4b988e..77b7c90801a 100644 --- a/cpp/tests/core/ShapeUtil.cpp +++ b/cpp/tests/core/ShapeUtil.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/SizeVector.cpp b/cpp/tests/core/SizeVector.cpp index c551a170e77..a3e6724103e 100644 --- a/cpp/tests/core/SizeVector.cpp +++ b/cpp/tests/core/SizeVector.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/Tensor.cpp b/cpp/tests/core/Tensor.cpp index ad377274169..891bf5a572d 100644 --- a/cpp/tests/core/Tensor.cpp +++ b/cpp/tests/core/Tensor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/TensorCheck.cpp b/cpp/tests/core/TensorCheck.cpp index f65be5ddaef..8b789b481b6 100644 --- a/cpp/tests/core/TensorCheck.cpp +++ b/cpp/tests/core/TensorCheck.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/TensorFunction.cpp b/cpp/tests/core/TensorFunction.cpp index d1ba5be783d..0d25b941dfd 100644 --- a/cpp/tests/core/TensorFunction.cpp +++ b/cpp/tests/core/TensorFunction.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/TensorList.cpp b/cpp/tests/core/TensorList.cpp index 305879927c3..39091f3d386 100644 --- a/cpp/tests/core/TensorList.cpp +++ b/cpp/tests/core/TensorList.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/core/TensorObject.cpp b/cpp/tests/core/TensorObject.cpp index f5383885535..0ff294dbc88 100644 --- a/cpp/tests/core/TensorObject.cpp +++ b/cpp/tests/core/TensorObject.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/data/Dataset.cpp b/cpp/tests/data/Dataset.cpp index 49feb3de8b6..6f7e1e4561c 100644 --- a/cpp/tests/data/Dataset.cpp +++ b/cpp/tests/data/Dataset.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/AccumulatedPoint.cpp b/cpp/tests/geometry/AccumulatedPoint.cpp index 4088e0a48d4..8cf19130437 100644 --- a/cpp/tests/geometry/AccumulatedPoint.cpp +++ b/cpp/tests/geometry/AccumulatedPoint.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/AxisAlignedBoundingBox.cpp b/cpp/tests/geometry/AxisAlignedBoundingBox.cpp index 9cf7db8f241..449f1dc378f 100644 --- a/cpp/tests/geometry/AxisAlignedBoundingBox.cpp +++ b/cpp/tests/geometry/AxisAlignedBoundingBox.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/EstimateNormals.cpp b/cpp/tests/geometry/EstimateNormals.cpp index 559ffc2f666..cecb57de182 100644 --- a/cpp/tests/geometry/EstimateNormals.cpp +++ b/cpp/tests/geometry/EstimateNormals.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/HalfEdgeTriangleMesh.cpp b/cpp/tests/geometry/HalfEdgeTriangleMesh.cpp index 7b71fb38080..d6d23cf5f1b 100644 --- a/cpp/tests/geometry/HalfEdgeTriangleMesh.cpp +++ b/cpp/tests/geometry/HalfEdgeTriangleMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/Image.cpp b/cpp/tests/geometry/Image.cpp index f6e5741cba1..f7ca53c67bf 100644 --- a/cpp/tests/geometry/Image.cpp +++ b/cpp/tests/geometry/Image.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/IntersectionTest.cpp b/cpp/tests/geometry/IntersectionTest.cpp index 73539a9f443..8911e42936c 100644 --- a/cpp/tests/geometry/IntersectionTest.cpp +++ b/cpp/tests/geometry/IntersectionTest.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/KDTreeFlann.cpp b/cpp/tests/geometry/KDTreeFlann.cpp index 25a7822e487..43d62eddf71 100644 --- a/cpp/tests/geometry/KDTreeFlann.cpp +++ b/cpp/tests/geometry/KDTreeFlann.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/Line3D.cpp b/cpp/tests/geometry/Line3D.cpp index f3944645b52..14c3dc33975 100644 --- a/cpp/tests/geometry/Line3D.cpp +++ b/cpp/tests/geometry/Line3D.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/LineSet.cpp b/cpp/tests/geometry/LineSet.cpp index 8a68120598f..efbec0d91e2 100644 --- a/cpp/tests/geometry/LineSet.cpp +++ b/cpp/tests/geometry/LineSet.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/Octree.cpp b/cpp/tests/geometry/Octree.cpp index edcfac1a8f7..9ed6f4cf33f 100644 --- a/cpp/tests/geometry/Octree.cpp +++ b/cpp/tests/geometry/Octree.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/PointCloud.cpp b/cpp/tests/geometry/PointCloud.cpp index 21bfe5659bf..0a8d56d9890 100644 --- a/cpp/tests/geometry/PointCloud.cpp +++ b/cpp/tests/geometry/PointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/RGBDImage.cpp b/cpp/tests/geometry/RGBDImage.cpp index 433feb1a4c6..e4944981669 100644 --- a/cpp/tests/geometry/RGBDImage.cpp +++ b/cpp/tests/geometry/RGBDImage.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/TetraMesh.cpp b/cpp/tests/geometry/TetraMesh.cpp index 5b5e29db246..c814a16447d 100644 --- a/cpp/tests/geometry/TetraMesh.cpp +++ b/cpp/tests/geometry/TetraMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/TriangleMesh.cpp b/cpp/tests/geometry/TriangleMesh.cpp index 559330bb2a0..d218802422e 100644 --- a/cpp/tests/geometry/TriangleMesh.cpp +++ b/cpp/tests/geometry/TriangleMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/geometry/VoxelGrid.cpp b/cpp/tests/geometry/VoxelGrid.cpp index 3108f591dbb..51e13b720a1 100644 --- a/cpp/tests/geometry/VoxelGrid.cpp +++ b/cpp/tests/geometry/VoxelGrid.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/FeatureIO.cpp b/cpp/tests/io/FeatureIO.cpp index d4b797dcef6..f747054f80a 100644 --- a/cpp/tests/io/FeatureIO.cpp +++ b/cpp/tests/io/FeatureIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/IJsonConvertibleIO.cpp b/cpp/tests/io/IJsonConvertibleIO.cpp index 63a1591a88d..a7761df3a86 100644 --- a/cpp/tests/io/IJsonConvertibleIO.cpp +++ b/cpp/tests/io/IJsonConvertibleIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/ImageIO.cpp b/cpp/tests/io/ImageIO.cpp index 4f935503f48..c8950403122 100644 --- a/cpp/tests/io/ImageIO.cpp +++ b/cpp/tests/io/ImageIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/OctreeIO.cpp b/cpp/tests/io/OctreeIO.cpp index 1cd425e9582..b7b7b083cf9 100644 --- a/cpp/tests/io/OctreeIO.cpp +++ b/cpp/tests/io/OctreeIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/PinholeCameraTrajectoryIO.cpp b/cpp/tests/io/PinholeCameraTrajectoryIO.cpp index a3f8b56cbdb..06eb6681748 100644 --- a/cpp/tests/io/PinholeCameraTrajectoryIO.cpp +++ b/cpp/tests/io/PinholeCameraTrajectoryIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/PointCloudIO.cpp b/cpp/tests/io/PointCloudIO.cpp index 78bbcee8eac..5464ad2241b 100644 --- a/cpp/tests/io/PointCloudIO.cpp +++ b/cpp/tests/io/PointCloudIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/PoseGraphIO.cpp b/cpp/tests/io/PoseGraphIO.cpp index b54ce26e409..969e9c4f825 100644 --- a/cpp/tests/io/PoseGraphIO.cpp +++ b/cpp/tests/io/PoseGraphIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/TriangleMeshIO.cpp b/cpp/tests/io/TriangleMeshIO.cpp index b0ff9814889..48fb541a01f 100644 --- a/cpp/tests/io/TriangleMeshIO.cpp +++ b/cpp/tests/io/TriangleMeshIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/VoxelGridIO.cpp b/cpp/tests/io/VoxelGridIO.cpp index 6ae783c1b4e..3fe300da2a5 100644 --- a/cpp/tests/io/VoxelGridIO.cpp +++ b/cpp/tests/io/VoxelGridIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FileBIN.cpp b/cpp/tests/io/file_format/FileBIN.cpp index a3b8fca4c92..adb4ce3dae4 100644 --- a/cpp/tests/io/file_format/FileBIN.cpp +++ b/cpp/tests/io/file_format/FileBIN.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FileGLTF.cpp b/cpp/tests/io/file_format/FileGLTF.cpp index 1b5a2a47a64..8a6920276ee 100644 --- a/cpp/tests/io/file_format/FileGLTF.cpp +++ b/cpp/tests/io/file_format/FileGLTF.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FileJPG.cpp b/cpp/tests/io/file_format/FileJPG.cpp index 45828ad9e37..0ab112ca13a 100644 --- a/cpp/tests/io/file_format/FileJPG.cpp +++ b/cpp/tests/io/file_format/FileJPG.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FileJSON.cpp b/cpp/tests/io/file_format/FileJSON.cpp index 7db0044a91f..81fa11334f0 100644 --- a/cpp/tests/io/file_format/FileJSON.cpp +++ b/cpp/tests/io/file_format/FileJSON.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FileLOG.cpp b/cpp/tests/io/file_format/FileLOG.cpp index 05c8a2cd616..222510084bb 100644 --- a/cpp/tests/io/file_format/FileLOG.cpp +++ b/cpp/tests/io/file_format/FileLOG.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FilePCD.cpp b/cpp/tests/io/file_format/FilePCD.cpp index 66f33d86739..c47caf56546 100644 --- a/cpp/tests/io/file_format/FilePCD.cpp +++ b/cpp/tests/io/file_format/FilePCD.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FilePLY.cpp b/cpp/tests/io/file_format/FilePLY.cpp index e27e87d13fd..cc74fcbbe40 100644 --- a/cpp/tests/io/file_format/FilePLY.cpp +++ b/cpp/tests/io/file_format/FilePLY.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FilePNG.cpp b/cpp/tests/io/file_format/FilePNG.cpp index 829fa832feb..e407194dfde 100644 --- a/cpp/tests/io/file_format/FilePNG.cpp +++ b/cpp/tests/io/file_format/FilePNG.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FilePTS.cpp b/cpp/tests/io/file_format/FilePTS.cpp index 467f24095ae..886055d5ef0 100644 --- a/cpp/tests/io/file_format/FilePTS.cpp +++ b/cpp/tests/io/file_format/FilePTS.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FileSTL.cpp b/cpp/tests/io/file_format/FileSTL.cpp index 267e4d2fa70..7e16e8f4bd7 100644 --- a/cpp/tests/io/file_format/FileSTL.cpp +++ b/cpp/tests/io/file_format/FileSTL.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FileXYZ.cpp b/cpp/tests/io/file_format/FileXYZ.cpp index 6a689bcec73..a9d662790ed 100644 --- a/cpp/tests/io/file_format/FileXYZ.cpp +++ b/cpp/tests/io/file_format/FileXYZ.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FileXYZN.cpp b/cpp/tests/io/file_format/FileXYZN.cpp index 5b9ce27fe07..819d305c983 100644 --- a/cpp/tests/io/file_format/FileXYZN.cpp +++ b/cpp/tests/io/file_format/FileXYZN.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/file_format/FileXYZRGB.cpp b/cpp/tests/io/file_format/FileXYZRGB.cpp index 70d1cc1933d..9b83f512633 100644 --- a/cpp/tests/io/file_format/FileXYZRGB.cpp +++ b/cpp/tests/io/file_format/FileXYZRGB.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/rpc/RemoteFunctions.cpp b/cpp/tests/io/rpc/RemoteFunctions.cpp index 38e3c61d25f..989d3e5e510 100644 --- a/cpp/tests/io/rpc/RemoteFunctions.cpp +++ b/cpp/tests/io/rpc/RemoteFunctions.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/io/sensor/AzureKinect/AzureKinectSensorConfig.cpp b/cpp/tests/io/sensor/AzureKinect/AzureKinectSensorConfig.cpp index f50ddc14770..ea8a0be6d62 100644 --- a/cpp/tests/io/sensor/AzureKinect/AzureKinectSensorConfig.cpp +++ b/cpp/tests/io/sensor/AzureKinect/AzureKinectSensorConfig.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/ml/ShapeChecking.cpp b/cpp/tests/ml/ShapeChecking.cpp index 75dd57764a0..9095bd0bd66 100644 --- a/cpp/tests/ml/ShapeChecking.cpp +++ b/cpp/tests/ml/ShapeChecking.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/integration/ScalableTSDFVolume.cpp b/cpp/tests/pipelines/integration/ScalableTSDFVolume.cpp index ea511904c91..dbf0b4015ae 100644 --- a/cpp/tests/pipelines/integration/ScalableTSDFVolume.cpp +++ b/cpp/tests/pipelines/integration/ScalableTSDFVolume.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/integration/UniformTSDFVolume.cpp b/cpp/tests/pipelines/integration/UniformTSDFVolume.cpp index f7b247c5844..a9036f5c2fa 100644 --- a/cpp/tests/pipelines/integration/UniformTSDFVolume.cpp +++ b/cpp/tests/pipelines/integration/UniformTSDFVolume.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/odometry/Odometry.cpp b/cpp/tests/pipelines/odometry/Odometry.cpp index 2e598aa8519..3d5e51ffc5d 100644 --- a/cpp/tests/pipelines/odometry/Odometry.cpp +++ b/cpp/tests/pipelines/odometry/Odometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/odometry/OdometryOption.cpp b/cpp/tests/pipelines/odometry/OdometryOption.cpp index fba8096b164..70ef4c3115a 100644 --- a/cpp/tests/pipelines/odometry/OdometryOption.cpp +++ b/cpp/tests/pipelines/odometry/OdometryOption.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/odometry/OdometryTools.cpp b/cpp/tests/pipelines/odometry/OdometryTools.cpp index e72fb2c8d91..5da3d6132c9 100644 --- a/cpp/tests/pipelines/odometry/OdometryTools.cpp +++ b/cpp/tests/pipelines/odometry/OdometryTools.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/odometry/OdometryTools.h b/cpp/tests/pipelines/odometry/OdometryTools.h index e435345793c..f690d087800 100644 --- a/cpp/tests/pipelines/odometry/OdometryTools.h +++ b/cpp/tests/pipelines/odometry/OdometryTools.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/odometry/RGBDOdometryJacobianFromColorTerm.cpp b/cpp/tests/pipelines/odometry/RGBDOdometryJacobianFromColorTerm.cpp index 02bea126a8b..1e65a8d0121 100644 --- a/cpp/tests/pipelines/odometry/RGBDOdometryJacobianFromColorTerm.cpp +++ b/cpp/tests/pipelines/odometry/RGBDOdometryJacobianFromColorTerm.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/odometry/RGBDOdometryJacobianFromHybridTerm.cpp b/cpp/tests/pipelines/odometry/RGBDOdometryJacobianFromHybridTerm.cpp index e71fd432d83..a79ddbf2da5 100644 --- a/cpp/tests/pipelines/odometry/RGBDOdometryJacobianFromHybridTerm.cpp +++ b/cpp/tests/pipelines/odometry/RGBDOdometryJacobianFromHybridTerm.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/registration/CorrespondenceChecker.cpp b/cpp/tests/pipelines/registration/CorrespondenceChecker.cpp index 6a5a060e7d4..f8c95b0cb1a 100644 --- a/cpp/tests/pipelines/registration/CorrespondenceChecker.cpp +++ b/cpp/tests/pipelines/registration/CorrespondenceChecker.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/registration/FastGlobalRegistration.cpp b/cpp/tests/pipelines/registration/FastGlobalRegistration.cpp index 99f1722c260..c2b4367a77f 100644 --- a/cpp/tests/pipelines/registration/FastGlobalRegistration.cpp +++ b/cpp/tests/pipelines/registration/FastGlobalRegistration.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/registration/Feature.cpp b/cpp/tests/pipelines/registration/Feature.cpp index 359a7530c77..77beaaf55c9 100644 --- a/cpp/tests/pipelines/registration/Feature.cpp +++ b/cpp/tests/pipelines/registration/Feature.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/registration/GeneralizedICP.cpp b/cpp/tests/pipelines/registration/GeneralizedICP.cpp index a8601b24e71..60ec8479992 100644 --- a/cpp/tests/pipelines/registration/GeneralizedICP.cpp +++ b/cpp/tests/pipelines/registration/GeneralizedICP.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // @author Ignacio Vizzo [ivizzo@uni-bonn.de] diff --git a/cpp/tests/pipelines/registration/GlobalOptimization.cpp b/cpp/tests/pipelines/registration/GlobalOptimization.cpp index 9016c716acb..8c3290dbec1 100644 --- a/cpp/tests/pipelines/registration/GlobalOptimization.cpp +++ b/cpp/tests/pipelines/registration/GlobalOptimization.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/registration/GlobalOptimizationConvergenceCriteria.cpp b/cpp/tests/pipelines/registration/GlobalOptimizationConvergenceCriteria.cpp index eca671b1d45..e05e7a0c45b 100644 --- a/cpp/tests/pipelines/registration/GlobalOptimizationConvergenceCriteria.cpp +++ b/cpp/tests/pipelines/registration/GlobalOptimizationConvergenceCriteria.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/registration/PoseGraph.cpp b/cpp/tests/pipelines/registration/PoseGraph.cpp index e286e66be0b..41e27e85422 100644 --- a/cpp/tests/pipelines/registration/PoseGraph.cpp +++ b/cpp/tests/pipelines/registration/PoseGraph.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/registration/Registration.cpp b/cpp/tests/pipelines/registration/Registration.cpp index e160d2a2588..3d66e393e8c 100644 --- a/cpp/tests/pipelines/registration/Registration.cpp +++ b/cpp/tests/pipelines/registration/Registration.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/pipelines/registration/TransformationEstimation.cpp b/cpp/tests/pipelines/registration/TransformationEstimation.cpp index 28d03558024..96fb8333cb7 100644 --- a/cpp/tests/pipelines/registration/TransformationEstimation.cpp +++ b/cpp/tests/pipelines/registration/TransformationEstimation.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/geometry/AxisAlignedBoundingBox.cpp b/cpp/tests/t/geometry/AxisAlignedBoundingBox.cpp index 54405b414ff..2139b40263c 100644 --- a/cpp/tests/t/geometry/AxisAlignedBoundingBox.cpp +++ b/cpp/tests/t/geometry/AxisAlignedBoundingBox.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/geometry/Image.cpp b/cpp/tests/t/geometry/Image.cpp index 1b9fa2112ea..0adf96a5999 100644 --- a/cpp/tests/t/geometry/Image.cpp +++ b/cpp/tests/t/geometry/Image.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/geometry/LineSet.cpp b/cpp/tests/t/geometry/LineSet.cpp index dbc774f2b1d..30c86eaa78f 100644 --- a/cpp/tests/t/geometry/LineSet.cpp +++ b/cpp/tests/t/geometry/LineSet.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/geometry/OrientedBoundingBox.cpp b/cpp/tests/t/geometry/OrientedBoundingBox.cpp index 95a0b4fe983..5a730f4cfb2 100644 --- a/cpp/tests/t/geometry/OrientedBoundingBox.cpp +++ b/cpp/tests/t/geometry/OrientedBoundingBox.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/geometry/PointCloud.cpp b/cpp/tests/t/geometry/PointCloud.cpp index 0b4d7365de6..7d611a818ab 100644 --- a/cpp/tests/t/geometry/PointCloud.cpp +++ b/cpp/tests/t/geometry/PointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/geometry/TensorMap.cpp b/cpp/tests/t/geometry/TensorMap.cpp index 372c6b82270..41be52e5ea7 100644 --- a/cpp/tests/t/geometry/TensorMap.cpp +++ b/cpp/tests/t/geometry/TensorMap.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/geometry/TriangleMesh.cpp b/cpp/tests/t/geometry/TriangleMesh.cpp index d1e2d819eac..1ffbf4dc5f1 100644 --- a/cpp/tests/t/geometry/TriangleMesh.cpp +++ b/cpp/tests/t/geometry/TriangleMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/geometry/VoxelBlockGrid.cpp b/cpp/tests/t/geometry/VoxelBlockGrid.cpp index 570a1868c0c..cb47a424ca1 100644 --- a/cpp/tests/t/geometry/VoxelBlockGrid.cpp +++ b/cpp/tests/t/geometry/VoxelBlockGrid.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/geometry/VtkUtils.cpp b/cpp/tests/t/geometry/VtkUtils.cpp index ad6af29812d..b45e33e9dec 100644 --- a/cpp/tests/t/geometry/VtkUtils.cpp +++ b/cpp/tests/t/geometry/VtkUtils.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/io/ImageIO.cpp b/cpp/tests/t/io/ImageIO.cpp index 12fb7dd511c..db6be27041c 100644 --- a/cpp/tests/t/io/ImageIO.cpp +++ b/cpp/tests/t/io/ImageIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/io/NumpyIO.cpp b/cpp/tests/t/io/NumpyIO.cpp index e80d7ff6fc9..2c76067740d 100644 --- a/cpp/tests/t/io/NumpyIO.cpp +++ b/cpp/tests/t/io/NumpyIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/io/PointCloudIO.cpp b/cpp/tests/t/io/PointCloudIO.cpp index e6f38270fcb..1de79086a17 100644 --- a/cpp/tests/t/io/PointCloudIO.cpp +++ b/cpp/tests/t/io/PointCloudIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/io/TriangleMeshIO.cpp b/cpp/tests/t/io/TriangleMeshIO.cpp index acfd8f1234f..f5333226d9c 100644 --- a/cpp/tests/t/io/TriangleMeshIO.cpp +++ b/cpp/tests/t/io/TriangleMeshIO.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/pipelines/TransformationConverter.cpp b/cpp/tests/t/pipelines/TransformationConverter.cpp index abb868dfdb8..5d8bd0d8434 100644 --- a/cpp/tests/t/pipelines/TransformationConverter.cpp +++ b/cpp/tests/t/pipelines/TransformationConverter.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/pipelines/odometry/RGBDOdometry.cpp b/cpp/tests/t/pipelines/odometry/RGBDOdometry.cpp index aed406fb98e..0df01e1cb01 100644 --- a/cpp/tests/t/pipelines/odometry/RGBDOdometry.cpp +++ b/cpp/tests/t/pipelines/odometry/RGBDOdometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/pipelines/registration/Feature.cpp b/cpp/tests/t/pipelines/registration/Feature.cpp index f4eb9dffa6d..b636b8cd516 100644 --- a/cpp/tests/t/pipelines/registration/Feature.cpp +++ b/cpp/tests/t/pipelines/registration/Feature.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/pipelines/registration/Registration.cpp b/cpp/tests/t/pipelines/registration/Registration.cpp index 75fd20a530d..a29cc99b859 100644 --- a/cpp/tests/t/pipelines/registration/Registration.cpp +++ b/cpp/tests/t/pipelines/registration/Registration.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/pipelines/registration/TransformationEstimation.cpp b/cpp/tests/t/pipelines/registration/TransformationEstimation.cpp index e87c7975e22..2daca846d0a 100644 --- a/cpp/tests/t/pipelines/registration/TransformationEstimation.cpp +++ b/cpp/tests/t/pipelines/registration/TransformationEstimation.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/pipelines/slac/ControlGrid.cpp b/cpp/tests/t/pipelines/slac/ControlGrid.cpp index 14d51e94b46..98bce9d5ef2 100644 --- a/cpp/tests/t/pipelines/slac/ControlGrid.cpp +++ b/cpp/tests/t/pipelines/slac/ControlGrid.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/t/pipelines/slac/SLAC.cpp b/cpp/tests/t/pipelines/slac/SLAC.cpp index fe2813b37eb..bc31cb31044 100644 --- a/cpp/tests/t/pipelines/slac/SLAC.cpp +++ b/cpp/tests/t/pipelines/slac/SLAC.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/test_utility/Compare.cpp b/cpp/tests/test_utility/Compare.cpp index c8c2523a94c..fe6d4dd7e19 100644 --- a/cpp/tests/test_utility/Compare.cpp +++ b/cpp/tests/test_utility/Compare.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/test_utility/Compare.h b/cpp/tests/test_utility/Compare.h index 5e81c5fe07d..ac3d1888999 100644 --- a/cpp/tests/test_utility/Compare.h +++ b/cpp/tests/test_utility/Compare.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/test_utility/Print.h b/cpp/tests/test_utility/Print.h index 58b4fa9123c..c0e4ac98393 100644 --- a/cpp/tests/test_utility/Print.h +++ b/cpp/tests/test_utility/Print.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/test_utility/Rand.cpp b/cpp/tests/test_utility/Rand.cpp index b4ae3ab5545..9b9764c283d 100644 --- a/cpp/tests/test_utility/Rand.cpp +++ b/cpp/tests/test_utility/Rand.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/test_utility/Rand.h b/cpp/tests/test_utility/Rand.h index c040df229c3..cdb270adf40 100644 --- a/cpp/tests/test_utility/Rand.h +++ b/cpp/tests/test_utility/Rand.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/test_utility/Raw.cpp b/cpp/tests/test_utility/Raw.cpp index e001923f88a..8565d5acdd8 100644 --- a/cpp/tests/test_utility/Raw.cpp +++ b/cpp/tests/test_utility/Raw.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/test_utility/Raw.h b/cpp/tests/test_utility/Raw.h index c77ceb71d57..ee297ccf30b 100644 --- a/cpp/tests/test_utility/Raw.h +++ b/cpp/tests/test_utility/Raw.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/test_utility/Sort.cpp b/cpp/tests/test_utility/Sort.cpp index 0563b0d3326..adde2836e56 100644 --- a/cpp/tests/test_utility/Sort.cpp +++ b/cpp/tests/test_utility/Sort.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/test_utility/Sort.h b/cpp/tests/test_utility/Sort.h index 9270cca629e..69632472296 100644 --- a/cpp/tests/test_utility/Sort.h +++ b/cpp/tests/test_utility/Sort.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/Download.cpp b/cpp/tests/utility/Download.cpp index d98679d17bb..bb52efcf432 100644 --- a/cpp/tests/utility/Download.cpp +++ b/cpp/tests/utility/Download.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/Eigen.cpp b/cpp/tests/utility/Eigen.cpp index 5f1c859f03d..deb09558c53 100644 --- a/cpp/tests/utility/Eigen.cpp +++ b/cpp/tests/utility/Eigen.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/Extract.cpp b/cpp/tests/utility/Extract.cpp index 2ac8b49063c..923aff03bc1 100644 --- a/cpp/tests/utility/Extract.cpp +++ b/cpp/tests/utility/Extract.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/FileSystem.cpp b/cpp/tests/utility/FileSystem.cpp index 2c0359166ef..bfdd2dc28bd 100644 --- a/cpp/tests/utility/FileSystem.cpp +++ b/cpp/tests/utility/FileSystem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/Helper.cpp b/cpp/tests/utility/Helper.cpp index 2991660d877..f11b7c59380 100644 --- a/cpp/tests/utility/Helper.cpp +++ b/cpp/tests/utility/Helper.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/Helper.ispc b/cpp/tests/utility/Helper.ispc index 018fba0b900..01515166e6b 100644 --- a/cpp/tests/utility/Helper.ispc +++ b/cpp/tests/utility/Helper.ispc @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/IJsonConvertible.cpp b/cpp/tests/utility/IJsonConvertible.cpp index af7cc8d128b..c91c9113d78 100644 --- a/cpp/tests/utility/IJsonConvertible.cpp +++ b/cpp/tests/utility/IJsonConvertible.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/ISAInfo.cpp b/cpp/tests/utility/ISAInfo.cpp index 74fc83710ae..6b929415613 100644 --- a/cpp/tests/utility/ISAInfo.cpp +++ b/cpp/tests/utility/ISAInfo.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/Logging.cpp b/cpp/tests/utility/Logging.cpp index 23cbae2b620..21edb61e260 100644 --- a/cpp/tests/utility/Logging.cpp +++ b/cpp/tests/utility/Logging.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/Preprocessor.cpp b/cpp/tests/utility/Preprocessor.cpp index e167cc99250..1022fc43896 100644 --- a/cpp/tests/utility/Preprocessor.cpp +++ b/cpp/tests/utility/Preprocessor.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/ProgressBar.cpp b/cpp/tests/utility/ProgressBar.cpp index 4641305813c..9ff9e09b6ae 100644 --- a/cpp/tests/utility/ProgressBar.cpp +++ b/cpp/tests/utility/ProgressBar.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/Random.cpp b/cpp/tests/utility/Random.cpp index 8c321f08758..c31c7442f96 100644 --- a/cpp/tests/utility/Random.cpp +++ b/cpp/tests/utility/Random.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/utility/Timer.cpp b/cpp/tests/utility/Timer.cpp index 55bbeeed736..3e80b0481cb 100644 --- a/cpp/tests/utility/Timer.cpp +++ b/cpp/tests/utility/Timer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tests/visualization/rendering/MaterialModifier.cpp b/cpp/tests/visualization/rendering/MaterialModifier.cpp index a1a6a9246a3..a150e2c99cf 100644 --- a/cpp/tests/visualization/rendering/MaterialModifier.cpp +++ b/cpp/tests/visualization/rendering/MaterialModifier.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tools/ConvertPointCloud.cpp b/cpp/tools/ConvertPointCloud.cpp index a89f3d632b9..eebf4be7df7 100644 --- a/cpp/tools/ConvertPointCloud.cpp +++ b/cpp/tools/ConvertPointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tools/GLInfo.cpp b/cpp/tools/GLInfo.cpp index af9360cc0d2..fac9a1ae94b 100644 --- a/cpp/tools/GLInfo.cpp +++ b/cpp/tools/GLInfo.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tools/ManuallyAlignPointCloud/AlignmentSession.cpp b/cpp/tools/ManuallyAlignPointCloud/AlignmentSession.cpp index 0d26ecfd75d..6899528b282 100644 --- a/cpp/tools/ManuallyAlignPointCloud/AlignmentSession.cpp +++ b/cpp/tools/ManuallyAlignPointCloud/AlignmentSession.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tools/ManuallyAlignPointCloud/AlignmentSession.h b/cpp/tools/ManuallyAlignPointCloud/AlignmentSession.h index 1763742a733..ff3407437b9 100644 --- a/cpp/tools/ManuallyAlignPointCloud/AlignmentSession.h +++ b/cpp/tools/ManuallyAlignPointCloud/AlignmentSession.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tools/ManuallyAlignPointCloud/ManuallyAlignPointCloud.cpp b/cpp/tools/ManuallyAlignPointCloud/ManuallyAlignPointCloud.cpp index c10f1f93675..9846faa5705 100644 --- a/cpp/tools/ManuallyAlignPointCloud/ManuallyAlignPointCloud.cpp +++ b/cpp/tools/ManuallyAlignPointCloud/ManuallyAlignPointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tools/ManuallyAlignPointCloud/VisualizerForAlignment.cpp b/cpp/tools/ManuallyAlignPointCloud/VisualizerForAlignment.cpp index 715160bc9e6..261e5146c6c 100644 --- a/cpp/tools/ManuallyAlignPointCloud/VisualizerForAlignment.cpp +++ b/cpp/tools/ManuallyAlignPointCloud/VisualizerForAlignment.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tools/ManuallyAlignPointCloud/VisualizerForAlignment.h b/cpp/tools/ManuallyAlignPointCloud/VisualizerForAlignment.h index 9742890970e..6ce8c049381 100644 --- a/cpp/tools/ManuallyAlignPointCloud/VisualizerForAlignment.h +++ b/cpp/tools/ManuallyAlignPointCloud/VisualizerForAlignment.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tools/ManuallyCropGeometry.cpp b/cpp/tools/ManuallyCropGeometry.cpp index f40c535ca83..e8777e8ac11 100644 --- a/cpp/tools/ManuallyCropGeometry.cpp +++ b/cpp/tools/ManuallyCropGeometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tools/MergeMesh.cpp b/cpp/tools/MergeMesh.cpp index df64f2ae54e..e7b9d997246 100644 --- a/cpp/tools/MergeMesh.cpp +++ b/cpp/tools/MergeMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/cpp/tools/ViewGeometry.cpp b/cpp/tools/ViewGeometry.cpp index 09339583699..b31dd110c57 100644 --- a/cpp/tools/ViewGeometry.cpp +++ b/cpp/tools/ViewGeometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/docs/conf.py b/docs/conf.py index 9ec55efcaf1..867fcae1423 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/docs/jupyter/jupyter_run_all.py b/docs/jupyter/jupyter_run_all.py index 5cbb244d56d..9c39c2578c0 100644 --- a/docs/jupyter/jupyter_run_all.py +++ b/docs/jupyter/jupyter_run_all.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/docs/jupyter/jupyter_strip_output.py b/docs/jupyter/jupyter_strip_output.py index b08a2731c58..0fb6d562fb1 100644 --- a/docs/jupyter/jupyter_strip_output.py +++ b/docs/jupyter/jupyter_strip_output.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/docs/jupyter/open3d_tutorial.py b/docs/jupyter/open3d_tutorial.py index 36589f76dd9..3aa767f6617 100644 --- a/docs/jupyter/open3d_tutorial.py +++ b/docs/jupyter/open3d_tutorial.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/docs/make_docs.py b/docs/make_docs.py index cc8f7f1a640..03c5ab1919f 100644 --- a/docs/make_docs.py +++ b/docs/make_docs.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/cpp/AzureKinectMKVReader.cpp b/examples/cpp/AzureKinectMKVReader.cpp index 16d0f6cc484..b6ac2199a49 100644 --- a/examples/cpp/AzureKinectMKVReader.cpp +++ b/examples/cpp/AzureKinectMKVReader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/AzureKinectRecord.cpp b/examples/cpp/AzureKinectRecord.cpp index 05e8ee91460..15fe045b47c 100644 --- a/examples/cpp/AzureKinectRecord.cpp +++ b/examples/cpp/AzureKinectRecord.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. diff --git a/examples/cpp/AzureKinectViewer.cpp b/examples/cpp/AzureKinectViewer.cpp index e525e50001d..48913663a20 100644 --- a/examples/cpp/AzureKinectViewer.cpp +++ b/examples/cpp/AzureKinectViewer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. diff --git a/examples/cpp/CameraPoseTrajectory.cpp b/examples/cpp/CameraPoseTrajectory.cpp index dfd4d71eeef..4498dd871e7 100644 --- a/examples/cpp/CameraPoseTrajectory.cpp +++ b/examples/cpp/CameraPoseTrajectory.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/ColorMapOptimization.cpp b/examples/cpp/ColorMapOptimization.cpp index 7de5bb6bf10..c96b3da17ec 100644 --- a/examples/cpp/ColorMapOptimization.cpp +++ b/examples/cpp/ColorMapOptimization.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/DepthCapture.cpp b/examples/cpp/DepthCapture.cpp index 8ae8cba7b58..30715e95df8 100644 --- a/examples/cpp/DepthCapture.cpp +++ b/examples/cpp/DepthCapture.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/Draw.cpp b/examples/cpp/Draw.cpp index c8e05973b35..a3b3fb74404 100644 --- a/examples/cpp/Draw.cpp +++ b/examples/cpp/Draw.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/DrawWebRTC.cpp b/examples/cpp/DrawWebRTC.cpp index 96dccdd164e..45fdce9fe80 100644 --- a/examples/cpp/DrawWebRTC.cpp +++ b/examples/cpp/DrawWebRTC.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/EvaluatePCDMatch.cpp b/examples/cpp/EvaluatePCDMatch.cpp index ce3f07c1864..b26ebd2986b 100644 --- a/examples/cpp/EvaluatePCDMatch.cpp +++ b/examples/cpp/EvaluatePCDMatch.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/FileDialog.cpp b/examples/cpp/FileDialog.cpp index b4f25195145..ea0564cdc0c 100644 --- a/examples/cpp/FileDialog.cpp +++ b/examples/cpp/FileDialog.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/FileSystem.cpp b/examples/cpp/FileSystem.cpp index b93ea9a1c2b..bb7d5a84db4 100644 --- a/examples/cpp/FileSystem.cpp +++ b/examples/cpp/FileSystem.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/Flann.cpp b/examples/cpp/Flann.cpp index 4217c3e2a81..c747920bcaa 100644 --- a/examples/cpp/Flann.cpp +++ b/examples/cpp/Flann.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/GeneralizedICP.cpp b/examples/cpp/GeneralizedICP.cpp index 614c9cf5b86..92c7b7171db 100644 --- a/examples/cpp/GeneralizedICP.cpp +++ b/examples/cpp/GeneralizedICP.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/ISSKeypoints.cpp b/examples/cpp/ISSKeypoints.cpp index c5088d9b11b..768883ae65a 100644 --- a/examples/cpp/ISSKeypoints.cpp +++ b/examples/cpp/ISSKeypoints.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- // @author Ignacio Vizzo [ivizzo@uni-bonn.de] diff --git a/examples/cpp/Image.cpp b/examples/cpp/Image.cpp index 9ea23a34615..1603e2c9f4d 100644 --- a/examples/cpp/Image.cpp +++ b/examples/cpp/Image.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/IntegrateRGBD.cpp b/examples/cpp/IntegrateRGBD.cpp index 39fc3d98225..0ffcaa1a219 100644 --- a/examples/cpp/IntegrateRGBD.cpp +++ b/examples/cpp/IntegrateRGBD.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/LineSet.cpp b/examples/cpp/LineSet.cpp index 836e3d740e4..9307354857f 100644 --- a/examples/cpp/LineSet.cpp +++ b/examples/cpp/LineSet.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/Log.cpp b/examples/cpp/Log.cpp index ba5ebeb408a..8a6cdd2d436 100644 --- a/examples/cpp/Log.cpp +++ b/examples/cpp/Log.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/MultipleWindows.cpp b/examples/cpp/MultipleWindows.cpp index 01921f9cf33..2735d1f4185 100644 --- a/examples/cpp/MultipleWindows.cpp +++ b/examples/cpp/MultipleWindows.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/Octree.cpp b/examples/cpp/Octree.cpp index bf0cca65323..210eae7d221 100644 --- a/examples/cpp/Octree.cpp +++ b/examples/cpp/Octree.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/OdometryRGBD.cpp b/examples/cpp/OdometryRGBD.cpp index 1848edbed05..f5f8037031d 100644 --- a/examples/cpp/OdometryRGBD.cpp +++ b/examples/cpp/OdometryRGBD.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/OfflineSLAM.cpp b/examples/cpp/OfflineSLAM.cpp index 3e67b194b21..d865b537fb2 100644 --- a/examples/cpp/OfflineSLAM.cpp +++ b/examples/cpp/OfflineSLAM.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/OffscreenRendering.cpp b/examples/cpp/OffscreenRendering.cpp index 5e73cda538b..18bc71d3b76 100644 --- a/examples/cpp/OffscreenRendering.cpp +++ b/examples/cpp/OffscreenRendering.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/OnlineSLAMRGBD.cpp b/examples/cpp/OnlineSLAMRGBD.cpp index 70f915d5b5f..2101e7aab18 100644 --- a/examples/cpp/OnlineSLAMRGBD.cpp +++ b/examples/cpp/OnlineSLAMRGBD.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/OnlineSLAMRealSense.cpp b/examples/cpp/OnlineSLAMRealSense.cpp index 4e1b26aa447..754a0d41371 100644 --- a/examples/cpp/OnlineSLAMRealSense.cpp +++ b/examples/cpp/OnlineSLAMRealSense.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/OnlineSLAMUtil.h b/examples/cpp/OnlineSLAMUtil.h index 585f18a8fbe..2fbd87e4042 100644 --- a/examples/cpp/OnlineSLAMUtil.h +++ b/examples/cpp/OnlineSLAMUtil.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/OpenMP.cpp b/examples/cpp/OpenMP.cpp index 0995a0bf49e..f61e9aa2909 100644 --- a/examples/cpp/OpenMP.cpp +++ b/examples/cpp/OpenMP.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/PCDFileFormat.cpp b/examples/cpp/PCDFileFormat.cpp index 6de798ef5ac..0bd7db87226 100644 --- a/examples/cpp/PCDFileFormat.cpp +++ b/examples/cpp/PCDFileFormat.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/PlanarPatchDetection.cpp b/examples/cpp/PlanarPatchDetection.cpp index ccc5dc28747..b8c4c41ef98 100644 --- a/examples/cpp/PlanarPatchDetection.cpp +++ b/examples/cpp/PlanarPatchDetection.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/PointCloud.cpp b/examples/cpp/PointCloud.cpp index 9de7cc3b11c..73bc9e15209 100644 --- a/examples/cpp/PointCloud.cpp +++ b/examples/cpp/PointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/PoseGraph.cpp b/examples/cpp/PoseGraph.cpp index 226a35cafdc..179e9210813 100644 --- a/examples/cpp/PoseGraph.cpp +++ b/examples/cpp/PoseGraph.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/ProgramOptions.cpp b/examples/cpp/ProgramOptions.cpp index 0c606ca93ee..38483fd885b 100644 --- a/examples/cpp/ProgramOptions.cpp +++ b/examples/cpp/ProgramOptions.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/RGBDOdometry.cpp b/examples/cpp/RGBDOdometry.cpp index 536e7a883ec..2a292519d3d 100644 --- a/examples/cpp/RGBDOdometry.cpp +++ b/examples/cpp/RGBDOdometry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/RealSenseBagReader.cpp b/examples/cpp/RealSenseBagReader.cpp index 8fd81397022..a231a1759f6 100644 --- a/examples/cpp/RealSenseBagReader.cpp +++ b/examples/cpp/RealSenseBagReader.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/RealSenseRecorder.cpp b/examples/cpp/RealSenseRecorder.cpp index 2efa912cc00..2904703cb52 100644 --- a/examples/cpp/RealSenseRecorder.cpp +++ b/examples/cpp/RealSenseRecorder.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/RegistrationColoredICP.cpp b/examples/cpp/RegistrationColoredICP.cpp index 9f5d5776382..eb07869000e 100644 --- a/examples/cpp/RegistrationColoredICP.cpp +++ b/examples/cpp/RegistrationColoredICP.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/RegistrationDopplerICP.cpp b/examples/cpp/RegistrationDopplerICP.cpp index 331bd8dfd56..07acea0afd0 100644 --- a/examples/cpp/RegistrationDopplerICP.cpp +++ b/examples/cpp/RegistrationDopplerICP.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/RegistrationFGR.cpp b/examples/cpp/RegistrationFGR.cpp index 77c0120d0b1..c0d0d18377d 100644 --- a/examples/cpp/RegistrationFGR.cpp +++ b/examples/cpp/RegistrationFGR.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/RegistrationRANSAC.cpp b/examples/cpp/RegistrationRANSAC.cpp index 2a84bbcff04..7e6829657e6 100644 --- a/examples/cpp/RegistrationRANSAC.cpp +++ b/examples/cpp/RegistrationRANSAC.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/SLAC.cpp b/examples/cpp/SLAC.cpp index 071ee192e0d..c783a3470aa 100644 --- a/examples/cpp/SLAC.cpp +++ b/examples/cpp/SLAC.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/SLACIntegrate.cpp b/examples/cpp/SLACIntegrate.cpp index 3bf00e14e0f..593435e0802 100644 --- a/examples/cpp/SLACIntegrate.cpp +++ b/examples/cpp/SLACIntegrate.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/SYCLDemo.cpp b/examples/cpp/SYCLDemo.cpp index 2fcd8c55dd1..2dcf7c1d8dd 100644 --- a/examples/cpp/SYCLDemo.cpp +++ b/examples/cpp/SYCLDemo.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/TICP.cpp b/examples/cpp/TICP.cpp index d7995e233f1..a63298c7614 100644 --- a/examples/cpp/TICP.cpp +++ b/examples/cpp/TICP.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/TICPSequential.cpp b/examples/cpp/TICPSequential.cpp index d0bf4dcee42..3efba06e75c 100644 --- a/examples/cpp/TICPSequential.cpp +++ b/examples/cpp/TICPSequential.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/TIntegrateRGBD.cpp b/examples/cpp/TIntegrateRGBD.cpp index cab188b6dc8..283bb40d79b 100644 --- a/examples/cpp/TIntegrateRGBD.cpp +++ b/examples/cpp/TIntegrateRGBD.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #include "open3d/Open3D.h" diff --git a/examples/cpp/TOdometryRGBD.cpp b/examples/cpp/TOdometryRGBD.cpp index a39580ed018..c4414f4652f 100644 --- a/examples/cpp/TOdometryRGBD.cpp +++ b/examples/cpp/TOdometryRGBD.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #include "open3d/Open3D.h" diff --git a/examples/cpp/TriangleMesh.cpp b/examples/cpp/TriangleMesh.cpp index 64082476cb5..be3b5215ea9 100644 --- a/examples/cpp/TriangleMesh.cpp +++ b/examples/cpp/TriangleMesh.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/TrimMeshBasedOnPointCloud.cpp b/examples/cpp/TrimMeshBasedOnPointCloud.cpp index a5f82506f0a..ffb5f47d8c4 100644 --- a/examples/cpp/TrimMeshBasedOnPointCloud.cpp +++ b/examples/cpp/TrimMeshBasedOnPointCloud.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/ViewDistances.cpp b/examples/cpp/ViewDistances.cpp index ab61377f3f9..2404645c379 100644 --- a/examples/cpp/ViewDistances.cpp +++ b/examples/cpp/ViewDistances.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/ViewPCDMatch.cpp b/examples/cpp/ViewPCDMatch.cpp index 526f3617bb6..c8669f4f48e 100644 --- a/examples/cpp/ViewPCDMatch.cpp +++ b/examples/cpp/ViewPCDMatch.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/Visualizer.cpp b/examples/cpp/Visualizer.cpp index d7ffcedbc66..44bedaeec02 100644 --- a/examples/cpp/Visualizer.cpp +++ b/examples/cpp/Visualizer.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/Voxelization.cpp b/examples/cpp/Voxelization.cpp index e0265b3f1d0..5461dba55ec 100644 --- a/examples/cpp/Voxelization.cpp +++ b/examples/cpp/Voxelization.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/examples/cpp/registration_example_util/download_kitti.py b/examples/cpp/registration_example_util/download_kitti.py index f736353487f..a202d32aaf0 100644 --- a/examples/cpp/registration_example_util/download_kitti.py +++ b/examples/cpp/registration_example_util/download_kitti.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/benchmark/benchmark_fgr.py b/examples/python/benchmark/benchmark_fgr.py index 57b02bd09b1..8cf2b0d46bf 100644 --- a/examples/python/benchmark/benchmark_fgr.py +++ b/examples/python/benchmark/benchmark_fgr.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/benchmark/benchmark_nns.py b/examples/python/benchmark/benchmark_nns.py index 0b18a37e97a..b1242af5deb 100644 --- a/examples/python/benchmark/benchmark_nns.py +++ b/examples/python/benchmark/benchmark_nns.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/benchmark/benchmark_pre.py b/examples/python/benchmark/benchmark_pre.py index 3d949cc42c3..f52102b351d 100644 --- a/examples/python/benchmark/benchmark_pre.py +++ b/examples/python/benchmark/benchmark_pre.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/benchmark/benchmark_ransac.py b/examples/python/benchmark/benchmark_ransac.py index 08d833cb9eb..d22740227c7 100644 --- a/examples/python/benchmark/benchmark_ransac.py +++ b/examples/python/benchmark/benchmark_ransac.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/benchmark/benchmark_tsdf.py b/examples/python/benchmark/benchmark_tsdf.py index 44f38d45370..429240c41db 100644 --- a/examples/python/benchmark/benchmark_tsdf.py +++ b/examples/python/benchmark/benchmark_tsdf.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/benchmark/benchmark_utils.py b/examples/python/benchmark/benchmark_utils.py index d7f6e1dbb9d..12af2f3cddb 100644 --- a/examples/python/benchmark/benchmark_utils.py +++ b/examples/python/benchmark/benchmark_utils.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/camera/camera_trajectory.py b/examples/python/camera/camera_trajectory.py index 132dea28bb8..4b729fee07d 100644 --- a/examples/python/camera/camera_trajectory.py +++ b/examples/python/camera/camera_trajectory.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/image_processing.py b/examples/python/geometry/image_processing.py index abf9bde1c72..c0a5056236c 100644 --- a/examples/python/geometry/image_processing.py +++ b/examples/python/geometry/image_processing.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/kd_tree_feature_matching.py b/examples/python/geometry/kd_tree_feature_matching.py index 89f21f20245..10a894e03ba 100644 --- a/examples/python/geometry/kd_tree_feature_matching.py +++ b/examples/python/geometry/kd_tree_feature_matching.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/kd_tree_search.py b/examples/python/geometry/kd_tree_search.py index 145439b52d4..46ed5e8ae62 100644 --- a/examples/python/geometry/kd_tree_search.py +++ b/examples/python/geometry/kd_tree_search.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Build a KDTree and use it for neighbour search""" diff --git a/examples/python/geometry/octree_find_leaf.py b/examples/python/geometry/octree_find_leaf.py index 85eaae4720a..3fd598be08e 100644 --- a/examples/python/geometry/octree_find_leaf.py +++ b/examples/python/geometry/octree_find_leaf.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/octree_from_voxel_grid.py b/examples/python/geometry/octree_from_voxel_grid.py index d5130a41bb4..7eeb7a3744c 100644 --- a/examples/python/geometry/octree_from_voxel_grid.py +++ b/examples/python/geometry/octree_from_voxel_grid.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/octree_point_cloud.py b/examples/python/geometry/octree_point_cloud.py index 6ed73e02259..bf2f68ee123 100644 --- a/examples/python/geometry/octree_point_cloud.py +++ b/examples/python/geometry/octree_point_cloud.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/octree_traversal.py b/examples/python/geometry/octree_traversal.py index e890d390792..37c3379f1d8 100644 --- a/examples/python/geometry/octree_traversal.py +++ b/examples/python/geometry/octree_traversal.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_bounding_box.py b/examples/python/geometry/point_cloud_bounding_box.py index 79ac4667fe2..45d9dfee040 100644 --- a/examples/python/geometry/point_cloud_bounding_box.py +++ b/examples/python/geometry/point_cloud_bounding_box.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_convex_hull.py b/examples/python/geometry/point_cloud_convex_hull.py index 98d3d5af175..c23541f8dd5 100644 --- a/examples/python/geometry/point_cloud_convex_hull.py +++ b/examples/python/geometry/point_cloud_convex_hull.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_crop.py b/examples/python/geometry/point_cloud_crop.py index ac53ad63862..e1cb977fa1d 100644 --- a/examples/python/geometry/point_cloud_crop.py +++ b/examples/python/geometry/point_cloud_crop.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_dbscan_clustering.py b/examples/python/geometry/point_cloud_dbscan_clustering.py index 5b938636e00..5fbf0e014f6 100644 --- a/examples/python/geometry/point_cloud_dbscan_clustering.py +++ b/examples/python/geometry/point_cloud_dbscan_clustering.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_distance.py b/examples/python/geometry/point_cloud_distance.py index 00207221134..1db4e15860b 100644 --- a/examples/python/geometry/point_cloud_distance.py +++ b/examples/python/geometry/point_cloud_distance.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_farthest_point_sampling.py b/examples/python/geometry/point_cloud_farthest_point_sampling.py index f4892b2e432..a799d2f0601 100644 --- a/examples/python/geometry/point_cloud_farthest_point_sampling.py +++ b/examples/python/geometry/point_cloud_farthest_point_sampling.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_hidden_point_removal.py b/examples/python/geometry/point_cloud_hidden_point_removal.py index ce5fa9bd74d..114e91ae9cc 100644 --- a/examples/python/geometry/point_cloud_hidden_point_removal.py +++ b/examples/python/geometry/point_cloud_hidden_point_removal.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_iss_keypoint_detector.py b/examples/python/geometry/point_cloud_iss_keypoint_detector.py index 486ef3104fa..06c7390b836 100644 --- a/examples/python/geometry/point_cloud_iss_keypoint_detector.py +++ b/examples/python/geometry/point_cloud_iss_keypoint_detector.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_normal_estimation.py b/examples/python/geometry/point_cloud_normal_estimation.py index e32f4b8703f..32f955bfbe7 100644 --- a/examples/python/geometry/point_cloud_normal_estimation.py +++ b/examples/python/geometry/point_cloud_normal_estimation.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_outlier_removal_radius.py b/examples/python/geometry/point_cloud_outlier_removal_radius.py index 99c53244e6d..3df3eed5a7b 100644 --- a/examples/python/geometry/point_cloud_outlier_removal_radius.py +++ b/examples/python/geometry/point_cloud_outlier_removal_radius.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_outlier_removal_statistical.py b/examples/python/geometry/point_cloud_outlier_removal_statistical.py index 1dc02e83b57..30f451b2f1f 100644 --- a/examples/python/geometry/point_cloud_outlier_removal_statistical.py +++ b/examples/python/geometry/point_cloud_outlier_removal_statistical.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_paint.py b/examples/python/geometry/point_cloud_paint.py index e82db48f215..4364964bc39 100644 --- a/examples/python/geometry/point_cloud_paint.py +++ b/examples/python/geometry/point_cloud_paint.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_plane_segmentation.py b/examples/python/geometry/point_cloud_plane_segmentation.py index f5650260843..20ce092de1f 100644 --- a/examples/python/geometry/point_cloud_plane_segmentation.py +++ b/examples/python/geometry/point_cloud_plane_segmentation.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_to_depth.py b/examples/python/geometry/point_cloud_to_depth.py index 53a58d4bfb1..af5a483d501 100644 --- a/examples/python/geometry/point_cloud_to_depth.py +++ b/examples/python/geometry/point_cloud_to_depth.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_to_rgbd.py b/examples/python/geometry/point_cloud_to_rgbd.py index 179fd29d172..899aa2675be 100644 --- a/examples/python/geometry/point_cloud_to_rgbd.py +++ b/examples/python/geometry/point_cloud_to_rgbd.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_transformation.py b/examples/python/geometry/point_cloud_transformation.py index 38d100d4fec..3383a13308c 100644 --- a/examples/python/geometry/point_cloud_transformation.py +++ b/examples/python/geometry/point_cloud_transformation.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_voxel_downsampling.py b/examples/python/geometry/point_cloud_voxel_downsampling.py index ad0ac27c49f..cf219c889ac 100644 --- a/examples/python/geometry/point_cloud_voxel_downsampling.py +++ b/examples/python/geometry/point_cloud_voxel_downsampling.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/point_cloud_with_numpy.py b/examples/python/geometry/point_cloud_with_numpy.py index bcd5291a158..de0394d7c73 100644 --- a/examples/python/geometry/point_cloud_with_numpy.py +++ b/examples/python/geometry/point_cloud_with_numpy.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/ray_casting_closest_geometry.py b/examples/python/geometry/ray_casting_closest_geometry.py index d465800c45d..9e8c82db9d4 100644 --- a/examples/python/geometry/ray_casting_closest_geometry.py +++ b/examples/python/geometry/ray_casting_closest_geometry.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/ray_casting_sdf.py b/examples/python/geometry/ray_casting_sdf.py index 5536ad18401..62b862fa3f9 100644 --- a/examples/python/geometry/ray_casting_sdf.py +++ b/examples/python/geometry/ray_casting_sdf.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/ray_casting_to_image.py b/examples/python/geometry/ray_casting_to_image.py index 17ed49aa9d4..153714ecc47 100644 --- a/examples/python/geometry/ray_casting_to_image.py +++ b/examples/python/geometry/ray_casting_to_image.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/rgbd_datasets.py b/examples/python/geometry/rgbd_datasets.py index c2296e22d85..812e10b19c2 100644 --- a/examples/python/geometry/rgbd_datasets.py +++ b/examples/python/geometry/rgbd_datasets.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_connected_components.py b/examples/python/geometry/triangle_mesh_connected_components.py index f4dcf9d1d02..8672b9ec845 100644 --- a/examples/python/geometry/triangle_mesh_connected_components.py +++ b/examples/python/geometry/triangle_mesh_connected_components.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_cropping.py b/examples/python/geometry/triangle_mesh_cropping.py index 62b71c889e2..663b06c00c2 100644 --- a/examples/python/geometry/triangle_mesh_cropping.py +++ b/examples/python/geometry/triangle_mesh_cropping.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_deformation.py b/examples/python/geometry/triangle_mesh_deformation.py index 70014714004..967a0a49649 100644 --- a/examples/python/geometry/triangle_mesh_deformation.py +++ b/examples/python/geometry/triangle_mesh_deformation.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_filtering_average.py b/examples/python/geometry/triangle_mesh_filtering_average.py index 4f7d271f9d1..d53d5a15de1 100644 --- a/examples/python/geometry/triangle_mesh_filtering_average.py +++ b/examples/python/geometry/triangle_mesh_filtering_average.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_from_point_cloud_alpha_shapes.py b/examples/python/geometry/triangle_mesh_from_point_cloud_alpha_shapes.py index 59e7a75754c..cb4ada90c5f 100644 --- a/examples/python/geometry/triangle_mesh_from_point_cloud_alpha_shapes.py +++ b/examples/python/geometry/triangle_mesh_from_point_cloud_alpha_shapes.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_from_point_cloud_ball_pivoting.py b/examples/python/geometry/triangle_mesh_from_point_cloud_ball_pivoting.py index 9b3b58bdb8d..31adc14b076 100644 --- a/examples/python/geometry/triangle_mesh_from_point_cloud_ball_pivoting.py +++ b/examples/python/geometry/triangle_mesh_from_point_cloud_ball_pivoting.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_from_point_cloud_poisson.py b/examples/python/geometry/triangle_mesh_from_point_cloud_poisson.py index 5c3122861af..3be6163f7ef 100644 --- a/examples/python/geometry/triangle_mesh_from_point_cloud_poisson.py +++ b/examples/python/geometry/triangle_mesh_from_point_cloud_poisson.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_normal_estimation.py b/examples/python/geometry/triangle_mesh_normal_estimation.py index 99a4c2dc9ce..5dbac60747d 100644 --- a/examples/python/geometry/triangle_mesh_normal_estimation.py +++ b/examples/python/geometry/triangle_mesh_normal_estimation.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_properties.py b/examples/python/geometry/triangle_mesh_properties.py index 372e79590e9..3acb0ee2b8e 100644 --- a/examples/python/geometry/triangle_mesh_properties.py +++ b/examples/python/geometry/triangle_mesh_properties.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_sampling.py b/examples/python/geometry/triangle_mesh_sampling.py index f75ae1ce7ec..388f9cd2e44 100644 --- a/examples/python/geometry/triangle_mesh_sampling.py +++ b/examples/python/geometry/triangle_mesh_sampling.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_simplification_decimation.py b/examples/python/geometry/triangle_mesh_simplification_decimation.py index cd286014ef9..5cb6d671d40 100644 --- a/examples/python/geometry/triangle_mesh_simplification_decimation.py +++ b/examples/python/geometry/triangle_mesh_simplification_decimation.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_simplification_vertex_clustering.py b/examples/python/geometry/triangle_mesh_simplification_vertex_clustering.py index 51e76f57617..ba742250907 100644 --- a/examples/python/geometry/triangle_mesh_simplification_vertex_clustering.py +++ b/examples/python/geometry/triangle_mesh_simplification_vertex_clustering.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_subdivision.py b/examples/python/geometry/triangle_mesh_subdivision.py index 88807e32a7c..266ea664f6a 100644 --- a/examples/python/geometry/triangle_mesh_subdivision.py +++ b/examples/python/geometry/triangle_mesh_subdivision.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_transformation.py b/examples/python/geometry/triangle_mesh_transformation.py index 65b3f7b36c0..76126453b5e 100644 --- a/examples/python/geometry/triangle_mesh_transformation.py +++ b/examples/python/geometry/triangle_mesh_transformation.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/triangle_mesh_with_numpy.py b/examples/python/geometry/triangle_mesh_with_numpy.py index 6b63b5dddb5..d63725bc6e7 100644 --- a/examples/python/geometry/triangle_mesh_with_numpy.py +++ b/examples/python/geometry/triangle_mesh_with_numpy.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/voxel_grid_carving.py b/examples/python/geometry/voxel_grid_carving.py index bd6d4f97df9..eccca9f9f1f 100644 --- a/examples/python/geometry/voxel_grid_carving.py +++ b/examples/python/geometry/voxel_grid_carving.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/voxel_grid_from_point_cloud.py b/examples/python/geometry/voxel_grid_from_point_cloud.py index 371b3d7f360..a8e2d4e92d1 100644 --- a/examples/python/geometry/voxel_grid_from_point_cloud.py +++ b/examples/python/geometry/voxel_grid_from_point_cloud.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/geometry/voxel_grid_from_triangle_mesh.py b/examples/python/geometry/voxel_grid_from_triangle_mesh.py index a99bf250556..0c1493884ff 100644 --- a/examples/python/geometry/voxel_grid_from_triangle_mesh.py +++ b/examples/python/geometry/voxel_grid_from_triangle_mesh.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/io/image_io.py b/examples/python/io/image_io.py index 0b34472f726..2bda0b78360 100644 --- a/examples/python/io/image_io.py +++ b/examples/python/io/image_io.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/io/point_cloud_io.py b/examples/python/io/point_cloud_io.py index 0d2a8086d7a..0d7f97a6838 100644 --- a/examples/python/io/point_cloud_io.py +++ b/examples/python/io/point_cloud_io.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/io/realsense_io.py b/examples/python/io/realsense_io.py index fa386554034..d3ba99c1c3d 100644 --- a/examples/python/io/realsense_io.py +++ b/examples/python/io/realsense_io.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Demonstrate RealSense camera discovery and frame capture. An RS bag file is diff --git a/examples/python/io/triangle_mesh_io.py b/examples/python/io/triangle_mesh_io.py index 13adfa14e6f..b78ebb4bb98 100644 --- a/examples/python/io/triangle_mesh_io.py +++ b/examples/python/io/triangle_mesh_io.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/open3d_example.py b/examples/python/open3d_example.py index 486d5387898..f3f4b7e28b6 100644 --- a/examples/python/open3d_example.py +++ b/examples/python/open3d_example.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/pipelines/colored_icp_registration.py b/examples/python/pipelines/colored_icp_registration.py index 89a7eb04849..dbd1879cad4 100644 --- a/examples/python/pipelines/colored_icp_registration.py +++ b/examples/python/pipelines/colored_icp_registration.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """ICP variant that uses both geometry and color for registration""" diff --git a/examples/python/pipelines/doppler_icp_registration.py b/examples/python/pipelines/doppler_icp_registration.py index 5fface38e6e..e87d6eb361b 100644 --- a/examples/python/pipelines/doppler_icp_registration.py +++ b/examples/python/pipelines/doppler_icp_registration.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Example script to run Doppler ICP point cloud registration. diff --git a/examples/python/pipelines/icp_registration.py b/examples/python/pipelines/icp_registration.py index 082794b7895..6badc4f5bd5 100644 --- a/examples/python/pipelines/icp_registration.py +++ b/examples/python/pipelines/icp_registration.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """ICP (Iterative Closest Point) registration algorithm""" diff --git a/examples/python/pipelines/multiway_registration.py b/examples/python/pipelines/multiway_registration.py index 3f2bc903ff2..7b634481ae6 100644 --- a/examples/python/pipelines/multiway_registration.py +++ b/examples/python/pipelines/multiway_registration.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Align multiple pieces of geometry in a global space""" diff --git a/examples/python/pipelines/pose_graph_optimization.py b/examples/python/pipelines/pose_graph_optimization.py index b6061dc897c..a21d95677fe 100644 --- a/examples/python/pipelines/pose_graph_optimization.py +++ b/examples/python/pipelines/pose_graph_optimization.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/pipelines/registration_fgr.py b/examples/python/pipelines/registration_fgr.py index 06de478ac54..35285f5aaf4 100644 --- a/examples/python/pipelines/registration_fgr.py +++ b/examples/python/pipelines/registration_fgr.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/pipelines/registration_ransac.py b/examples/python/pipelines/registration_ransac.py index df7e73dfa51..eca030a03d8 100644 --- a/examples/python/pipelines/registration_ransac.py +++ b/examples/python/pipelines/registration_ransac.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/pipelines/rgbd_integration_uniform.py b/examples/python/pipelines/rgbd_integration_uniform.py index 2bbe318064e..a1659efd442 100644 --- a/examples/python/pipelines/rgbd_integration_uniform.py +++ b/examples/python/pipelines/rgbd_integration_uniform.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/pipelines/rgbd_odometry.py b/examples/python/pipelines/rgbd_odometry.py index 56912e04e1d..c735644c611 100644 --- a/examples/python/pipelines/rgbd_odometry.py +++ b/examples/python/pipelines/rgbd_odometry.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Find camera movement between two consecutive RGBD image pairs""" diff --git a/examples/python/pipelines/robust_icp.py b/examples/python/pipelines/robust_icp.py index a0e75f2acf2..dcca2e8e120 100644 --- a/examples/python/pipelines/robust_icp.py +++ b/examples/python/pipelines/robust_icp.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Outlier rejection using robust kernels for ICP""" diff --git a/examples/python/reconstruction_system/color_map_optimization_for_reconstruction_system.py b/examples/python/reconstruction_system/color_map_optimization_for_reconstruction_system.py index 173f6f52c22..587199eb757 100644 --- a/examples/python/reconstruction_system/color_map_optimization_for_reconstruction_system.py +++ b/examples/python/reconstruction_system/color_map_optimization_for_reconstruction_system.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/data_loader.py b/examples/python/reconstruction_system/data_loader.py index 99ba265265e..7ec6b108a12 100644 --- a/examples/python/reconstruction_system/data_loader.py +++ b/examples/python/reconstruction_system/data_loader.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/debug/pairwise_pc_alignment.py b/examples/python/reconstruction_system/debug/pairwise_pc_alignment.py index fdc899d744e..29052e855eb 100644 --- a/examples/python/reconstruction_system/debug/pairwise_pc_alignment.py +++ b/examples/python/reconstruction_system/debug/pairwise_pc_alignment.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/debug/pairwise_rgbd_alignment.py b/examples/python/reconstruction_system/debug/pairwise_rgbd_alignment.py index f9b87c2c1d3..915e079bb61 100644 --- a/examples/python/reconstruction_system/debug/pairwise_rgbd_alignment.py +++ b/examples/python/reconstruction_system/debug/pairwise_rgbd_alignment.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/debug/visualize_alignment.py b/examples/python/reconstruction_system/debug/visualize_alignment.py index 031b9cc4882..b6f51f0405e 100644 --- a/examples/python/reconstruction_system/debug/visualize_alignment.py +++ b/examples/python/reconstruction_system/debug/visualize_alignment.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/debug/visualize_fragments.py b/examples/python/reconstruction_system/debug/visualize_fragments.py index 2c05bd19142..f13b67cb0ee 100644 --- a/examples/python/reconstruction_system/debug/visualize_fragments.py +++ b/examples/python/reconstruction_system/debug/visualize_fragments.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/debug/visualize_pointcloud.py b/examples/python/reconstruction_system/debug/visualize_pointcloud.py index ee20d9aa792..65ee7e06766 100644 --- a/examples/python/reconstruction_system/debug/visualize_pointcloud.py +++ b/examples/python/reconstruction_system/debug/visualize_pointcloud.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/debug/visualize_scene.py b/examples/python/reconstruction_system/debug/visualize_scene.py index 353d4bac04a..fa1c526b5ba 100644 --- a/examples/python/reconstruction_system/debug/visualize_scene.py +++ b/examples/python/reconstruction_system/debug/visualize_scene.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/initialize_config.py b/examples/python/reconstruction_system/initialize_config.py index ee9c4c747c7..c1f8ac4d894 100644 --- a/examples/python/reconstruction_system/initialize_config.py +++ b/examples/python/reconstruction_system/initialize_config.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/integrate_scene.py b/examples/python/reconstruction_system/integrate_scene.py index f80e8d55f28..1fceb37a691 100644 --- a/examples/python/reconstruction_system/integrate_scene.py +++ b/examples/python/reconstruction_system/integrate_scene.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/make_fragments.py b/examples/python/reconstruction_system/make_fragments.py index dc4e59d0780..037997aa4cb 100644 --- a/examples/python/reconstruction_system/make_fragments.py +++ b/examples/python/reconstruction_system/make_fragments.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/opencv_pose_estimation.py b/examples/python/reconstruction_system/opencv_pose_estimation.py index 47714065858..7c9040086b6 100644 --- a/examples/python/reconstruction_system/opencv_pose_estimation.py +++ b/examples/python/reconstruction_system/opencv_pose_estimation.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/optimize_posegraph.py b/examples/python/reconstruction_system/optimize_posegraph.py index ddc57aa0518..3a73750a829 100644 --- a/examples/python/reconstruction_system/optimize_posegraph.py +++ b/examples/python/reconstruction_system/optimize_posegraph.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/refine_registration.py b/examples/python/reconstruction_system/refine_registration.py index bd555b150f9..7c056440edd 100644 --- a/examples/python/reconstruction_system/refine_registration.py +++ b/examples/python/reconstruction_system/refine_registration.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/register_fragments.py b/examples/python/reconstruction_system/register_fragments.py index f7d3c72e664..ac1c5e9795d 100644 --- a/examples/python/reconstruction_system/register_fragments.py +++ b/examples/python/reconstruction_system/register_fragments.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/run_system.py b/examples/python/reconstruction_system/run_system.py index dedfc5552d2..cb54ad792a5 100644 --- a/examples/python/reconstruction_system/run_system.py +++ b/examples/python/reconstruction_system/run_system.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/sensors/azure_kinect_mkv_reader.py b/examples/python/reconstruction_system/sensors/azure_kinect_mkv_reader.py index 2ebb025e04f..91f8f5841de 100644 --- a/examples/python/reconstruction_system/sensors/azure_kinect_mkv_reader.py +++ b/examples/python/reconstruction_system/sensors/azure_kinect_mkv_reader.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/sensors/azure_kinect_recorder.py b/examples/python/reconstruction_system/sensors/azure_kinect_recorder.py index 0302310b8ef..a743cf42000 100644 --- a/examples/python/reconstruction_system/sensors/azure_kinect_recorder.py +++ b/examples/python/reconstruction_system/sensors/azure_kinect_recorder.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/sensors/azure_kinect_viewer.py b/examples/python/reconstruction_system/sensors/azure_kinect_viewer.py index c0cacf4accb..6f4b74652ea 100644 --- a/examples/python/reconstruction_system/sensors/azure_kinect_viewer.py +++ b/examples/python/reconstruction_system/sensors/azure_kinect_viewer.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/sensors/realsense_helper.py b/examples/python/reconstruction_system/sensors/realsense_helper.py index 5e37b0c50bb..12c42bf9c53 100644 --- a/examples/python/reconstruction_system/sensors/realsense_helper.py +++ b/examples/python/reconstruction_system/sensors/realsense_helper.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/sensors/realsense_pcd_visualizer.py b/examples/python/reconstruction_system/sensors/realsense_pcd_visualizer.py index a0f5ecfdaa9..fa8636bd10a 100644 --- a/examples/python/reconstruction_system/sensors/realsense_pcd_visualizer.py +++ b/examples/python/reconstruction_system/sensors/realsense_pcd_visualizer.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/sensors/realsense_recorder.py b/examples/python/reconstruction_system/sensors/realsense_recorder.py index 034f5ffaf35..539b9d09a41 100644 --- a/examples/python/reconstruction_system/sensors/realsense_recorder.py +++ b/examples/python/reconstruction_system/sensors/realsense_recorder.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/slac.py b/examples/python/reconstruction_system/slac.py index 45d080214b8..03b8fec067a 100644 --- a/examples/python/reconstruction_system/slac.py +++ b/examples/python/reconstruction_system/slac.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/reconstruction_system/slac_integrate.py b/examples/python/reconstruction_system/slac_integrate.py index 5ba48801fd9..0638b30691d 100644 --- a/examples/python/reconstruction_system/slac_integrate.py +++ b/examples/python/reconstruction_system/slac_integrate.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/t_reconstruction_system/common.py b/examples/python/t_reconstruction_system/common.py index d6331920d87..18fdc757560 100644 --- a/examples/python/t_reconstruction_system/common.py +++ b/examples/python/t_reconstruction_system/common.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/t_reconstruction_system/config.py b/examples/python/t_reconstruction_system/config.py index 59b9ec40e2f..091cde49442 100644 --- a/examples/python/t_reconstruction_system/config.py +++ b/examples/python/t_reconstruction_system/config.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/t_reconstruction_system/dense_slam.py b/examples/python/t_reconstruction_system/dense_slam.py index 374b6dce91c..65ef9716ffb 100644 --- a/examples/python/t_reconstruction_system/dense_slam.py +++ b/examples/python/t_reconstruction_system/dense_slam.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/t_reconstruction_system/dense_slam_gui.py b/examples/python/t_reconstruction_system/dense_slam_gui.py index 24744b9e87d..1389aa77d0f 100644 --- a/examples/python/t_reconstruction_system/dense_slam_gui.py +++ b/examples/python/t_reconstruction_system/dense_slam_gui.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/t_reconstruction_system/integrate.py b/examples/python/t_reconstruction_system/integrate.py index 3d86ec02943..e99c6ac82cd 100644 --- a/examples/python/t_reconstruction_system/integrate.py +++ b/examples/python/t_reconstruction_system/integrate.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/t_reconstruction_system/integrate_custom.py b/examples/python/t_reconstruction_system/integrate_custom.py index 8b352780b04..d1dedb4b825 100644 --- a/examples/python/t_reconstruction_system/integrate_custom.py +++ b/examples/python/t_reconstruction_system/integrate_custom.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/t_reconstruction_system/pose_graph_optim.py b/examples/python/t_reconstruction_system/pose_graph_optim.py index 94abaf34711..51138171117 100644 --- a/examples/python/t_reconstruction_system/pose_graph_optim.py +++ b/examples/python/t_reconstruction_system/pose_graph_optim.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/t_reconstruction_system/ray_casting.py b/examples/python/t_reconstruction_system/ray_casting.py index 5bae7301a30..6142b3875fe 100644 --- a/examples/python/t_reconstruction_system/ray_casting.py +++ b/examples/python/t_reconstruction_system/ray_casting.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/t_reconstruction_system/rgbd_odometry.py b/examples/python/t_reconstruction_system/rgbd_odometry.py index 759501b1189..c803fd89f67 100644 --- a/examples/python/t_reconstruction_system/rgbd_odometry.py +++ b/examples/python/t_reconstruction_system/rgbd_odometry.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/t_reconstruction_system/run_system.py b/examples/python/t_reconstruction_system/run_system.py index 51e94257ace..6e1b63ed46c 100644 --- a/examples/python/t_reconstruction_system/run_system.py +++ b/examples/python/t_reconstruction_system/run_system.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/t_reconstruction_system/split_fragments.py b/examples/python/t_reconstruction_system/split_fragments.py index 96170685ad4..0759e870453 100644 --- a/examples/python/t_reconstruction_system/split_fragments.py +++ b/examples/python/t_reconstruction_system/split_fragments.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/utility/vector.py b/examples/python/utility/vector.py index 257cb54e672..512d814dc6e 100644 --- a/examples/python/utility/vector.py +++ b/examples/python/utility/vector.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/add_geometry.py b/examples/python/visualization/add_geometry.py index e58c456fc66..aa8c0fe43c4 100644 --- a/examples/python/visualization/add_geometry.py +++ b/examples/python/visualization/add_geometry.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/all_widgets.py b/examples/python/visualization/all_widgets.py index 45bd855eaca..1e8383c6e2e 100644 --- a/examples/python/visualization/all_widgets.py +++ b/examples/python/visualization/all_widgets.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/customized_visualization.py b/examples/python/visualization/customized_visualization.py index 1592278e044..80e006c749a 100644 --- a/examples/python/visualization/customized_visualization.py +++ b/examples/python/visualization/customized_visualization.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/customized_visualization_key_action.py b/examples/python/visualization/customized_visualization_key_action.py index 9f885615e4e..adc7e847698 100644 --- a/examples/python/visualization/customized_visualization_key_action.py +++ b/examples/python/visualization/customized_visualization_key_action.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/demo_scene.py b/examples/python/visualization/demo_scene.py index cfb5d3d2393..06399c9841b 100644 --- a/examples/python/visualization/demo_scene.py +++ b/examples/python/visualization/demo_scene.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Demo scene demonstrating models, built-in shapes, and materials""" diff --git a/examples/python/visualization/draw.py b/examples/python/visualization/draw.py index f354f55783e..270c3630cf5 100644 --- a/examples/python/visualization/draw.py +++ b/examples/python/visualization/draw.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/draw_webrtc.py b/examples/python/visualization/draw_webrtc.py index 9e92c9498c3..cfb1f93cb2a 100644 --- a/examples/python/visualization/draw_webrtc.py +++ b/examples/python/visualization/draw_webrtc.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/headless_rendering.py b/examples/python/visualization/headless_rendering.py index 6a9a51970e6..f0a4f1ae162 100644 --- a/examples/python/visualization/headless_rendering.py +++ b/examples/python/visualization/headless_rendering.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/interactive_visualization.py b/examples/python/visualization/interactive_visualization.py index 1b3ff5ed051..6769c0f5d8a 100644 --- a/examples/python/visualization/interactive_visualization.py +++ b/examples/python/visualization/interactive_visualization.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/line_width.py b/examples/python/visualization/line_width.py index 318f563c10f..194d75cfa79 100644 --- a/examples/python/visualization/line_width.py +++ b/examples/python/visualization/line_width.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/load_save_viewpoint.py b/examples/python/visualization/load_save_viewpoint.py index 65c20c8dff0..415b5165fad 100644 --- a/examples/python/visualization/load_save_viewpoint.py +++ b/examples/python/visualization/load_save_viewpoint.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/mitsuba_material_estimation.py b/examples/python/visualization/mitsuba_material_estimation.py index 79783edcf3f..9cf56a7f9bb 100644 --- a/examples/python/visualization/mitsuba_material_estimation.py +++ b/examples/python/visualization/mitsuba_material_estimation.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/mouse_and_point_coord.py b/examples/python/visualization/mouse_and_point_coord.py index 5d3ad56f794..883582a2ba2 100644 --- a/examples/python/visualization/mouse_and_point_coord.py +++ b/examples/python/visualization/mouse_and_point_coord.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/multiple_windows.py b/examples/python/visualization/multiple_windows.py index 2cc367d0be7..e839901a894 100644 --- a/examples/python/visualization/multiple_windows.py +++ b/examples/python/visualization/multiple_windows.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/non_blocking_visualization.py b/examples/python/visualization/non_blocking_visualization.py index 04baaf85574..cc6f70f8e06 100644 --- a/examples/python/visualization/non_blocking_visualization.py +++ b/examples/python/visualization/non_blocking_visualization.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/non_english.py b/examples/python/visualization/non_english.py index 54c17d4df6a..d6c639ac5c9 100644 --- a/examples/python/visualization/non_english.py +++ b/examples/python/visualization/non_english.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/online_processing.py b/examples/python/visualization/online_processing.py index 4edd0e70762..79bf57c4ce6 100644 --- a/examples/python/visualization/online_processing.py +++ b/examples/python/visualization/online_processing.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Online 3D depth video processing pipeline. diff --git a/examples/python/visualization/remove_geometry.py b/examples/python/visualization/remove_geometry.py index 2353462174f..42b7af1fbe8 100644 --- a/examples/python/visualization/remove_geometry.py +++ b/examples/python/visualization/remove_geometry.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/render_to_image.py b/examples/python/visualization/render_to_image.py index 3e6d05b78d4..d07b97024bd 100644 --- a/examples/python/visualization/render_to_image.py +++ b/examples/python/visualization/render_to_image.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/tensorboard_pytorch.py b/examples/python/visualization/tensorboard_pytorch.py index 89a9fb7c17c..c16f645f3ea 100644 --- a/examples/python/visualization/tensorboard_pytorch.py +++ b/examples/python/visualization/tensorboard_pytorch.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- import copy diff --git a/examples/python/visualization/tensorboard_tensorflow.py b/examples/python/visualization/tensorboard_tensorflow.py index 4b90c8498c6..d7320b053e4 100644 --- a/examples/python/visualization/tensorboard_tensorflow.py +++ b/examples/python/visualization/tensorboard_tensorflow.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- import copy diff --git a/examples/python/visualization/text3d.py b/examples/python/visualization/text3d.py index e1d302b17e3..276a5da5cdc 100644 --- a/examples/python/visualization/text3d.py +++ b/examples/python/visualization/text3d.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/textured_mesh.py b/examples/python/visualization/textured_mesh.py index 2aa635ee83d..999816dd873 100644 --- a/examples/python/visualization/textured_mesh.py +++ b/examples/python/visualization/textured_mesh.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/textured_model.py b/examples/python/visualization/textured_model.py index fbd28784e2d..5872bafe983 100644 --- a/examples/python/visualization/textured_model.py +++ b/examples/python/visualization/textured_model.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/to_mitsuba.py b/examples/python/visualization/to_mitsuba.py index 1adf5e96851..c0f99034043 100644 --- a/examples/python/visualization/to_mitsuba.py +++ b/examples/python/visualization/to_mitsuba.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/video.py b/examples/python/visualization/video.py index c661152956a..ca422082c09 100644 --- a/examples/python/visualization/video.py +++ b/examples/python/visualization/video.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/examples/python/visualization/vis_gui.py b/examples/python/visualization/vis_gui.py index 3cf28e29684..915cd1d39e1 100644 --- a/examples/python/visualization/vis_gui.py +++ b/examples/python/visualization/vis_gui.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/LICENSE.txt b/python/LICENSE.txt index 6df17e2e3e0..5f96c42bbc1 100644 --- a/python/LICENSE.txt +++ b/python/LICENSE.txt @@ -1,7 +1,7 @@ The MIT License (MIT) Open3D: www.open3d.org -Copyright (c) 2018-2023 www.open3d.org +Copyright (c) 2018-2024 www.open3d.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/python/MANIFEST.in b/python/MANIFEST.in index cfedbe226f8..469473c5bcf 100644 --- a/python/MANIFEST.in +++ b/python/MANIFEST.in @@ -3,7 +3,7 @@ # ---------------------------------------------------------------------------- # The MIT License (MIT) # -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal diff --git a/python/benchmarks/core/test_binary_ew.py b/python/benchmarks/core/test_binary_ew.py index 20054209cf5..479bb6ff905 100644 --- a/python/benchmarks/core/test_binary_ew.py +++ b/python/benchmarks/core/test_binary_ew.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/benchmarks/core/test_nns.py b/python/benchmarks/core/test_nns.py index 20f8ce8a5f5..1981793a5e7 100644 --- a/python/benchmarks/core/test_nns.py +++ b/python/benchmarks/core/test_nns.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/benchmarks/core/test_unary_ew.py b/python/benchmarks/core/test_unary_ew.py index 857bfa503ae..67f69cce67c 100644 --- a/python/benchmarks/core/test_unary_ew.py +++ b/python/benchmarks/core/test_unary_ew.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/benchmarks/open3d_benchmark.py b/python/benchmarks/open3d_benchmark.py index a8dedfe932d..8de28303208 100644 --- a/python/benchmarks/open3d_benchmark.py +++ b/python/benchmarks/open3d_benchmark.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/js/lib/web_visualizer.js b/python/js/lib/web_visualizer.js index 3ccdff725a3..83ca3fbc107 100644 --- a/python/js/lib/web_visualizer.js +++ b/python/js/lib/web_visualizer.js @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright(c) 2018-2023 www.open3d.org +// Copyright(c) 2018-2024 www.open3d.org // SPDX - License - Identifier: MIT // ---------------------------------------------------------------------------- diff --git a/python/open3d/__init__.py b/python/open3d/__init__.py index ef0adba1bd5..c84b8360358 100644 --- a/python/open3d/__init__.py +++ b/python/open3d/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/__init__.py b/python/open3d/ml/__init__.py index 0f28a3e9512..cf7342e0a27 100644 --- a/python/open3d/ml/__init__.py +++ b/python/open3d/ml/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/configs.py b/python/open3d/ml/configs.py index c178bf52a2b..1149be8a9c3 100644 --- a/python/open3d/ml/configs.py +++ b/python/open3d/ml/configs.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/contrib/__init__.py b/python/open3d/ml/contrib/__init__.py index 1d870d5e72c..b883e8024fd 100644 --- a/python/open3d/ml/contrib/__init__.py +++ b/python/open3d/ml/contrib/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/datasets.py b/python/open3d/ml/datasets.py index 3234aee7d3c..4c7397d6ddf 100644 --- a/python/open3d/ml/datasets.py +++ b/python/open3d/ml/datasets.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/paddle/__init__.py b/python/open3d/ml/paddle/__init__.py index df0ae41c41a..260429d1d20 100644 --- a/python/open3d/ml/paddle/__init__.py +++ b/python/open3d/ml/paddle/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- from packaging.version import parse as _verp diff --git a/python/open3d/ml/paddle/classes/__init__.py b/python/open3d/ml/paddle/classes/__init__.py index bac0fc47804..a321fa69f87 100644 --- a/python/open3d/ml/paddle/classes/__init__.py +++ b/python/open3d/ml/paddle/classes/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Paddle specific machine learning classes.""" diff --git a/python/open3d/ml/paddle/classes/ragged_tensor.py b/python/open3d/ml/paddle/classes/ragged_tensor.py index 0ee22464be5..ecc6ad5b443 100644 --- a/python/open3d/ml/paddle/classes/ragged_tensor.py +++ b/python/open3d/ml/paddle/classes/ragged_tensor.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/paddle/layers/__init__.py b/python/open3d/ml/paddle/layers/__init__.py index eeebb261b5a..368c90f5e43 100644 --- a/python/open3d/ml/paddle/layers/__init__.py +++ b/python/open3d/ml/paddle/layers/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """High level layer API for building networks. diff --git a/python/open3d/ml/paddle/ops/__init__.py b/python/open3d/ml/paddle/ops/__init__.py index 294bdbdf30d..2e9336fd76e 100644 --- a/python/open3d/ml/paddle/ops/__init__.py +++ b/python/open3d/ml/paddle/ops/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Functional API with operators. diff --git a/python/open3d/ml/paddle/python/layers/convolutions.py b/python/open3d/ml/paddle/python/layers/convolutions.py index 2526e77624c..4773de30135 100644 --- a/python/open3d/ml/paddle/python/layers/convolutions.py +++ b/python/open3d/ml/paddle/python/layers/convolutions.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/paddle/python/layers/neighbor_search.py b/python/open3d/ml/paddle/python/layers/neighbor_search.py index 29b1e68b3b1..2600cf03b54 100644 --- a/python/open3d/ml/paddle/python/layers/neighbor_search.py +++ b/python/open3d/ml/paddle/python/layers/neighbor_search.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/paddle/python/layers/voxel_pooling.py b/python/open3d/ml/paddle/python/layers/voxel_pooling.py index 8d6def494fc..8cfbf953ce8 100644 --- a/python/open3d/ml/paddle/python/layers/voxel_pooling.py +++ b/python/open3d/ml/paddle/python/layers/voxel_pooling.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/paddle/python/return_types.py.in b/python/open3d/ml/paddle/python/return_types.py.in index 9af42040ab2..a73a0765ed9 100644 --- a/python/open3d/ml/paddle/python/return_types.py.in +++ b/python/open3d/ml/paddle/python/return_types.py.in @@ -3,7 +3,7 @@ # ---------------------------------------------------------------------------- # The MIT License (MIT) # -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal diff --git a/python/open3d/ml/tf/__init__.py b/python/open3d/ml/tf/__init__.py index b3178944067..86ce9dd38fa 100644 --- a/python/open3d/ml/tf/__init__.py +++ b/python/open3d/ml/tf/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """TensorFlow specific machine learning functions.""" diff --git a/python/open3d/ml/tf/configs.py b/python/open3d/ml/tf/configs.py index f87c9dcb6d4..6926bc45942 100644 --- a/python/open3d/ml/tf/configs.py +++ b/python/open3d/ml/tf/configs.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Config files for ml3d.""" diff --git a/python/open3d/ml/tf/dataloaders.py b/python/open3d/ml/tf/dataloaders.py index f1d6ff02e91..42e9c2585ad 100644 --- a/python/open3d/ml/tf/dataloaders.py +++ b/python/open3d/ml/tf/dataloaders.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Dataloader for TensorFlow.""" diff --git a/python/open3d/ml/tf/datasets.py b/python/open3d/ml/tf/datasets.py index bdcc65a16fb..023f8d0dd93 100644 --- a/python/open3d/ml/tf/datasets.py +++ b/python/open3d/ml/tf/datasets.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """I/O, attributes, and processing for different datasets.""" diff --git a/python/open3d/ml/tf/layers/__init__.py b/python/open3d/ml/tf/layers/__init__.py index 33d1089474f..599726b5c09 100644 --- a/python/open3d/ml/tf/layers/__init__.py +++ b/python/open3d/ml/tf/layers/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """High level layer API for building networks. diff --git a/python/open3d/ml/tf/models.py b/python/open3d/ml/tf/models.py index 4a358e8c513..e04d251e9c3 100644 --- a/python/open3d/ml/tf/models.py +++ b/python/open3d/ml/tf/models.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """TensorFlow network models.""" diff --git a/python/open3d/ml/tf/modules.py b/python/open3d/ml/tf/modules.py index 40da95cb41a..bc8e70f5e22 100644 --- a/python/open3d/ml/tf/modules.py +++ b/python/open3d/ml/tf/modules.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Loss and Metric modules for TensorFlow.""" diff --git a/python/open3d/ml/tf/ops/__init__.py b/python/open3d/ml/tf/ops/__init__.py index e771da8a3ff..fdb8c107f41 100644 --- a/python/open3d/ml/tf/ops/__init__.py +++ b/python/open3d/ml/tf/ops/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Functional API with operators. diff --git a/python/open3d/ml/tf/pipelines.py b/python/open3d/ml/tf/pipelines.py index d0fa0467bbc..d168634445f 100644 --- a/python/open3d/ml/tf/pipelines.py +++ b/python/open3d/ml/tf/pipelines.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """3D ML pipelines for TensorFlow.""" diff --git a/python/open3d/ml/tf/python/layers/convolutions.py b/python/open3d/ml/tf/python/layers/convolutions.py index fc0eba6d61d..fc1c3a111e2 100644 --- a/python/open3d/ml/tf/python/layers/convolutions.py +++ b/python/open3d/ml/tf/python/layers/convolutions.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/tf/python/layers/neighbor_search.py b/python/open3d/ml/tf/python/layers/neighbor_search.py index 8a9059ef485..5167a8ff51f 100644 --- a/python/open3d/ml/tf/python/layers/neighbor_search.py +++ b/python/open3d/ml/tf/python/layers/neighbor_search.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/tf/python/layers/voxel_pooling.py b/python/open3d/ml/tf/python/layers/voxel_pooling.py index 4217e63195c..1b5e1370d24 100644 --- a/python/open3d/ml/tf/python/layers/voxel_pooling.py +++ b/python/open3d/ml/tf/python/layers/voxel_pooling.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/tf/python/ops/gradients.py b/python/open3d/ml/tf/python/ops/gradients.py index 7ccb3b1108d..1cd75291fad 100644 --- a/python/open3d/ml/tf/python/ops/gradients.py +++ b/python/open3d/ml/tf/python/ops/gradients.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/tf/python/ops/lib.py b/python/open3d/ml/tf/python/ops/lib.py index 271d3aade16..4e55e26382d 100644 --- a/python/open3d/ml/tf/python/ops/lib.py +++ b/python/open3d/ml/tf/python/ops/lib.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """This module loads the op library.""" diff --git a/python/open3d/ml/tf/python/ops/ops.py.in b/python/open3d/ml/tf/python/ops/ops.py.in index 228fc8cb894..b44713940c3 100644 --- a/python/open3d/ml/tf/python/ops/ops.py.in +++ b/python/open3d/ml/tf/python/ops/ops.py.in @@ -3,7 +3,7 @@ # ---------------------------------------------------------------------------- # The MIT License (MIT) # -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal diff --git a/python/open3d/ml/tf/vis.py b/python/open3d/ml/tf/vis.py index a2173cc3dd2..1d4d44f1a27 100644 --- a/python/open3d/ml/tf/vis.py +++ b/python/open3d/ml/tf/vis.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Visualizer for 3D ML.""" diff --git a/python/open3d/ml/torch/__init__.py b/python/open3d/ml/torch/__init__.py index 5867abfdfb3..09a48b131aa 100644 --- a/python/open3d/ml/torch/__init__.py +++ b/python/open3d/ml/torch/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Torch specific machine learning functions.""" diff --git a/python/open3d/ml/torch/classes/__init__.py b/python/open3d/ml/torch/classes/__init__.py index 0188ba1bc49..d162913dd15 100644 --- a/python/open3d/ml/torch/classes/__init__.py +++ b/python/open3d/ml/torch/classes/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Torch specific machine learning classes.""" diff --git a/python/open3d/ml/torch/classes/ragged_tensor.py b/python/open3d/ml/torch/classes/ragged_tensor.py index 02a11568a8d..e3cc3fd6916 100644 --- a/python/open3d/ml/torch/classes/ragged_tensor.py +++ b/python/open3d/ml/torch/classes/ragged_tensor.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/torch/configs.py b/python/open3d/ml/torch/configs.py index f87c9dcb6d4..6926bc45942 100644 --- a/python/open3d/ml/torch/configs.py +++ b/python/open3d/ml/torch/configs.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Config files for ml3d.""" diff --git a/python/open3d/ml/torch/dataloaders.py b/python/open3d/ml/torch/dataloaders.py index fb5370cac59..70464b2ebb8 100644 --- a/python/open3d/ml/torch/dataloaders.py +++ b/python/open3d/ml/torch/dataloaders.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Dataloader for PyTorch.""" diff --git a/python/open3d/ml/torch/datasets.py b/python/open3d/ml/torch/datasets.py index bdcc65a16fb..023f8d0dd93 100644 --- a/python/open3d/ml/torch/datasets.py +++ b/python/open3d/ml/torch/datasets.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """I/O, attributes, and processing for different datasets.""" diff --git a/python/open3d/ml/torch/layers/__init__.py b/python/open3d/ml/torch/layers/__init__.py index a0ba32db9c4..ae8c471b178 100644 --- a/python/open3d/ml/torch/layers/__init__.py +++ b/python/open3d/ml/torch/layers/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """High level layer API for building networks. diff --git a/python/open3d/ml/torch/models.py b/python/open3d/ml/torch/models.py index 328050bbbe1..8e99aba0f5b 100644 --- a/python/open3d/ml/torch/models.py +++ b/python/open3d/ml/torch/models.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """PyTorch network models.""" diff --git a/python/open3d/ml/torch/modules.py b/python/open3d/ml/torch/modules.py index 816a1df3537..a5b3994a6c1 100644 --- a/python/open3d/ml/torch/modules.py +++ b/python/open3d/ml/torch/modules.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Loss and Metric modules for PyTorch.""" diff --git a/python/open3d/ml/torch/ops/__init__.py b/python/open3d/ml/torch/ops/__init__.py index c89f2bd54d5..bf547ce815e 100644 --- a/python/open3d/ml/torch/ops/__init__.py +++ b/python/open3d/ml/torch/ops/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Functional API with operators. diff --git a/python/open3d/ml/torch/pipelines.py b/python/open3d/ml/torch/pipelines.py index cf418488825..9f2dac3a0c4 100644 --- a/python/open3d/ml/torch/pipelines.py +++ b/python/open3d/ml/torch/pipelines.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """3D ML pipelines for PyTorch.""" diff --git a/python/open3d/ml/torch/python/layers/convolutions.py b/python/open3d/ml/torch/python/layers/convolutions.py index ec22d845f4f..5e9fe3b1c7f 100644 --- a/python/open3d/ml/torch/python/layers/convolutions.py +++ b/python/open3d/ml/torch/python/layers/convolutions.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/torch/python/layers/neighbor_search.py b/python/open3d/ml/torch/python/layers/neighbor_search.py index 3d25b426991..bb1eac55165 100644 --- a/python/open3d/ml/torch/python/layers/neighbor_search.py +++ b/python/open3d/ml/torch/python/layers/neighbor_search.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/torch/python/layers/voxel_pooling.py b/python/open3d/ml/torch/python/layers/voxel_pooling.py index cc0cfc7377b..d95112f433f 100644 --- a/python/open3d/ml/torch/python/layers/voxel_pooling.py +++ b/python/open3d/ml/torch/python/layers/voxel_pooling.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/torch/python/ops.py.in b/python/open3d/ml/torch/python/ops.py.in index 4ecd5b59105..14fa5fea1a6 100644 --- a/python/open3d/ml/torch/python/ops.py.in +++ b/python/open3d/ml/torch/python/ops.py.in @@ -3,7 +3,7 @@ # ---------------------------------------------------------------------------- # The MIT License (MIT) # -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal diff --git a/python/open3d/ml/torch/python/return_types.py.in b/python/open3d/ml/torch/python/return_types.py.in index 9af42040ab2..a73a0765ed9 100644 --- a/python/open3d/ml/torch/python/return_types.py.in +++ b/python/open3d/ml/torch/python/return_types.py.in @@ -3,7 +3,7 @@ # ---------------------------------------------------------------------------- # The MIT License (MIT) # -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal diff --git a/python/open3d/ml/torch/vis.py b/python/open3d/ml/torch/vis.py index a2173cc3dd2..1d4d44f1a27 100644 --- a/python/open3d/ml/torch/vis.py +++ b/python/open3d/ml/torch/vis.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Visualizer for 3D ML.""" diff --git a/python/open3d/ml/utils.py b/python/open3d/ml/utils.py index 8d3ceeb99d1..5dfd3dc70d1 100644 --- a/python/open3d/ml/utils.py +++ b/python/open3d/ml/utils.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/ml/vis.py b/python/open3d/ml/vis.py index afc08de5dab..c6b2f3bf5d5 100644 --- a/python/open3d/ml/vis.py +++ b/python/open3d/ml/vis.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/visualization/__init__.py b/python/open3d/visualization/__init__.py index 5360a69b270..ba464d7d54a 100644 --- a/python/open3d/visualization/__init__.py +++ b/python/open3d/visualization/__init__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/visualization/__main__.py b/python/open3d/visualization/__main__.py index 2416fa4dbd3..31cdc7d082e 100644 --- a/python/open3d/visualization/__main__.py +++ b/python/open3d/visualization/__main__.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/visualization/_external_visualizer.py b/python/open3d/visualization/_external_visualizer.py index ac7209127f0..5ae77b77313 100644 --- a/python/open3d/visualization/_external_visualizer.py +++ b/python/open3d/visualization/_external_visualizer.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/visualization/async_event_loop.py b/python/open3d/visualization/async_event_loop.py index 1126638b152..3b89da8a02d 100644 --- a/python/open3d/visualization/async_event_loop.py +++ b/python/open3d/visualization/async_event_loop.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Run the GUI event loop in a non-main thread. This allows using the diff --git a/python/open3d/visualization/draw.py b/python/open3d/visualization/draw.py index f7764b41400..0c559e47b90 100644 --- a/python/open3d/visualization/draw.py +++ b/python/open3d/visualization/draw.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/visualization/draw_plotly.py b/python/open3d/visualization/draw_plotly.py index 366299a130b..6b04df3b2a5 100644 --- a/python/open3d/visualization/draw_plotly.py +++ b/python/open3d/visualization/draw_plotly.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/visualization/tensorboard_plugin/colormap.py b/python/open3d/visualization/tensorboard_plugin/colormap.py index 15c04c60d2a..a5dbfdbbcf4 100644 --- a/python/open3d/visualization/tensorboard_plugin/colormap.py +++ b/python/open3d/visualization/tensorboard_plugin/colormap.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- class Colormap: diff --git a/python/open3d/visualization/tensorboard_plugin/frontend/index.js b/python/open3d/visualization/tensorboard_plugin/frontend/index.js index adc1fd0f92d..b61d74dc92e 100644 --- a/python/open3d/visualization/tensorboard_plugin/frontend/index.js +++ b/python/open3d/visualization/tensorboard_plugin/frontend/index.js @@ -3,7 +3,7 @@ // ---------------------------------------------------------------------------- // The MIT License (MIT) // -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/python/open3d/visualization/tensorboard_plugin/frontend/style.css b/python/open3d/visualization/tensorboard_plugin/frontend/style.css index 244a5e47d4b..b5b2acae1bf 100644 --- a/python/open3d/visualization/tensorboard_plugin/frontend/style.css +++ b/python/open3d/visualization/tensorboard_plugin/frontend/style.css @@ -3,7 +3,7 @@ // ---------------------------------------------------------------------------- // The MIT License (MIT) // -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/python/open3d/visualization/tensorboard_plugin/labellut.py b/python/open3d/visualization/tensorboard_plugin/labellut.py index ef209588f82..a73e3831712 100644 --- a/python/open3d/visualization/tensorboard_plugin/labellut.py +++ b/python/open3d/visualization/tensorboard_plugin/labellut.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- from colorsys import rgb_to_yiq diff --git a/python/open3d/visualization/tensorboard_plugin/metadata.py b/python/open3d/visualization/tensorboard_plugin/metadata.py index e19e71b362c..9e247677177 100644 --- a/python/open3d/visualization/tensorboard_plugin/metadata.py +++ b/python/open3d/visualization/tensorboard_plugin/metadata.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Internal information about the Open3D plugin.""" diff --git a/python/open3d/visualization/tensorboard_plugin/plugin.py b/python/open3d/visualization/tensorboard_plugin/plugin.py index 69da28c35eb..d6da0aba8af 100644 --- a/python/open3d/visualization/tensorboard_plugin/plugin.py +++ b/python/open3d/visualization/tensorboard_plugin/plugin.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Open3D visualization plugin for TensorBoard.""" diff --git a/python/open3d/visualization/tensorboard_plugin/plugin_data.proto b/python/open3d/visualization/tensorboard_plugin/plugin_data.proto index 466ca8cdbf1..084a20294ad 100644 --- a/python/open3d/visualization/tensorboard_plugin/plugin_data.proto +++ b/python/open3d/visualization/tensorboard_plugin/plugin_data.proto @@ -3,7 +3,7 @@ // ---------------------------------------------------------------------------- // The MIT License (MIT) // -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/python/open3d/visualization/tensorboard_plugin/plugin_data_pb2.py b/python/open3d/visualization/tensorboard_plugin/plugin_data_pb2.py index 33d3b9c9641..30bd56e72cf 100644 --- a/python/open3d/visualization/tensorboard_plugin/plugin_data_pb2.py +++ b/python/open3d/visualization/tensorboard_plugin/plugin_data_pb2.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- # -*- coding: utf-8 -*- diff --git a/python/open3d/visualization/tensorboard_plugin/summary.py b/python/open3d/visualization/tensorboard_plugin/summary.py index 0b6e254b754..d7ac1e7b59f 100644 --- a/python/open3d/visualization/tensorboard_plugin/summary.py +++ b/python/open3d/visualization/tensorboard_plugin/summary.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Summary writer for the TensorBoard Open3D plugin""" diff --git a/python/open3d/visualization/tensorboard_plugin/util.py b/python/open3d/visualization/tensorboard_plugin/util.py index 8c8a5beda34..6980c6f0c76 100644 --- a/python/open3d/visualization/tensorboard_plugin/util.py +++ b/python/open3d/visualization/tensorboard_plugin/util.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Utility functions for the Open3D TensorBoard plugin.""" diff --git a/python/open3d/visualization/to_mitsuba.py b/python/open3d/visualization/to_mitsuba.py index 2af657757ec..4b4ce4e3a42 100644 --- a/python/open3d/visualization/to_mitsuba.py +++ b/python/open3d/visualization/to_mitsuba.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/open3d/web_visualizer.py b/python/open3d/web_visualizer.py index 9101f610926..c65c8c08f4a 100644 --- a/python/open3d/web_visualizer.py +++ b/python/open3d/web_visualizer.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/setup.cfg b/python/setup.cfg index 93a8586735a..3fbe09678c5 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -3,7 +3,7 @@ # ---------------------------------------------------------------------------- # The MIT License (MIT) # -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal diff --git a/python/setup.py b/python/setup.py index 029c5717180..a096cb3aef4 100644 --- a/python/setup.py +++ b/python/setup.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/conftest.py b/python/test/conftest.py index e05fa3f44a3..882c23164a0 100644 --- a/python/test/conftest.py +++ b/python/test/conftest.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/core/test_core.py b/python/test/core/test_core.py index 47200dfe338..c94a961e1fe 100644 --- a/python/test/core/test_core.py +++ b/python/test/core/test_core.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/core/test_hashmap.py b/python/test/core/test_hashmap.py index d1b0bee07cd..a0604cdea4d 100644 --- a/python/test/core/test_hashmap.py +++ b/python/test/core/test_hashmap.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/core/test_linalg.py b/python/test/core/test_linalg.py index ca6edb1818d..7d1580570f8 100644 --- a/python/test/core/test_linalg.py +++ b/python/test/core/test_linalg.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/core/test_nn.py b/python/test/core/test_nn.py index efa01a528a9..374ebea11ec 100644 --- a/python/test/core/test_nn.py +++ b/python/test/core/test_nn.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/core/test_size_vector.py b/python/test/core/test_size_vector.py index 03942dc10a8..57ab9f8ab88 100644 --- a/python/test/core/test_size_vector.py +++ b/python/test/core/test_size_vector.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/core/test_sycl_utils.py b/python/test/core/test_sycl_utils.py index cc06b80a1f9..97546abf92b 100644 --- a/python/test/core/test_sycl_utils.py +++ b/python/test/core/test_sycl_utils.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/core/test_tensor_function.py b/python/test/core/test_tensor_function.py index 9b36c83cf34..4a45b06f599 100644 --- a/python/test/core/test_tensor_function.py +++ b/python/test/core/test_tensor_function.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/core/test_torch_integration.py b/python/test/core/test_torch_integration.py index 4b974fc4ff5..c30e32fa499 100644 --- a/python/test/core/test_torch_integration.py +++ b/python/test/core/test_torch_integration.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/data/test_data.py b/python/test/data/test_data.py index 7faa634c93e..657530c1a81 100644 --- a/python/test/data/test_data.py +++ b/python/test/data/test_data.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/io/rpc/test_remote_functions.py b/python/test/io/rpc/test_remote_functions.py index 328c1143b39..532668c146b 100644 --- a/python/test/io/rpc/test_remote_functions.py +++ b/python/test/io/rpc/test_remote_functions.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/io/rpc/test_serialization.py b/python/test/io/rpc/test_serialization.py index 8c8ae60f114..d44d65fd31c 100644 --- a/python/test/io/rpc/test_serialization.py +++ b/python/test/io/rpc/test_serialization.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/io/test_io.py b/python/test/io/test_io.py index 0678bb4ae9c..f8a316474e5 100644 --- a/python/test/io/test_io.py +++ b/python/test/io/test_io.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml/test_contrib_iou.py b/python/test/ml/test_contrib_iou.py index 2862e619477..31d06ad6801 100644 --- a/python/test/ml/test_contrib_iou.py +++ b/python/test/ml/test_contrib_iou.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml/test_contrib_subsample.py b/python/test/ml/test_contrib_subsample.py index 6d91b188d60..dc8a625a736 100644 --- a/python/test/ml/test_contrib_subsample.py +++ b/python/test/ml/test_contrib_subsample.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/cconv_python.py b/python/test/ml_ops/cconv_python.py index e4fe8118e54..7770a1ae461 100644 --- a/python/test/ml_ops/cconv_python.py +++ b/python/test/ml_ops/cconv_python.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """This is a python implementation for the continuous convolutions meant for diff --git a/python/test/ml_ops/check_gradients.py b/python/test/ml_ops/check_gradients.py index d1fac6ff06f..143278ff64f 100644 --- a/python/test/ml_ops/check_gradients.py +++ b/python/test/ml_ops/check_gradients.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/mltest.py b/python/test/ml_ops/mltest.py index 92996b85618..123d5ac51b3 100644 --- a/python/test/ml_ops/mltest.py +++ b/python/test/ml_ops/mltest.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/particle_network_tf.py b/python/test/ml_ops/particle_network_tf.py index 892c97d53ae..1775bb78425 100644 --- a/python/test/ml_ops/particle_network_tf.py +++ b/python/test/ml_ops/particle_network_tf.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_cconv.py b/python/test/ml_ops/test_cconv.py index 72bd14d8f2b..61aa4c9879a 100644 --- a/python/test/ml_ops/test_cconv.py +++ b/python/test/ml_ops/test_cconv.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Tests the implementation of the continuous convolution ops""" diff --git a/python/test/ml_ops/test_cconv_python.py b/python/test/ml_ops/test_cconv_python.py index 2461d84b114..0adb7657481 100644 --- a/python/test/ml_ops/test_cconv_python.py +++ b/python/test/ml_ops/test_cconv_python.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Tests the reference python implementation of the continuous conv""" diff --git a/python/test/ml_ops/test_cublas.py b/python/test/ml_ops/test_cublas.py index 5aa6c671b90..64299bb3df8 100644 --- a/python/test/ml_ops/test_cublas.py +++ b/python/test/ml_ops/test_cublas.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_fixed_radius_search.py b/python/test/ml_ops/test_fixed_radius_search.py index 99c123a9b76..c3da38894ae 100644 --- a/python/test/ml_ops/test_fixed_radius_search.py +++ b/python/test/ml_ops/test_fixed_radius_search.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_general_sparseconv.py b/python/test/ml_ops/test_general_sparseconv.py index 28df9cd693c..19e5f2c3326 100644 --- a/python/test/ml_ops/test_general_sparseconv.py +++ b/python/test/ml_ops/test_general_sparseconv.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Tests the implementation of the general sparse convolution ops""" diff --git a/python/test/ml_ops/test_invert_neighbors_list.py b/python/test/ml_ops/test_invert_neighbors_list.py index acc3b9ffdc9..eb7d51427a9 100644 --- a/python/test/ml_ops/test_invert_neighbors_list.py +++ b/python/test/ml_ops/test_invert_neighbors_list.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_knn_search.py b/python/test/ml_ops/test_knn_search.py index f61f6e407d2..8deb5d453f5 100644 --- a/python/test/ml_ops/test_knn_search.py +++ b/python/test/ml_ops/test_knn_search.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_nms.py b/python/test/ml_ops/test_nms.py index b0f1c1da772..81340717bbc 100644 --- a/python/test/ml_ops/test_nms.py +++ b/python/test/ml_ops/test_nms.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_query_pts.py b/python/test/ml_ops/test_query_pts.py index 5791282cc3e..e3d7d902acb 100644 --- a/python/test/ml_ops/test_query_pts.py +++ b/python/test/ml_ops/test_query_pts.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_radius_search.py b/python/test/ml_ops/test_radius_search.py index 1f75206bc77..ef39b173d5c 100644 --- a/python/test/ml_ops/test_radius_search.py +++ b/python/test/ml_ops/test_radius_search.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_ragged_tensor.py b/python/test/ml_ops/test_ragged_tensor.py index 6f018debf67..a61a668a587 100644 --- a/python/test/ml_ops/test_ragged_tensor.py +++ b/python/test/ml_ops/test_ragged_tensor.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_ragged_tensor_paddle.py b/python/test/ml_ops/test_ragged_tensor_paddle.py index f1b4b02d8a4..eaafd72dd03 100644 --- a/python/test/ml_ops/test_ragged_tensor_paddle.py +++ b/python/test/ml_ops/test_ragged_tensor_paddle.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_ragged_to_dense.py b/python/test/ml_ops/test_ragged_to_dense.py index 430824a0621..289320032ff 100644 --- a/python/test/ml_ops/test_ragged_to_dense.py +++ b/python/test/ml_ops/test_ragged_to_dense.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_reduce_subarrays_sum.py b/python/test/ml_ops/test_reduce_subarrays_sum.py index 30b8569c43f..ef04afe1426 100644 --- a/python/test/ml_ops/test_reduce_subarrays_sum.py +++ b/python/test/ml_ops/test_reduce_subarrays_sum.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_roi_pool.py b/python/test/ml_ops/test_roi_pool.py index ee39d653553..60d17c52d17 100644 --- a/python/test/ml_ops/test_roi_pool.py +++ b/python/test/ml_ops/test_roi_pool.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_sampling.py b/python/test/ml_ops/test_sampling.py index 6438f1e1c0f..4590c7afed4 100644 --- a/python/test/ml_ops/test_sampling.py +++ b/python/test/ml_ops/test_sampling.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_sparseconv.py b/python/test/ml_ops/test_sparseconv.py index 272646c927a..e7e0cc202ac 100644 --- a/python/test/ml_ops/test_sparseconv.py +++ b/python/test/ml_ops/test_sparseconv.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """Tests the reference python implementation of the sparse conv""" diff --git a/python/test/ml_ops/test_subsampling.py b/python/test/ml_ops/test_subsampling.py index 21812d45792..f4eec270b5b 100644 --- a/python/test/ml_ops/test_subsampling.py +++ b/python/test/ml_ops/test_subsampling.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_tf_training_graph_mode.py b/python/test/ml_ops/test_tf_training_graph_mode.py index d9e3c178234..d00beca6484 100644 --- a/python/test/ml_ops/test_tf_training_graph_mode.py +++ b/python/test/ml_ops/test_tf_training_graph_mode.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """This test simulates a network training by running some ops in graph mode for diff --git a/python/test/ml_ops/test_three_interp.py b/python/test/ml_ops/test_three_interp.py index d4383567587..097bafc9dee 100644 --- a/python/test/ml_ops/test_three_interp.py +++ b/python/test/ml_ops/test_three_interp.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_three_nn.py b/python/test/ml_ops/test_three_nn.py index 57e96b58b23..a005dc94335 100644 --- a/python/test/ml_ops/test_three_nn.py +++ b/python/test/ml_ops/test_three_nn.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_voxel_pooling.py b/python/test/ml_ops/test_voxel_pooling.py index f1932c0320b..0dffc9cf330 100644 --- a/python/test/ml_ops/test_voxel_pooling.py +++ b/python/test/ml_ops/test_voxel_pooling.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/ml_ops/test_voxelize.py b/python/test/ml_ops/test_voxelize.py index bf98a406262..e4b1a760078 100644 --- a/python/test/ml_ops/test_voxelize.py +++ b/python/test/ml_ops/test_voxelize.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/open3d_test.py b/python/test/open3d_test.py index 46a768746d0..b1071e555fb 100644 --- a/python/test/open3d_test.py +++ b/python/test/open3d_test.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/t/geometry/test_image.py b/python/test/t/geometry/test_image.py index 863fb1acb83..54d75e90d5d 100644 --- a/python/test/t/geometry/test_image.py +++ b/python/test/t/geometry/test_image.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/t/geometry/test_lineset.py b/python/test/t/geometry/test_lineset.py index eaa38767fe8..2d3daceccaa 100644 --- a/python/test/t/geometry/test_lineset.py +++ b/python/test/t/geometry/test_lineset.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/t/geometry/test_pointcloud.py b/python/test/t/geometry/test_pointcloud.py index e6c194477ca..f277bcabfb2 100644 --- a/python/test/t/geometry/test_pointcloud.py +++ b/python/test/t/geometry/test_pointcloud.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/t/geometry/test_raycasting_scene.py b/python/test/t/geometry/test_raycasting_scene.py index 3ce024a2b29..9f3e3dac380 100644 --- a/python/test/t/geometry/test_raycasting_scene.py +++ b/python/test/t/geometry/test_raycasting_scene.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/t/geometry/test_tensormap.py b/python/test/t/geometry/test_tensormap.py index fc1b6232aae..255c1ef55b2 100644 --- a/python/test/t/geometry/test_tensormap.py +++ b/python/test/t/geometry/test_tensormap.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/t/geometry/test_trianglemesh.py b/python/test/t/geometry/test_trianglemesh.py index 4ca8d5e98ab..8d414c36983 100644 --- a/python/test/t/geometry/test_trianglemesh.py +++ b/python/test/t/geometry/test_trianglemesh.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/t/io/test_noise.py b/python/test/t/io/test_noise.py index 00316bd1c9d..52a807762ce 100644 --- a/python/test/t/io/test_noise.py +++ b/python/test/t/io/test_noise.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/t/io/test_realsense.py b/python/test/t/io/test_realsense.py index 2d05e1c28d7..d597318c3e4 100755 --- a/python/test/t/io/test_realsense.py +++ b/python/test/t/io/test_realsense.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/t/registration/test_registration.py b/python/test/t/registration/test_registration.py index c9bed8f5c84..4cbea101c7f 100644 --- a/python/test/t/registration/test_registration.py +++ b/python/test/t/registration/test_registration.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/t/registration/test_transformation_estimation.py b/python/test/t/registration/test_transformation_estimation.py index f95b63c874e..f59408b84a5 100644 --- a/python/test/t/registration/test_transformation_estimation.py +++ b/python/test/t/registration/test_transformation_estimation.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/test_color_map_optimization.py b/python/test/test_color_map_optimization.py index 593088b2349..cc7e276315d 100644 --- a/python/test/test_color_map_optimization.py +++ b/python/test/test_color_map_optimization.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/test_flags.py b/python/test/test_flags.py index 0077d41604f..b614183f648 100644 --- a/python/test/test_flags.py +++ b/python/test/test_flags.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/test_octree.py b/python/test/test_octree.py index 2cc9754b827..27dc6f28a03 100644 --- a/python/test/test_octree.py +++ b/python/test/test_octree.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/test_open3d_eigen.py b/python/test/test_open3d_eigen.py index 24535fff95c..d3b3ad1d13f 100644 --- a/python/test/test_open3d_eigen.py +++ b/python/test/test_open3d_eigen.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/visualization/test_cpu_rendering.py b/python/test/visualization/test_cpu_rendering.py index 53c92edd0f5..ffaf9021c32 100644 --- a/python/test/visualization/test_cpu_rendering.py +++ b/python/test/visualization/test_cpu_rendering.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/test/visualization/test_tensorboard_plugin.py b/python/test/visualization/test_tensorboard_plugin.py index c1913a3ec29..db728647e0b 100644 --- a/python/test/visualization/test_tensorboard_plugin.py +++ b/python/test/visualization/test_tensorboard_plugin.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- import os diff --git a/python/tools/app.py b/python/tools/app.py index 02c8cc65e79..73434e6440d 100644 --- a/python/tools/app.py +++ b/python/tools/app.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/python/tools/cli.py b/python/tools/cli.py index 7f8aefa3aca..1b8dcb2d406 100644 --- a/python/tools/cli.py +++ b/python/tools/cli.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- diff --git a/util/check_style.py b/util/check_style.py index 34442dec310..34640be9573 100644 --- a/util/check_style.py +++ b/util/check_style.py @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- @@ -64,7 +64,7 @@ class CppFormatter: standard_header = """// ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- -// Copyright (c) 2018-2023 www.open3d.org +// Copyright (c) 2018-2024 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- """ @@ -141,7 +141,7 @@ class PythonFormatter: standard_header = """# ---------------------------------------------------------------------------- # - Open3D: www.open3d.org - # ---------------------------------------------------------------------------- -# Copyright (c) 2018-2023 www.open3d.org +# Copyright (c) 2018-2024 www.open3d.org # SPDX-License-Identifier: MIT # ---------------------------------------------------------------------------- """ From 18e3b6e0e37fe87bd2399be4a32516e89f4d9ec7 Mon Sep 17 00:00:00 2001 From: RDIO <35186529+Woodman3@users.noreply.github.com> Date: Thu, 28 Nov 2024 14:11:14 +0800 Subject: [PATCH 16/19] [BUILD] remove version restriction (#15) Co-authored-by: SecretXV --- cpp/open3d/ml/paddle/CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cpp/open3d/ml/paddle/CMakeLists.txt b/cpp/open3d/ml/paddle/CMakeLists.txt index 1652c3acd70..a81fd2a09a3 100644 --- a/cpp/open3d/ml/paddle/CMakeLists.txt +++ b/cpp/open3d/ml/paddle/CMakeLists.txt @@ -7,10 +7,6 @@ endif() set(PRINT_ONCE ON) find_package(Paddle REQUIRED) -if (Paddle_VERSION VERSION_LESS 3.0.0) - message(FATAL_ERROR "Please update to Paddle 3.0.0+ to build Paddle Ops.") -endif() - add_library(open3d_paddle_ops SHARED) target_sources(open3d_paddle_ops PRIVATE From caa6d8ca52382b4996de5c2860fc33cd90c57d29 Mon Sep 17 00:00:00 2001 From: Woodman3 <1025760745@qq.com> Date: Wed, 22 Jan 2025 01:40:15 -0800 Subject: [PATCH 17/19] sycn with up-stream --- .gitignore | 1 - .pre-commit-config.yaml | 13 -------- README.md | 49 +--------------------------- cpp/open3d/ml/paddle/CMakeLists.txt | 3 +- cpp/open3d/ml/paddle/misc/NmsOps.cpp | 9 ++--- docker/README.md | 10 ------ docker/docker_build.sh | 4 +++ util/check_style.sh | 3 -- 8 files changed, 8 insertions(+), 84 deletions(-) delete mode 100644 .pre-commit-config.yaml delete mode 100755 util/check_style.sh diff --git a/.gitignore b/.gitignore index 3dfdd3e3b87..8a041878cc6 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,6 @@ _vimrc_local.vim .vscode/ .clangd/ .ccls-cache/ -.hypothesis/ # Build artifacts **/package-lock.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 68a45c56d5b..00000000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,13 +0,0 @@ -exclude: | - (?x)^( - 3rdparty/.+ - )$ -repos: -# Others -- repo: local - hooks: - - id: open3d_code_style - name: open3d code style check - description: Open3D default code style checker - entry: util/check_style.sh - language: system \ No newline at end of file diff --git a/README.md b/README.md index a2e74b7daa2..d559c76c26d 100644 --- a/README.md +++ b/README.md @@ -2,54 +2,7 @@

-# Open3D: A Modern Library for 3D Data Processing (Paddle backend) - -![paddle_logo](docs/_static/paddle_logo.png) - -> [!IMPORTANT] -> This branch(paddle) experimentally integrates [Paddle backend](https://www.paddlepaddle.org.cn/en/install/quick?docurl=/documentation/docs/en/develop/install/pip/linux-pip_en.html) to Open3D meachine learning module. -> -> It was developed base version v0.18.0 of Open3D. It is recommended to install **nightly-build(develop)** Paddle before running any code in this branch. -> -> It was verified on Ubuntu 20.04. It may meet some problems if you are using other environment. - -## **Build and Install** - -```bash -# install dependencies -util/install_deps_ubuntu.sh -pip install yapf==0.30.0 - -# install nightly-build paddlepaddle-gpu -pip uninstall paddlepaddle-gpu -python -m pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu118/ - -# configure -mkdir build -cd build -cmake -DBUILD_CUDA_MODULE=ON \ - -DBUILD_PADDLE_OPS=ON \ - -DGLIBCXX_USE_CXX11_ABI=ON \ - -DBUNDLE_OPEN3D_ML=OFF \ - .. - -# install -make install-pip-package -j8 - -``` - -Open3D for paddle backend also provide [Dockerfile](docker/Dockerfile.paddle) to help build from docker. More details please refer to the [document](docker/README.md). - -## **Unit Test** - -Please make sure you have installed Open3D for paddle backend correctly before running unit tests - -```bash -util/run_python_unittest.sh -``` - - -# Below is Open3D's original README +# Open3D: A Modern Library for 3D Data Processing

Homepage | diff --git a/cpp/open3d/ml/paddle/CMakeLists.txt b/cpp/open3d/ml/paddle/CMakeLists.txt index a81fd2a09a3..a6809665bde 100644 --- a/cpp/open3d/ml/paddle/CMakeLists.txt +++ b/cpp/open3d/ml/paddle/CMakeLists.txt @@ -128,8 +128,7 @@ target_link_libraries(open3d_paddle_ops PRIVATE Open3D::3rdparty_eigen3 Open3D::3rdparty_fmt Open3D::3rdparty_nanoflann - Open3D::3rdparty_parallelstl - Open3D::3rdparty_tbb + TBB::tbb ) if (BUILD_CUDA_MODULE) diff --git a/cpp/open3d/ml/paddle/misc/NmsOps.cpp b/cpp/open3d/ml/paddle/misc/NmsOps.cpp index 432853e8b7a..50c7e2c5f97 100644 --- a/cpp/open3d/ml/paddle/misc/NmsOps.cpp +++ b/cpp/open3d/ml/paddle/misc/NmsOps.cpp @@ -41,14 +41,9 @@ std::vector Nms(paddle::Tensor& boxes, paddle::Tensor temp_keep_indices = paddle::from_blob( keep_indices_blob.data(), out_shape, out_strides, phi::DataType::INT64, phi::DataLayout::NCHW, phi::CPUPlace()); - if (boxes.is_gpu()) { - temp_keep_indices = temp_keep_indices.copy_to(boxes.place(), false); - } + paddle::Tensor keep_indices = temp_keep_indices.copy_to(boxes.place(), false); - paddle::Tensor keep_indices = paddle::empty_like(temp_keep_indices); - - return {paddle::experimental::copysign(temp_keep_indices, - keep_indices)}; + return {keep_indices}; } else { // keep indices is nullptr return {InitializedEmptyTensor({0}, boxes.place())}; diff --git a/docker/README.md b/docker/README.md index 1debef9fc93..c3ed85bfaf4 100644 --- a/docker/README.md +++ b/docker/README.md @@ -67,14 +67,4 @@ cd docker Build Docker for Paddle backend: -```bash -cd docker - -# Build Docker (dev). -BUILD_CUDA_MODULE=ON ./docker_build.sh paddle_cuda_wheel_py310_dev - -# Build Docker (release). -BUILD_CUDA_MODULE=ON ./docker_build.sh paddle_cuda_wheel_py310 -``` - See `./docker_build.sh` and `./docker_test.sh` for all available options. \ No newline at end of file diff --git a/docker/docker_build.sh b/docker/docker_build.sh index 00d5ea08232..b4afaddde2f 100755 --- a/docker/docker_build.sh +++ b/docker/docker_build.sh @@ -70,6 +70,10 @@ OPTION: cuda_wheel_py39 : CUDA Python 3.9 wheel, release mode cuda_wheel_py310 : CUDA Python 3.10 wheel, release mode cuda_wheel_py311 : CUDA Python 3.11 wheel, release mode + + # Paddle wheels (Dockerfile.paddle) + paddle_cuda_wheel_py310_dev : CUDA Python 3.10 wheel, developer mode + paddle_cuda_wheel_py310 : CUDA Python 3.10 wheel, release mode " HOST_OPEN3D_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. >/dev/null 2>&1 && pwd)" diff --git a/util/check_style.sh b/util/check_style.sh deleted file mode 100755 index ad63e7ad560..00000000000 --- a/util/check_style.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -python util/check_style.py --apply \ No newline at end of file From 46ee00f0b08f918982b9dd6e2734cc9c42344581 Mon Sep 17 00:00:00 2001 From: Woodman3 <1025760745@qq.com> Date: Wed, 29 Jan 2025 17:10:43 +0800 Subject: [PATCH 18/19] [fix]pass code style check --- .../ml/paddle/misc/VoxelPoolingOpKernel.cpp | 2 +- .../ml/paddle/python/layers/convolutions.py | 13 +++++---- util/ci_utils.sh | 2 +- util/run_python_unittest.sh | 27 ------------------- 4 files changed, 8 insertions(+), 36 deletions(-) delete mode 100755 util/run_python_unittest.sh diff --git a/cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp b/cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp index 230a459e340..a70e05281d7 100644 --- a/cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp +++ b/cpp/open3d/ml/paddle/misc/VoxelPoolingOpKernel.cpp @@ -16,7 +16,7 @@ namespace { template class OutputAllocator { public: - OutputAllocator(paddle::Place place) : place(place) {} + explicit OutputAllocator(paddle::Place place) : place(place) {} void AllocPooledPositions(TReal** ptr, size_t num) { if (num != 0) { diff --git a/python/open3d/ml/paddle/python/layers/convolutions.py b/python/open3d/ml/paddle/python/layers/convolutions.py index 4773de30135..3cd4b542ac1 100644 --- a/python/open3d/ml/paddle/python/layers/convolutions.py +++ b/python/open3d/ml/paddle/python/layers/convolutions.py @@ -251,7 +251,6 @@ def forward(self, inp_importance = paddle.empty( (0,), dtype=paddle.float32).to(self.kernel.place) - return_distances = not self.window_function is None if not user_neighbors_index is None and not user_neighbors_row_splits is None: @@ -272,12 +271,6 @@ def forward(self, queries=out_positions, radius=radius, hash_table=fixed_radius_search_hash_table) - if return_distances: - if self.radius_search_metric == 'L2': - neighbors_distance_normalized = self.nns.neighbors_distance / ( - radius * radius) - else: # L1 - neighbors_distance_normalized = self.nns.neighbors_distance / radius elif len(extents.shape) == 1: radii = 0.5 * extents @@ -291,6 +284,12 @@ def forward(self, if self.window_function is None: neighbors_importance = paddle.empty((0,), dtype=paddle.float32) else: + if self.radius_search_metric == 'L2': + neighbors_distance_normalized = self.nns.neighbors_distance / ( + radius * radius) + else: # L1 + neighbors_distance_normalized = self.nns.neighbors_distance / radius + neighbors_importance = self.window_function( neighbors_distance_normalized) diff --git a/util/ci_utils.sh b/util/ci_utils.sh index 6ccaf0922ad..1e4817aabd2 100644 --- a/util/ci_utils.sh +++ b/util/ci_utils.sh @@ -96,7 +96,7 @@ install_python_dependencies() { if [ "$BUILD_PADDLE_OPS" == "ON" ]; then # ML/requirements-torch.txt if [[ "$OSTYPE" == "linux-gnu"* ]]; then python -m pip uninstall paddlepaddle paddlepaddle-gpu -y - python -m pip install --pre $PADDLE_GLNX -i $PADDLE_GLNX_PIP_INDEX + python -m pip install --pre "$PADDLE_GLNX" -i "$PADDLE_GLNX_PIP_INDEX" else echo "unknown OS $OSTYPE" exit 1 diff --git a/util/run_python_unittest.sh b/util/run_python_unittest.sh deleted file mode 100755 index 8a44295d647..00000000000 --- a/util/run_python_unittest.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -PWD="$(cd $(dirname $0); pwd)" -OPEN3D_ROOT="${PWD}/../" - -# Get build scripts and control environment variables -# shellcheck source=ci_utils.sh -source "${PWD}/ci_utils.sh" - -# # Run on CPU versions -echo "Try importing Open3D CPU Python package" -cpu_wheel_path=$(ls ${OPEN3D_ROOT}/build/lib/python_package/pip_package/open3d_cpu*.whl) -test_wheel $cpu_wheel_path -echo "Running Open3D CPU Python tests..." -run_python_tests -echo - -if nvidia-smi >/dev/null 2>&1; then - # Run on GPU versions - echo "Try importing Open3D GPU Python package" - gpu_wheel_path=$(ls ${OPEN3D_ROOT}/build/lib/python_package/pip_package/open3d*.whl | grep -v $cpu_wheel_path) - test_wheel $gpu_wheel_path - echo "Running Open3D GPU Python tests..." - run_python_tests - echo -fi From b0cc2bae470fd76b81d483a65faf9980e646cc2f Mon Sep 17 00:00:00 2001 From: Woodman3 <1025760745@qq.com> Date: Wed, 29 Jan 2025 17:23:27 +0800 Subject: [PATCH 19/19] [fix] resolve some comment --- LICENSE | 2 +- .../visualization/visualizer/GuiVisualizer.cpp | 2 +- .../visualization/visualizer/O3DVisualizer.cpp | 2 +- docker/README.md | 2 -- docs/_static/paddle_logo.png | Bin 243974 -> 0 bytes python/LICENSE.txt | 2 +- python/js/lib/web_visualizer.js | 2 +- .../ml/paddle/python/layers/convolutions.py | 1 - 8 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 docs/_static/paddle_logo.png diff --git a/LICENSE b/LICENSE index 6ce9ed9300c..9134a1223b9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ The MIT License (MIT) Open3D: www.open3d.org -Copyright (c) 2018-2024 www.open3d.org +Copyright (c) 2018-2023 www.open3d.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/cpp/open3d/visualization/visualizer/GuiVisualizer.cpp b/cpp/open3d/visualization/visualizer/GuiVisualizer.cpp index 6c23a0b247f..5f7584d7e00 100644 --- a/cpp/open3d/visualization/visualizer/GuiVisualizer.cpp +++ b/cpp/open3d/visualization/visualizer/GuiVisualizer.cpp @@ -65,7 +65,7 @@ std::shared_ptr CreateAboutDialog(gui::Window *window) { (std::string("Open3D ") + OPEN3D_VERSION).c_str()); auto text = std::make_shared( "The MIT License (MIT)\n" - "Copyright (c) 2018-2024 www.open3d.org\n\n" + "Copyright (c) 2018-2023 www.open3d.org\n\n" "Permission is hereby granted, free of charge, to any person " "obtaining a copy of this software and associated documentation " diff --git a/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp b/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp index 582c067a0b2..0cf3ce380cb 100644 --- a/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp +++ b/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp @@ -2126,7 +2126,7 @@ Ctrl-alt-click to polygon select)"; (std::string("Open3D ") + OPEN3D_VERSION).c_str()); auto text = std::make_shared( "The MIT License (MIT)\n" - "Copyright (c) 2018-2024 www.open3d.org\n\n" + "Copyright (c) 2018-2023 www.open3d.org\n\n" "Permission is hereby granted, free of charge, to any person " "obtaining a copy of this software and associated " diff --git a/docker/README.md b/docker/README.md index c3ed85bfaf4..752d28ba439 100644 --- a/docker/README.md +++ b/docker/README.md @@ -65,6 +65,4 @@ cd docker ./docker_test.sh openblas-amd64-py38-dev ``` -Build Docker for Paddle backend: - See `./docker_build.sh` and `./docker_test.sh` for all available options. \ No newline at end of file diff --git a/docs/_static/paddle_logo.png b/docs/_static/paddle_logo.png deleted file mode 100644 index 3ed4cc8ec82ee3b843dea1644ac6ced246e8a6f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243974 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