Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions .github/workflows/publish_pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
- uses: actions/setup-python@v4
name: Install Python
with:
python-version: '3.9'
python-version: '3.11'

- name: Install cibuildwheel
run: |
Expand All @@ -57,6 +57,8 @@ jobs:
CIBW_BEFORE_ALL_MACOS: brew install nasm &&
bash ci-utils/install_prereq_linux.sh &&
mkdir -p /tmp/bfiocpp_bld &&
brew uninstall --ignore-dependencies openssl || true &&
sudo rm -rf /usr/local/include/openssl &&
cp -r local_install /tmp/bfiocpp_bld
CIBW_BEFORE_ALL_LINUX: curl -L https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2 -o nasm-2.15.05.tar.bz2 &&
tar -xjf nasm-2.15.05.tar.bz2 &&
Expand All @@ -76,7 +78,11 @@ jobs:
ON_GITHUB="TRUE"
BFIOCPP_DEP_DIR="/tmp/bfiocpp_bld/local_install"
CMAKE_ARGS="-DCMAKE_CXX_FLAGS=-Wno-missing-template-arg-list-after-template-kw -DTENSORSTORE_USE_SYSTEM_JPEG=ON -DTENSORSTORE_USE_SYSTEM_ZLIB=ON -DTENSORSTORE_USE_SYSTEM_PNG=ON"
CIBW_ENVIRONMENT_LINUX: LD_LIBRARY_PATH="/tmp/bfiocpp_bld/local_install/lib:/tmp/bfiocpp_bld/local_install/lib64:$LD_LIBRARY_PATH" ON_GITHUB="TRUE" BFIOCPP_DEP_DIR="/tmp/bfiocpp_bld/local_install"
CIBW_ENVIRONMENT_LINUX: >-
LD_LIBRARY_PATH="/tmp/bfiocpp_bld/local_install/lib:/tmp/bfiocpp_bld/local_install/lib64:$LD_LIBRARY_PATH"
ON_GITHUB="TRUE"
BFIOCPP_DEP_DIR="/tmp/bfiocpp_bld/local_install"
CMAKE_ARGS="-DTENSORSTORE_USE_SYSTEM_JPEG=ON -DTENSORSTORE_USE_SYSTEM_ZLIB=ON -DTENSORSTORE_USE_SYSTEM_PNG=ON"
CIBW_REPAIR_WHEEL_COMMAND_MACOS: DYLD_LIBRARY_PATH=$REPAIR_LIBRARY_PATH delocate-listdeps {wheel} && DYLD_LIBRARY_PATH=$REPAIR_LIBRARY_PATH delocate-wheel --require-archs {delocate_archs} -w {dest_dir} {wheel}
CIBW_ENVIRONMENT_WINDOWS: PATH="$TEMP\\bfiocpp\\bin;$PATH" ON_GITHUB="TRUE" BFIOCPP_DEP_DIR="C:\\TEMP\\bfiocpp_bld\\local_install" CMAKE_ARGS="-DCMAKE_GENERATOR=Ninja"
CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "delvewheel repair -w {dest_dir} {wheel}"
Expand Down
14 changes: 10 additions & 4 deletions .github/workflows/wheel_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,13 @@ jobs:
- uses: actions/setup-python@v4
name: Install Python
with:
python-version: '3.9'
python-version: '3.11'

- name: Install cibuildwheel
run: |
python -m pip install cibuildwheel delvewheel wheel

