HighMap library (C++)
Loading...
Searching...
No Matches
virtual_array.hpp
Go to the documentation of this file.
1/* Copyright (c) 2025 Otto Link. Distributed under the terms of the GNU General
2 Public License. The full license is in the file LICENSE, distributed with
3 this software. */
4
10#pragma once
11#include <future>
12#include <thread>
13
14#include "highmap/array.hpp"
15#include "highmap/filters.hpp"
16#include "highmap/logger.hpp"
17#include "highmap/math/core.hpp"
20
21namespace hmap
22{
23
24// =====================================
25// Peripheric classes
26// =====================================
27
28enum ForEachMode : int
29{
30 VA_SEQUENTIAL, // tile-by-tile, single thread
31 VA_DISTRIBUTED, // tile-by-tile, multi-threaded
32 VA_SINGLE_ARRAY, // full array materialized at once
33 VA_SINGLE_ARRAY_DOWNSCALED // full array materialized at once
34};
35
36inline std::string to_string(ForEachMode m)
37{
38 switch (m)
39 {
40 case ForEachMode::VA_SEQUENTIAL: return "VA_SEQUENTIAL";
41 case ForEachMode::VA_DISTRIBUTED: return "VA_DISTRIBUTED";
42 case ForEachMode::VA_SINGLE_ARRAY: return "VA_SINGLE_ARRAY";
44 return "VA_SINGLE_ARRAY_DOWNSCALED";
45 }
46 return "UNKNOWN";
47}
48
49static std::map<std::string, int> for_each_mode_as_string = {
50 {"Distributed", ForEachMode::VA_DISTRIBUTED},
51 {"Sequential", ForEachMode::VA_SEQUENTIAL},
52 {"Single array", ForEachMode::VA_SINGLE_ARRAY},
53 {"Single array downscaled", ForEachMode::VA_SINGLE_ARRAY_DOWNSCALED}};
54
56{
58 bool trim_storage = false;
59 int stride = 1;
60 float k_cutoff = 1.f; // freq. cut-off ratio in ]0, 1]
61};
62
63// =====================================
64// VirtualArray class
65// =====================================
66
68{
69 // --- Ctor...
70
71 VirtualArray() = default;
72
73 VirtualArray(glm::ivec2 shape,
74 glm::vec4 bbox, // (x1, x2, y1, y2)
75 glm::ivec2 tile_shape,
76 int halo,
77 std::unique_ptr<TileStorage> storage);
78
79 VirtualArray(glm::ivec2 shape,
80 glm::vec4 bbox,
81 glm::ivec2 tile_shape,
82 int halo,
83 StorageMode storage_mode = StorageMode::VA_RAM);
84
85 VirtualArray(glm::ivec2 shape,
86 glm::ivec2 tile_shape,
87 int halo,
88 StorageMode storage_mode = StorageMode::VA_RAM);
89
90 // --- Duplicate
91
92 std::unique_ptr<VirtualArray> clone(const ComputeMode &cm,
93 bool deep_copy = false);
94 void copy_from(VirtualArray &src,
95 const ComputeMode &cm,
96 bool copy_src_data = true);
97
98 // --- Access individual cells (slower)
99
100 float get(int global_i, int global_j) const;
101 float get_bilinear(float x, float y) const;
102 float get_nearest(float x, float y) const;
103 void set(int global_i, int global_j, float v);
104 glm::ivec2 get_max_tiles() const;
105 int get_ntiles() const;
106 std::string info_string(const ComputeMode &cm, int indent = 0) const;
107
108 void fill(float value, const ComputeMode &cm);
109 void from_array(const Array &array, const ComputeMode &cm);
110 void from_array_bilinear(const Array &array, const ComputeMode &cm);
111 void from_array_bicubic(const Array &array, const ComputeMode &cm);
112 Array to_array(const glm::ivec2 &array_shape, const ComputeMode &cm) const;
113 Array to_array(const ComputeMode &cm) const;
114 Array to_array_dbg() const;
115
116 // --- Processing methods
117
118 float max(const ComputeMode &cm) const;
119 float mean(const ComputeMode &cm) const;
120 float min(const ComputeMode &cm) const;
121 float sum(const ComputeMode &cm) const;
122
123 glm::vec2 range(const ComputeMode &cm) const;
124 glm::vec2 range_percentile(float p_low,
125 float p_high,
126 const ComputeMode &cm,
127 size_t bins = 1024) const;
128
129 void inverse(const ComputeMode &cm);
130 void remap(float vmin, float vmax, const ComputeMode &cm);
131 void remap(float vmin,
132 float vmax,
133 float from_min,
134 float from_max,
135 const ComputeMode &cm);
136
137 std::vector<float> unique_values(const ComputeMode &cm) const;
138
140
141 // Find which tile covers a given index
142 glm::vec2 tile_region_global_position(const TileRegion &region) const;
143 glm::ivec2 tile_region_global_indices(const TileRegion &region) const;
144 TileRegion tile_region_from_global_index(int global_i, int global_j) const;
145 TileRegion tile_region_from_tile_coords(int tile_x, int tile_y) const;
146 glm::ivec2 local_indices(const TileRegion &region,
147 int global_i,
148 int global_j) const;
149
150 void trim_storage() const;
151 size_t live_tile_count() const;
152 size_t live_memory_bytes() const;
153
154 // --- Members
155
156 glm::ivec2 shape;
157 glm::vec4 bbox; // (x1, x2, y1, y2)
158 glm::ivec2 tile_shape;
159 int halo;
160 std::unique_ptr<TileStorage> storage;
161};
162
163// actual implementation
165
166// functions
167void copy_data(VirtualArray &src, VirtualArray &dst, const ComputeMode &cm);
168
169} // namespace hmap
Declaration of the Array class for 2D floating-point arrays with various mathematical operations and ...
Array class, helper to manipulate 2D float array with "(i, j)" indexing.
Definition array.hpp:32
Header file for filter-related functions and classes.
Custom logger utility with spdlog-like formatting and source location.
Definition algebra.hpp:23
std::string to_string(StorageMode m)
Definition tile_storage.hpp:37
void copy_data(VirtualArray &src, VirtualArray &dst, const ComputeMode &cm)
Definition virtual_array.cpp:552
StorageMode
Definition tile_storage.hpp:30
@ VA_RAM
Definition tile_storage.hpp:31
ForEachMode
Definition virtual_array.hpp:29
@ VA_SINGLE_ARRAY_DOWNSCALED
Definition virtual_array.hpp:33
@ VA_DISTRIBUTED
Definition virtual_array.hpp:31
@ VA_SEQUENTIAL
Definition virtual_array.hpp:30
@ VA_SINGLE_ARRAY
Definition virtual_array.hpp:32
Definition virtual_array.hpp:56
float k_cutoff
Definition virtual_array.hpp:60
int stride
Definition virtual_array.hpp:59
ForEachMode mode
Definition virtual_array.hpp:57
bool trim_storage
Definition virtual_array.hpp:58
Definition tile_region.hpp:38
Definition virtual_array.hpp:68
Array to_array_dbg() const
Definition virtual_array.cpp:524
glm::ivec2 local_indices(const TileRegion &region, int global_i, int global_j) const
Definition virtual_array.cpp:316
TileRegion tile_region_from_tile_coords(int tile_x, int tile_y) const
Definition virtual_array.cpp:421
size_t live_memory_bytes() const
Definition virtual_array.cpp:545
int get_ntiles() const
Definition virtual_array.cpp:284
void inverse(const ComputeMode &cm)
Definition virtual_array_processing.cpp:17
int halo
Definition virtual_array.hpp:159
glm::ivec2 tile_shape
Definition virtual_array.hpp:158
TileRegion tile_region_from_global_index(int global_i, int global_j) const
Definition virtual_array.cpp:411
VirtualArray()=default
glm::vec2 range(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:76
void copy_from(VirtualArray &src, const ComputeMode &cm, bool copy_src_data=true)
Definition virtual_array.cpp:59
void from_array_bilinear(const Array &array, const ComputeMode &cm)
Definition virtual_array.cpp:137
void smooth_overlap_buffers()
Definition virtual_array.cpp:342
void from_array_bicubic(const Array &array, const ComputeMode &cm)
Definition virtual_array.cpp:179
glm::vec4 bbox
Definition virtual_array.hpp:157
float min(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:57
std::vector< float > unique_values(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:230
Array to_array(const glm::ivec2 &array_shape, const ComputeMode &cm) const
Definition virtual_array.cpp:480
float max(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:32
void trim_storage() const
Definition virtual_array.cpp:535
float get(int global_i, int global_j) const
Definition virtual_array.cpp:221
glm::vec2 range_percentile(float p_low, float p_high, const ComputeMode &cm, size_t bins=1024) const
Definition virtual_array_processing.cpp:101
void remap(float vmin, float vmax, const ComputeMode &cm)
Definition virtual_array_processing.cpp:178
void set(int global_i, int global_j, float v)
Definition virtual_array.cpp:333
glm::ivec2 shape
Definition virtual_array.hpp:156
std::unique_ptr< VirtualArray > clone(const ComputeMode &cm, bool deep_copy=false)
Definition virtual_array.cpp:75
void from_array(const Array &array, const ComputeMode &cm)
Definition virtual_array.cpp:104
std::unique_ptr< TileStorage > storage
Definition virtual_array.hpp:160
float mean(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:51
glm::ivec2 get_max_tiles() const
Definition virtual_array.cpp:232
glm::vec2 tile_region_global_position(const TileRegion &region) const
Definition virtual_array.cpp:462
float get_bilinear(float x, float y) const
Definition virtual_array.cpp:240
size_t live_tile_count() const
Definition virtual_array.cpp:540
void fill(float value, const ComputeMode &cm)
Definition virtual_array.cpp:96
float get_nearest(float x, float y) const
Definition virtual_array.cpp:270
std::string info_string(const ComputeMode &cm, int indent=0) const
Definition virtual_array.cpp:290
float sum(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:199
glm::ivec2 tile_region_global_indices(const TileRegion &region) const
Definition virtual_array.cpp:472