IndexedArray.h
Go to the documentation of this file.
1 // BSD 3-Clause License; see https://github.com/scikit-hep/awkward-1.0/blob/main/LICENSE
2 
3 #ifndef AWKWARD_INDEXEDARRAY_H_
4 #define AWKWARD_INDEXEDARRAY_H_
5 
6 #include <string>
7 #include <memory>
8 #include <vector>
9 
10 #include "awkward/common.h"
11 #include "awkward/Slice.h"
12 #include "awkward/Index.h"
13 #include "awkward/Content.h"
14 
15 namespace awkward {
20  public:
23  IndexedForm(bool has_identities,
24  const util::Parameters& parameters,
25  const FormKey& form_key,
27  const FormPtr& content);
28 
30  index() const;
31 
32  const FormPtr
33  content() const;
34 
35  const TypePtr
36  type(const util::TypeStrs& typestrs) const override;
37 
38  void
39  tojson_part(ToJson& builder, bool verbose) const override;
40 
41  const FormPtr
42  shallow_copy() const override;
43 
44  const FormPtr
45  with_form_key(const FormKey& form_key) const override;
46 
47  const std::string
48  purelist_parameter(const std::string& key) const override;
49 
50  bool
51  purelist_isregular() const override;
52 
53  int64_t
54  purelist_depth() const override;
55 
56  bool
57  dimension_optiontype() const override;
58 
59  const std::pair<int64_t, int64_t>
60  minmax_depth() const override;
61 
62  const std::pair<bool, int64_t>
63  branch_depth() const override;
64 
65  int64_t
66  numfields() const override;
67 
68  int64_t
69  fieldindex(const std::string& key) const override;
70 
71  const std::string
72  key(int64_t fieldindex) const override;
73 
74  bool
75  haskey(const std::string& key) const override;
76 
77  const std::vector<std::string>
78  keys() const override;
79 
80  bool
81  istuple() const override;
82 
83  bool
84  equal(const FormPtr& other,
85  bool check_identities,
86  bool check_parameters,
87  bool check_form_key,
88  bool compatibility_check) const override;
89 
90  const FormPtr
91  getitem_field(const std::string& key) const override;
92 
93  const FormPtr
94  getitem_fields(const std::vector<std::string>& keys) const override;
95 
96  const FormPtr
97  simplify_optiontype() const;
98 
99  private:
100  Index::Form index_;
101  const FormPtr content_;
102  };
103 
108  public:
110  IndexedOptionForm(bool has_identities,
111  const util::Parameters& parameters,
112  const FormKey& form_key,
114  const FormPtr& content);
115 
116  Index::Form index() const;
117 
118  const FormPtr content() const;
119 
120  const TypePtr
121  type(const util::TypeStrs& typestrs) const override;
122 
123  void
124  tojson_part(ToJson& builder, bool verbose) const override;
125 
126  const FormPtr
127  shallow_copy() const override;
128 
129  const FormPtr
130  with_form_key(const FormKey& form_key) const override;
131 
132  const std::string
133  purelist_parameter(const std::string& key) const override;
134 
135  bool
136  purelist_isregular() const override;
137 
138  int64_t
139  purelist_depth() const override;
140 
141  bool
142  dimension_optiontype() const override;
143 
144  const std::pair<int64_t, int64_t>
145  minmax_depth() const override;
146 
147  const std::pair<bool, int64_t>
148  branch_depth() const override;
149 
150  int64_t
151  numfields() const override;
152 
153  int64_t
154  fieldindex(const std::string& key) const override;
155 
156  const std::string
157  key(int64_t fieldindex) const override;
158 
159  bool
160  haskey(const std::string& key) const override;
161 
162  const std::vector<std::string>
163  keys() const override;
164 
165  bool
166  istuple() const override;
167 
168  bool
169  equal(const FormPtr& other,
170  bool check_identities,
171  bool check_parameters,
172  bool check_form_key,
173  bool compatibility_check) const override;
174 
175  const FormPtr
176  getitem_field(const std::string& key) const override;
177 
178  const FormPtr
179  getitem_fields(const std::vector<std::string>& keys) const override;
180 
181  const FormPtr
182  simplify_optiontype() const;
183 
184  private:
185  Index::Form index_;
186  const FormPtr content_;
187  };
188 
199  template <typename T, bool ISOPTION>
200  class
201 #ifdef AWKWARD_INDEXEDARRAY_NO_EXTERN_TEMPLATE
203 #endif
204  IndexedArrayOf: public Content {
205  public:
221  IndexedArrayOf<T, ISOPTION>(const IdentitiesPtr& identities,
222  const util::Parameters& parameters,
223  const IndexOf<T>& index,
224  const ContentPtr& content);
225 
232  const IndexOf<T>
233  index() const;
234 
239  const ContentPtr
240  content() const;
241 
244  bool
245  isoption() const;
246 
249  const ContentPtr
250  project() const;
251 
256  const ContentPtr
257  project(const Index8& mask) const;
258 
262  const Index8
263  bytemask() const;
264 
271  const ContentPtr
272  simplify_optiontype() const;
273 
275  T
276  index_at_nowrap(int64_t at) const;
277 
281  const std::string
282  classname() const override;
283 
284  void
285  setidentities() override;
286 
287  void
288  setidentities(const IdentitiesPtr& identities) override;
289 
290  const TypePtr
291  type(const util::TypeStrs& typestrs) const override;
292 
293  const FormPtr
294  form(bool materialize) const override;
295 
297  kernels() const override;
298 
299  void
300  caches(std::vector<ArrayCachePtr>& out) const override;
301 
302  const std::string
303  tostring_part(const std::string& indent,
304  const std::string& pre,
305  const std::string& post) const override;
306 
307  void
308  tojson_part(ToJson& builder, bool include_beginendlist) const override;
309 
310  void
311  nbytes_part(std::map<size_t, int64_t>& largest) const override;
312 
316  int64_t
317  length() const override;
318 
319  const ContentPtr
320  shallow_copy() const override;
321 
322  const ContentPtr
323  deep_copy(bool copyarrays,
324  bool copyindexes,
325  bool copyidentities) const override;
326 
327  void
328  check_for_iteration() const override;
329 
330  const ContentPtr
331  getitem_nothing() const override;
332 
333  const ContentPtr
334  getitem_at(int64_t at) const override;
335 
336  const ContentPtr
337  getitem_at_nowrap(int64_t at) const override;
338 
339  const ContentPtr
340  getitem_range(int64_t start, int64_t stop) const override;
341 
342  const ContentPtr
343  getitem_range_nowrap(int64_t start, int64_t stop) const override;
344 
345  const ContentPtr
346  getitem_field(const std::string& key) const override;
347 
348  const ContentPtr
349  getitem_field(const std::string& key,
350  const Slice& only_fields) const override;
351 
352  const ContentPtr
353  getitem_fields(const std::vector<std::string>& keys) const override;
354 
355  const ContentPtr
356  getitem_fields(const std::vector<std::string>& keys,
357  const Slice& only_fields) const override;
358 
359  const ContentPtr
360  getitem_next(const SliceItemPtr& head,
361  const Slice& tail,
362  const Index64& advanced) const override;
363 
364  const ContentPtr
365  carry(const Index64& carry, bool allow_lazy) const override;
366 
367  int64_t
368  purelist_depth() const override;
369 
370  const std::pair<int64_t, int64_t>
371  minmax_depth() const override;
372 
373  const std::pair<bool, int64_t>
374  branch_depth() const override;
375 
376  int64_t
377  numfields() const override;
378 
379  int64_t
380  fieldindex(const std::string& key) const override;
381 
382  const std::string
383  key(int64_t fieldindex) const override;
384 
385  bool
386  haskey(const std::string& key) const override;
387 
388  const std::vector<std::string>
389  keys() const override;
390 
391  bool
392  istuple() const override;
393 
394  // operations
395  const std::string
396  validityerror(const std::string& path) const override;
397 
403  const ContentPtr
404  shallow_simplify() const override;
405 
406  const ContentPtr
407  num(int64_t axis, int64_t depth) const override;
408 
409  const std::pair<Index64, ContentPtr>
410  offsets_and_flattened(int64_t axis, int64_t depth) const override;
411 
412  bool
413  mergeable(const ContentPtr& other, bool mergebool) const override;
414 
415  bool
416  referentially_equal(const ContentPtr& other) const override;
417 
418  const ContentPtr
419  reverse_merge(const ContentPtr& other) const override;
420 
421  const std::pair<ContentPtrVec, ContentPtrVec>
422  merging_strategy(const ContentPtrVec& others) const override;
423 
424  const ContentPtr
425  mergemany(const ContentPtrVec& others) const override;
426 
427  const SliceItemPtr
428  asslice() const override;
429 
430  const ContentPtr
431  fillna(const ContentPtr& value) const override;
432 
433  const ContentPtr
434  rpad(int64_t target, int64_t axis, int64_t depth) const override;
435 
436  const ContentPtr
437  rpad_and_clip(int64_t target,
438  int64_t axis,
439  int64_t depth) const override;
440 
441  const ContentPtr
442  reduce_next(const Reducer& reducer,
443  int64_t negaxis,
444  const Index64& starts,
445  const Index64& shifts,
446  const Index64& parents,
447  int64_t outlength,
448  bool mask,
449  bool keepdims) const override;
450 
451  const ContentPtr
452  sort_next(int64_t negaxis,
453  const Index64& starts,
454  const Index64& parents,
455  int64_t outlength,
456  bool ascending,
457  bool stable) const override;
458 
459  const ContentPtr
460  argsort_next(int64_t negaxis,
461  const Index64& starts,
462  const Index64& shifts,
463  const Index64& parents,
464  int64_t outlength,
465  bool ascending,
466  bool stable) const override;
467 
468  const ContentPtr
469  localindex(int64_t axis, int64_t depth) const override;
470 
471  const ContentPtr
472  combinations(int64_t n,
473  bool replacement,
474  const util::RecordLookupPtr& recordlookup,
475  const util::Parameters& parameters,
476  int64_t axis,
477  int64_t depth) const override;
478 
479  const ContentPtr
480  getitem_next(const SliceAt& at,
481  const Slice& tail,
482  const Index64& advanced) const override;
483 
484  const ContentPtr
485  getitem_next(const SliceRange& range,
486  const Slice& tail,
487  const Index64& advanced) const override;
488 
489  const ContentPtr
490  getitem_next(const SliceArray64& array,
491  const Slice& tail,
492  const Index64& advanced) const override;
493 
494  const ContentPtr
495  getitem_next(const SliceJagged64& jagged,
496  const Slice& tail,
497  const Index64& advanced) const override;
498 
499  const ContentPtr
500  getitem_next_jagged(const Index64& slicestarts,
501  const Index64& slicestops,
502  const SliceArray64& slicecontent,
503  const Slice& tail) const override;
504 
505  const ContentPtr
506  getitem_next_jagged(const Index64& slicestarts,
507  const Index64& slicestops,
508  const SliceMissing64& slicecontent,
509  const Slice& tail) const override;
510 
511  const ContentPtr
512  getitem_next_jagged(const Index64& slicestarts,
513  const Index64& slicestops,
514  const SliceJagged64& slicecontent,
515  const Slice& tail) const override;
516 
517  const ContentPtr
518  copy_to(kernel::lib ptr_lib) const override;
519 
520  const ContentPtr
521  numbers_to_type(const std::string& name) const override;
522 
524  bool
525  is_unique() const override;
526 
528  const ContentPtr
529  unique() const override;
530 
532  bool
533  is_subrange_equal(const Index64& start, const Index64& stop) const override;
534 
535  protected:
536  template <typename S>
537  const ContentPtr
538  getitem_next_jagged_generic(const Index64& slicestarts,
539  const Index64& slicestops,
540  const S& slicecontent,
541  const Slice& tail) const;
542 
543  const std::pair<Index64, IndexOf<T>>
544  nextcarry_outindex(int64_t& numnull) const;
545 
546  private:
548  const IndexOf<T> index_;
550  const ContentPtr content_;
551  };
552 
553 #ifndef AWKWARD_INDEXEDARRAY_NO_EXTERN_TEMPLATE
554  extern template class IndexedArrayOf<int32_t, false>;
555  extern template class IndexedArrayOf<uint32_t, false>;
556  extern template class IndexedArrayOf<int64_t, false>;
557  extern template class IndexedArrayOf<int32_t, true>;
558  extern template class IndexedArrayOf<int64_t, true>;
559 #endif
560 
566 }
567 
568 #endif // AWKWARD_INDEXEDARRAY_H_
Represents a Python slice object (usual syntax: array[start:stop:step]).
Definition: Slice.h:93
#define LIBAWKWARD_EXPORT_SYMBOL
Definition: common.h:45
Form describing IndexedArray (with OPTION = false).
Definition: IndexedArray.h:19
const std::string key(const RecordLookupPtr &recordlookup, int64_t fieldindex, int64_t numfields)
Returns the key associated with a field index, given a RecordLookup and a number of fields...
Abstract superclass of all array node types (flat hierarchy). Any Content can be nested within any ot...
Definition: Content.h:276
Definition: json.h:19
Definition: BitMaskedArray.h:15
A contiguous, one-dimensional array of integers used to represent data structures, rather than numerical data in the arrays themselves.
Definition: Index.h:16
std::string name(Mapping a, V value)
Definition: datetime_util.h:39
Represents a SliceArrayOf, SliceMissingOf, or SliceJaggedOf with missing values: None (no equivalent ...
Definition: Slice.h:431
Abstract class for all reducer algorithms.
Definition: Reducer.h:20
ERROR combinations(kernel::lib ptr_lib, T *toindex, int64_t n, bool replacement, int64_t singlelen)
const std::vector< std::string > keys(const RecordLookupPtr &recordlookup, int64_t numfields)
Returns a given RecordLookup as keys or generate anonymous ones form a number of fields.
Filters, rearranges, and/or duplicates items in its content through an index, which has the same effe...
Definition: BitMaskedArray.h:17
Form
Integer type of an Index, used by ListForm, IndexedForm, etc.
Definition: Index.h:34
std::shared_ptr< std::string > FormKey
Definition: Content.h:19
ERROR unique(kernel::lib ptr_lib, T *toptr, int64_t length, int64_t *tolength)
Represents an array of integers in a slice (possibly converted from an array of booleans).
Definition: Slice.h:225
std::map< std::string, std::string > Parameters
Definition: util.h:165
ERROR copy_to(kernel::lib to_lib, kernel::lib from_lib, void *to_ptr, void *from_ptr, int64_t bytelength)
Internal Function an array buffer from library FROM to library TO, usually between main memory and a ...
std::shared_ptr< Form > FormPtr
Definition: Content.h:18
int64_t fieldindex(const RecordLookupPtr &recordlookup, const std::string &key, int64_t numfields)
Returns the field index associated with a key, given a RecordLookup and a number of fields...
Represents an array of nested lists, where the content may be SliceArrayOf, SliceMissingOf, or SliceJaggedOf (no equivalent in NumPy).
Definition: Slice.h:511
std::vector< std::shared_ptr< Content > > ContentPtrVec
Definition: Content.h:16
Mapping::value_type::value_type value(Mapping a, const std::string &name)
Definition: datetime_util.h:49
A sequence of SliceItem objects representing a tuple passed to Python&#39;s __getitem__.
Definition: Slice.h:585
bool haskey(const RecordLookupPtr &recordlookup, const std::string &key, int64_t numfields)
Returns true if a RecordLookup has a given key; false otherwise.
std::shared_ptr< Type > TypePtr
Definition: Content.h:23
std::shared_ptr< RecordLookup > RecordLookupPtr
Definition: util.h:130
Form describing IndexedOptionArray.
Definition: IndexedArray.h:107
Represents an integer in a tuple of slices passed to __getitem__ in Python.
Definition: Slice.h:58
std::map< std::string, std::string > TypeStrs
Definition: util.h:215
Abstract superclass of all array node forms, which expresses the nesting structure without any large ...
Definition: Content.h:39
std::shared_ptr< Identities > IdentitiesPtr
Definition: Identities.h:16
std::shared_ptr< Content > ContentPtr
Definition: ArrayBuilder.h:16
std::shared_ptr< SliceItem > SliceItemPtr
Definition: Slice.h:15
lib
Definition: kernel-dispatch.h:20