- name: Building wheels
- name: Building wheels
run: |
python -m cibuildwheel --output-dir dist
env:
Expand All @@ -56,6 +56,8 @@ jobs:
CIBW_BEFORE_ALL_MACOS: brew install nasm &&
bash ci-utils/install_prereq_linux.sh &&
mkdir -p /tmp/bfiocpp_bld &&
brew uninstall --ignore-dependencies openssl || true &&
sudo rm -rf /usr/local/include/openssl &&
cp -r local_install /tmp/bfiocpp_bld
CIBW_BEFORE_ALL_LINUX: curl -L https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2 -o nasm-2.15.05.tar.bz2 &&
tar -xjf nasm-2.15.05.tar.bz2 &&
Expand All @@ -75,7 +77,11 @@ jobs:
ON_GITHUB="TRUE"
BFIOCPP_DEP_DIR="/tmp/bfiocpp_bld/local_install"
CMAKE_ARGS="-DCMAKE_CXX_FLAGS=-Wno-missing-template-arg-list-after-template-kw -DTENSORSTORE_USE_SYSTEM_JPEG=ON -DTENSORSTORE_USE_SYSTEM_ZLIB=ON -DTENSORSTORE_USE_SYSTEM_PNG=ON"
CIBW_ENVIRONMENT_LINUX: LD_LIBRARY_PATH="/tmp/bfiocpp_bld/local_install/lib:/tmp/bfiocpp_bld/local_install/lib64:$LD_LIBRARY_PATH" ON_GITHUB="TRUE" BFIOCPP_DEP_DIR="/tmp/bfiocpp_bld/local_install"
CIBW_ENVIRONMENT_LINUX: >-
LD_LIBRARY_PATH="/tmp/bfiocpp_bld/local_install/lib:/tmp/bfiocpp_bld/local_install/lib64:$LD_LIBRARY_PATH"
ON_GITHUB="TRUE"
BFIOCPP_DEP_DIR="/tmp/bfiocpp_bld/local_install"
CMAKE_ARGS="-DTENSORSTORE_USE_SYSTEM_JPEG=ON -DTENSORSTORE_USE_SYSTEM_ZLIB=ON -DTENSORSTORE_USE_SYSTEM_PNG=ON"
CIBW_REPAIR_WHEEL_COMMAND_MACOS: DYLD_LIBRARY_PATH=$REPAIR_LIBRARY_PATH delocate-listdeps {wheel} && DYLD_LIBRARY_PATH=$REPAIR_LIBRARY_PATH delocate-wheel --require-archs {delocate_archs} -w {dest_dir} {wheel}
CIBW_ENVIRONMENT_WINDOWS: PATH="$TEMP\\bfiocpp\\bin;$PATH" ON_GITHUB="TRUE" BFIOCPP_DEP_DIR="C:\\TEMP\\bfiocpp_bld\\local_install" CMAKE_ARGS="-DCMAKE_GENERATOR=Ninja"
CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "delvewheel repair -w {dest_dir} {wheel}"
Expand Down
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ include(FetchContent)

FetchContent_Declare(
tensorstore
URL "https://github.com/google/tensorstore/archive/refs/tags/v0.1.36.tar.gz"
URL_HASH SHA256=5857582b1b68e5a3f470d2ee8e9a7fa1ad6e6c7e0867c7c69e5a523ae00bc002
URL "https://github.com/google/tensorstore/archive/refs/tags/v0.1.80.tar.gz"
URL_HASH SHA256=94866de34b6139d77d30e828a50f9e8df98e7dd68e848393470879aeb50ea7bf
)

# Additional FetchContent_Declare calls as needed...
Expand Down
59 changes: 32 additions & 27 deletions ci-utils/install_prereq_linux.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,32 +22,37 @@ cmake -DCMAKE_INSTALL_PREFIX=../../$LOCAL_INSTALL_DIR/ -DPYBIND11_TEST=OFF ..
make install -j4
cd ../../


curl -L https://github.com/madler/zlib/releases/download/v1.3.1/zlib131.zip -o zlib131.zip
unzip zlib131.zip
cd zlib-1.3.1
mkdir build_man
cd build_man
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_INSTALL_PREFIX=/usr/local ..
cmake --build .
cmake --build . --target install
cd ../../

curl -L https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/3.1.0.zip -o 3.1.0.zip
unzip 3.1.0.zip
cd libjpeg-turbo-3.1.0
mkdir build_man
cd build_man
cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DENABLE_STATIC=FALSE -DCMAKE_BUILD_TYPE=Release ..
if [[ "$OSTYPE" == "darwin"* ]]; then
curl -L https://github.com/madler/zlib/releases/download/v1.3.1/zlib131.zip -o zlib131.zip
unzip zlib131.zip
cd zlib-1.3.1
mkdir build_man
cd build_man
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_INSTALL_PREFIX=/usr/local ..
cmake --build .
cmake --build . --target install
cd ../../

