24#ifndef TESSERACT_CCSTRUCT_MATRIX_H_
25#define TESSERACT_CCSTRUCT_MATRIX_H_
42class BLOB_CHOICE_LIST;
45#define NOT_CLASSIFIED static_cast<BLOB_CHOICE_LIST *>(nullptr)
95 int new_size = size1 * size2 + pad;
104 for (
int i = size1 * size2;
i < new_size; ++
i) {
110 void Resize(
int size1,
int size2,
const T &empty) {
119 int new_size = size1 * size2;
120 T *new_array =
new T[new_size];
121 for (
int col = 0; col < size1; ++col) {
122 for (
int row = 0; row < size2; ++row) {
123 int old_index = col *
dim2() + row;
124 int new_index = col * size2 + row;
126 new_array[new_index] =
array_[old_index];
128 new_array[new_index] =
empty_;
143 for (
int i = 0;
i < total_size; ++
i) {
190 for (
int i = 0;
i < size; ++
i) {
208 if (!
empty_.Serialize(fp)) {
212 for (
int i = 0;
i < size; ++
i) {
227 if (!
empty_.DeSerialize(swap, fp)) {
231 for (
int i = 0;
i < size; ++
i) {
255 virtual int index(
int column,
int row)
const {
256 return (column *
dim2_ + row);
263 void put(
int column,
int row,
const T &thing) {
271 T
get(
int column,
int row)
const {
295 for (
int i = 0;
i < size; ++
i) {
301 (*this)(
x,
y) += addend(
x,
y);
311 for (
int i = 0;
i < size; ++
i) {
317 (*this)(
x,
y) -= minuend(
x,
y);
325 for (
int i = 0;
i < size; ++
i) {
332 for (
int i = 0;
i < size; ++
i) {
337 void Clip(
const T &rangemin,
const T &rangemax) {
339 for (
int i = 0;
i < size; ++
i) {
347 for (
int i = 0;
i < size; ++
i) {
363 for (
int i = 0;
i < size; ++
i) {
369 for (
int i = 0;
i < size; ++
i) {
370 double normed =
array_[
i] - mean;
372 sd += normed * normed;
374 sd = sqrt(sd / size);
377 for (
int i = 0;
i < size; ++
i) {
392 for (
int i = 1;
i < size; ++
i) {
394 if (
value > max_value) {
408 T max_abs =
static_cast<T
>(0);
409 for (
int i = 0;
i < size; ++
i) {
411 if (
value > max_abs) {
420 T update_factor = 1 - decay_factor;
422 for (
int i = 0;
i < size; ++
i) {
432 for (
int i = 0;
i < size; ++
i) {
439 for (
int i = 0;
i < size; ++
i) {
470 int max_d = std::max(src_dim, dest_dim);
471 int min_d = std::min(src_dim, dest_dim);
480 int num_replicas = 1, move_size = 1, src_step = 1;
481 for (
int d = 0; d < min_d; ++d) {
482 num_replicas *= dims[d];
484 for (
int d = max_d + 1; d < num_dims; ++d) {
485 move_size *= dims[d];
487 for (
int d = src_dim + 1; d < num_dims; ++d) {
490 if (src_dim > dest_dim) {
491 src_step *= dims[src_dim];
495 int wrap_size = move_size;
496 for (
int d = min_d; d <= max_d; ++d) {
497 wrap_size *= dims[d];
503 for (
int replica = 0; replica < num_replicas; ++replica) {
504 for (
int start = 0; start < src_step; start += move_size) {
505 for (
int pos = start; pos < wrap_size; pos += src_step) {
506 memcpy(
dest, src + pos,
sizeof(*
dest) * move_size);
517 for (
int i = 0;
i < size; ++
i) {
519 if (matrix_cell !=
empty_) {
528 uint32_t size =
dim1_;
536 uint32_t size =
dim1_;
546 uint32_t size1, size2;
558 if (size1 > UINT16_MAX) {
561 if (size2 > UINT16_MAX) {
568 int32_t size1, size2;
576 if (size1 > UINT16_MAX) {
579 if (size2 > UINT16_MAX) {
623 int index(
int column,
int row)
const override {
626 return column * this->dim2_ + row - column;
635 int new_dim2 = std::max(this->
dim2_, array2->
dim2_);
636 T *new_array =
new T[new_dim1 * new_dim2];
637 for (
int col = 0; col < new_dim1; ++col) {
638 for (
int j = 0; j < new_dim2; ++j) {
639 int new_index = col * new_dim2 + j;
641 new_array[new_index] = this->
get(col, col + j);
642 }
else if (col >= this->
dim1_ && j < array2->
dim2_) {
643 new_array[new_index] = array2->
get(col - this->
dim1_, col - this->
dim1_ + j);
644 array2->
put(col - this->
dim1_, col - this->
dim1_ + j,
nullptr);
646 new_array[new_index] = this->
empty_;
652 this->
dim1_ = new_dim1;
653 this->
dim2_ = new_dim2;
665 bool Classified(
int col,
int row,
int wildcard_id)
const;
void ReverseN(void *ptr, int num_bytes)
bool DeSerialize(bool swap, FILE *fp, std::vector< T > &data)
bool Serialize(FILE *fp, const std::vector< T > &data)
T ClipToRange(const T &x, const T &lower_bound, const T &upper_bound)
T & operator()(int column, int row)
void Clip(const T &rangemin, const T &rangemax)
bool DeSerializeClasses(bool swap, FILE *fp)
virtual int num_elements() const
const T & operator()(int column, int row) const
GENERIC_2D_ARRAY(int dim1, int dim2, const T &empty, T *array)
void AdamUpdate(const GENERIC_2D_ARRAY< T > &sum, const GENERIC_2D_ARRAY< T > &sqsum, const T &epsilon)
void AssertFinite() const
void operator+=(const GENERIC_2D_ARRAY< T > &addend)
bool DeSerialize(bool swap, FILE *fp)
bool DeSerializeSize(bool swap, FILE *fp)
bool WithinBounds(const T &rangemin, const T &rangemax) const
const T * operator[](int column) const
void operator*=(const T &factor)
virtual ~GENERIC_2D_ARRAY()
bool Serialize(TFile *fp) const
void SumSquares(const GENERIC_2D_ARRAY< T > &src, const T &decay_factor)
bool SerializeSize(TFile *fp) const
void Resize(int size1, int size2, const T &empty)
void put(int column, int row, const T &thing)
bool DeSerializeSize(TFile *fp)
GENERIC_2D_ARRAY(int dim1, int dim2, const T &empty)
void operator=(const GENERIC_2D_ARRAY< T > &src)
void ResizeNoInit(int size1, int size2, int pad=0)
void operator+=(const T &addend)
void ResizeWithCopy(int size1, int size2)
void RotatingTranspose(const int *dims, int num_dims, int src_dim, int dest_dim, GENERIC_2D_ARRAY< T > *result) const
bool SerializeSize(FILE *fp) const
T * operator[](int column)
bool SerializeClasses(FILE *fp) const
GENERIC_2D_ARRAY(const GENERIC_2D_ARRAY< T > &src)
virtual int index(int column, int row) const
void put(ICOORD pos, const T &thing)
T get(int column, int row) const
bool Serialize(FILE *fp) const
void delete_matrix_pointers()
bool DeSerialize(TFile *fp)
void operator-=(const GENERIC_2D_ARRAY< T > &minuend)
void AttachOnCorner(BandTriMatrix< T > *array2)
BandTriMatrix(int dim1, int dim2, const T &empty)
int index(int column, int row) const override
MATRIX * ConsumeAndMakeBigger(int ind)
bool Classified(int col, int row, int wildcard_id) const
MATRIX * DeepCopy() const
MATRIX(int dimension, int bandwidth)
void IncreaseBandSize(int bandwidth)
void print(const UNICHARSET &unicharset) const
void MapForSplit(int ind)
static void Delete(void *arg)
bool Valid(const MATRIX &m) const
MATRIX_COORD(int c, int r)
TDimension y() const
access_function
TDimension x() const
access function
bool DeSerialize(std::string &data)
bool Serialize(const std::string &data)