curl -L https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/3.1.0.zip -o 3.1.0.zip
unzip 3.1.0.zip
cd libjpeg-turbo-3.1.0
mkdir build_man
cd build_man
cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DENABLE_STATIC=FALSE -DCMAKE_BUILD_TYPE=Release ..
sudo make install -j4
cd ../../
sudo make install -j4
else
make install -j4
fi
cd ../../
make install -j4
cd ../../

curl -L https://github.com/glennrp/libpng/archive/refs/tags/v1.6.53.zip -o v1.6.53.zip
unzip v1.6.53.zip
cd libpng-1.6.53
mkdir build_man
cd build_man
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_INSTALL_PREFIX=/usr/local ..
make install -j4
cd ../../
fi
curl -L https://github.com/glennrp/libpng/archive/refs/tags/v1.6.53.zip -o v1.6.53.zip
unzip v1.6.53.zip
cd libpng-1.6.53
mkdir build_man
cd build_man
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_INSTALL_PREFIX=/usr/local ..
make install -j4
cd ../../
12 changes: 0 additions & 12 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,18 +78,6 @@ def build_extension(self, ext):
["cmake", ext.sourcedir] + cmake_args, cwd=self.build_temp, env=env
)

if platform.system() == "Linux":
rl = r"s/^#ifdef __has_builtin$/#if defined(__has_builtin)"
rf = r"\&\& defined(__clang__)/"
rsed = rl + rf
path_header = "_deps/tensorstore-src/tensorstore/internal/type_traits.h"
result = subprocess.call(["sed", "-i",
rsed,
path_header],
cwd=self.build_temp, env=env)
if result != 0:
print("--------------- TensorStore patch failed!")

subprocess.check_call(
["cmake", "--build", "."] + build_args, cwd=self.build_temp
)
Expand Down
129 changes: 83 additions & 46 deletions src/cpp/ts_driver/ometiff/driver.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "metadata.h"

#include "tensorstore/driver/driver.h"
#include "tensorstore/driver/driver_spec.h"
#include "absl/status/status.h"
#include "absl/strings/str_cat.h"
#include "tensorstore/context.h"
Expand All @@ -10,7 +11,11 @@
#include "tensorstore/driver/registry.h"
#include "tensorstore/index.h"
#include "tensorstore/index_space/index_transform_builder.h"
#include "tensorstore/index_space/transform_broadcastable_array.h"
#include "tensorstore/internal/async_write_array.h"
#include "tensorstore/internal/cache/chunk_cache.h"
#include "tensorstore/internal/chunk_grid_specification.h"
#include "tensorstore/contiguous_layout.h"
#include "tensorstore/internal/json_binding/json_binding.h"
#include "tensorstore/internal/path.h"
#include "tensorstore/kvstore/kvstore.h"
Expand All @@ -19,6 +24,7 @@
#include "tensorstore/util/future.h"

#include <iostream>
#include <numeric>
#include <tuple>
#include <string>

Expand Down Expand Up @@ -86,8 +92,7 @@ class OmeTiffDriverSpec


Future<internal::Driver::Handle> Open(
internal::OpenTransactionPtr transaction,
ReadWriteMode read_write_mode) const override;
internal::DriverOpenRequest request) const override;
};

// we need OMETiff Metadata
Expand Down Expand Up @@ -143,12 +148,17 @@ class DataCache : public internal_kvs_backed_chunk_driver::DataCache {
using Base = internal_kvs_backed_chunk_driver::DataCache;

public:
explicit DataCache(Initializer initializer, std::string key_prefix)
: Base(initializer,
GetChunkGridSpecification(*static_cast<const OmeTiffMetadata*>(
initializer.metadata.get()))),
explicit DataCache(Initializer&& initializer, std::string key_prefix)
: Base(std::move(initializer),
GetChunkGridSpecification(
*static_cast<const OmeTiffMetadata*>(
initializer.metadata.get()))),
key_prefix_(std::move(key_prefix)) {}

const OmeTiffMetadata& metadata() const {
return *static_cast<const OmeTiffMetadata*>(initial_metadata().get());
}

absl::Status ValidateMetadataCompatibility(
const void* existing_metadata_ptr,
const void* new_metadata_ptr) override {
Expand Down Expand Up @@ -195,47 +205,70 @@ class DataCache : public internal_kvs_backed_chunk_driver::DataCache {

static internal::ChunkGridSpecification GetChunkGridSpecification(
const OmeTiffMetadata& metadata) {
SharedArray<const void> fill_value(
internal::AllocateAndConstructSharedElements(1, value_init,
metadata.dtype),
StridedLayout<>(metadata.chunk_layout.shape(),
GetConstantVector<Index, 0>(metadata.rank)));
return internal::ChunkGridSpecification(
{internal::ChunkGridSpecification::Component(std::move(fill_value),
// Since all dimensions are
// resizable, just specify
// unbounded
// `component_bounds`.
Box<>(metadata.rank))});
const DimensionIndex rank = metadata.rank;

// Create fill value (zero-initialized)
auto fill_value = AllocateArray(span<const Index, 0>{}, c_order, value_init,
metadata.dtype);

// Valid data bounds - unbounded since all dimensions are resizable
Box<> valid_data_bounds(rank);

// Broadcast fill value to the valid bounds
auto chunk_fill_value = BroadcastArray(fill_value, valid_data_bounds).value();

// Cell chunk shape from metadata
std::vector<Index> cell_chunk_shape(metadata.chunk_layout.shape().begin(),
metadata.chunk_layout.shape().end());

// Chunked to cell dimensions mapping (identity for OmeTiff)
std::vector<DimensionIndex> chunked_to_cell_dimensions(rank);
std::iota(chunked_to_cell_dimensions.begin(),
chunked_to_cell_dimensions.end(), static_cast<DimensionIndex>(0));

// Create layout order buffer for C order (identity permutation)
DimensionIndex layout_order_buffer[kMaxRank];
for (DimensionIndex i = 0; i < rank; ++i) {
layout_order_buffer[i] = i;
}

// Build component list with AsyncWriteArray::Spec
internal::ChunkGridSpecification::ComponentList components;
components.emplace_back(
internal::AsyncWriteArray::Spec{std::move(chunk_fill_value),
std::move(valid_data_bounds),
ContiguousLayoutPermutation<>(
span(layout_order_buffer, rank))},
std::move(cell_chunk_shape), chunked_to_cell_dimensions);

return internal::ChunkGridSpecification{std::move(components)};
}

Result<absl::InlinedVector<SharedArrayView<const void>, 1>> DecodeChunk(
const void* metadata, span<const Index> chunk_indices,
Result<absl::InlinedVector<SharedArray<const void>, 1>> DecodeChunk(
span<const Index> chunk_indices,
absl::Cord data) override {
TENSORSTORE_ASSIGN_OR_RETURN(
auto array,
internal_ometiff::DecodeChunk(*static_cast<const OmeTiffMetadata*>(metadata),
std::move(data)));
return absl::InlinedVector<SharedArrayView<const void>, 1>{
std::move(array)};
internal_ometiff::DecodeChunk(metadata(), std::move(data)));
return absl::InlinedVector<SharedArray<const void>, 1>{
SharedArray<const void>(std::move(array))};
}


Result<absl::Cord> EncodeChunk(
const void* metadata, span<const Index> chunk_indices,
span<const SharedArrayView<const void>> component_arrays) override {
span<const Index> chunk_indices,
span<const SharedArray<const void>> component_arrays) override {
return absl::Cord();
}

std::string GetChunkStorageKey(const void* metadata_ptr,
span<const Index> cell_indices) override {
std::string GetChunkStorageKey(span<const Index> cell_indices) override {
// OMETiff is always 5D. So need to add some check here
const auto& metadata = *static_cast<const OmeTiffMetadata*>(metadata_ptr);
const auto& md = metadata();

size_t ifd = metadata.GetIfdIndex(cell_indices[2],cell_indices[1],cell_indices[0]);
size_t ifd = md.GetIfdIndex(cell_indices[2],cell_indices[1],cell_indices[0]);
std::string key =
StrCat(key_prefix_, "__TAG__/" );
auto& chunk_shape = metadata.chunk_shape;
auto& chunk_shape = md.chunk_shape;
// StrAppend(&key, cell_indices.empty() ? 0 : cell_indices[0]);

StrAppend(&key, "_", cell_indices[3]*chunk_shape[3]);
Expand Down Expand Up @@ -276,12 +309,12 @@ class DataCache : public internal_kvs_backed_chunk_driver::DataCache {
return absl::OkStatus();
}

Result<ChunkLayout> GetChunkLayout(const void* metadata_ptr,
std::size_t component_index) override {
const auto& metadata = *static_cast<const OmeTiffMetadata*>(metadata_ptr);
Result<ChunkLayout> GetChunkLayoutFromMetadata(const void* metadata_ptr,
size_t component_index) override {
const auto& md = *static_cast<const OmeTiffMetadata*>(metadata_ptr);
ChunkLayout chunk_layout;
TENSORSTORE_RETURN_IF_ERROR(SetChunkLayoutFromMetadata(
metadata.rank, metadata.chunk_shape, chunk_layout));
md.rank, md.chunk_shape, chunk_layout));
TENSORSTORE_RETURN_IF_ERROR(chunk_layout.Finalize());
return chunk_layout;
}
Expand All @@ -292,11 +325,16 @@ class DataCache : public internal_kvs_backed_chunk_driver::DataCache {
std::string key_prefix_;
};

class OmeTiffDriver : public internal_kvs_backed_chunk_driver::RegisteredKvsDriver<
OmeTiffDriver, OmeTiffDriverSpec> {
using Base =
internal_kvs_backed_chunk_driver::RegisteredKvsDriver<OmeTiffDriver,
OmeTiffDriverSpec>;
// Forward declaration for the mixin
class OmeTiffDriver;

using OmeTiffDriverBase = internal_kvs_backed_chunk_driver::RegisteredKvsDriver<
OmeTiffDriver, OmeTiffDriverSpec, DataCache,
internal::ChunkCacheReadWriteDriverMixin<
OmeTiffDriver, internal_kvs_backed_chunk_driver::KvsChunkedDriverBase>>;

class OmeTiffDriver : public OmeTiffDriverBase {
using Base = OmeTiffDriverBase;

public:
using Base::Base;
Expand Down Expand Up @@ -333,7 +371,7 @@ class OmeTiffDriver::OpenState : public OmeTiffDriver::OpenStateBase {


Result<std::shared_ptr<const void>> Create(
const void* existing_metadata) override {
const void* existing_metadata, CreateOptions options) override {
if (existing_metadata) {
return absl::AlreadyExistsError("");
}
Expand All @@ -345,8 +383,8 @@ class OmeTiffDriver::OpenState : public OmeTiffDriver::OpenStateBase {
return metadata;
}

std::unique_ptr<internal_kvs_backed_chunk_driver::DataCache> GetDataCache(
DataCache::Initializer initializer) override {
std::unique_ptr<internal_kvs_backed_chunk_driver::DataCacheBase> GetDataCache(
internal_kvs_backed_chunk_driver::DataCacheInitializer&& initializer) override {
return std::make_unique<DataCache>(std::move(initializer),
spec().store.path);
}
Expand All @@ -364,9 +402,8 @@ class OmeTiffDriver::OpenState : public OmeTiffDriver::OpenStateBase {
};

Future<internal::Driver::Handle> OmeTiffDriverSpec::Open(
internal::OpenTransactionPtr transaction,
ReadWriteMode read_write_mode) const {
return OmeTiffDriver::Open(std::move(transaction), this, read_write_mode);
internal::DriverOpenRequest request) const {
return OmeTiffDriver::Open(this, std::move(request));
}

} // namespace
Expand Down
Loading
Loading