/*
    TCFbECustomTableEx.h    December 4, 2004.

    Copyright (C) 2003-2004 CFbE Research Group,
    Software Engineering Laboratory,
    Graduate School of Information Science,
    Nara Institute of Science and Technology,
    All rights reserved.

    This program is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2, (at your option) or
    any later version.

    This program is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with GNU Emacs; see the file COPYING.  If not, write to the
    Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.
*/
//---------------------------------------------------------------------------
#ifndef TCFbECustomTableExH
#define TCFbECustomTableExH
//---------------------------------------------------------------------------
// #include "Maprof.h"

#include <SysUtils.hpp>
#include "TCFbECell.h"
#include "TCFbEToolkit.h"
#include "TCFbERowColumnCachedTable.h"
#include "TCFbEColumnCachedTable.h"
#include "TCFbERowCachedTable.h"
#include "TCFbERowRowCachedTable.h"
#include "TCFbEColumnColumnCachedTable.h"
//---------------------------------------------------------------------------
// 統計機能付きキャッシャブルテーブル
class TCFbECustomTableEx : public TCFbERowColumnCachedTable
{
public:
    virtual __fastcall TCFbECustomTableEx(void);    // コンストラクタ（空キャッシュを作成
    virtual __fastcall TCFbECustomTableEx(TStringList* RowLabelList, TStringList* ColumnLabelList);    // 指定された行列を備えた空テーブルを作成
    virtual __fastcall TCFbECustomTableEx(TStringList* SourceCsvStringList);   // コンストラクタ
    __fastcall ~TCFbECustomTableEx();    // デストラクタ

//    virtual void __fastcall InitCache(void);    // キャッシュを初期化する

    virtual bool __fastcall Normalize(int TargetRowIndex, int TargetColumnIndex, double MaxValue, double MinValue);    // Normalize する
    virtual void __fastcall PartialNormalize(int ColumnIndex);      // Table の要素を部分的に Normalize する
    virtual void __fastcall Normalize(void);                        // Table の要素を Normalize する

    virtual bool __fastcall Standardize(int TargetRowIndex, int TargetColumnIndex, double AverageValue, double StdevValue);   // Standardize する
    virtual void __fastcall PartialStandardize(int ColumnIndex);    // Table の要素を部分的に Standardize する
    virtual void __fastcall Standardize(void);                      // Table の要素を Standardize する

    virtual void __fastcall Ordering(TList* SortedCellList);        // Ordering する
    virtual void __fastcall PartialOrdering(int ColumnIndex);       // Table の要素を部分的に Ordering する
    virtual void __fastcall Ordering(void);                         // Table の要素を Ordering する

    virtual void __fastcall PartialRowNormalize(int RowIndex);      // Table の要素を横方向に部分的に Normalize する
    virtual void __fastcall RowNormalize(void);                     // Table の要素を横方向に Normalize する
    virtual void __fastcall PartialRowStandardize(int RowIndex);    // Table の要素を横方向に部分的に Standardize する
    virtual void __fastcall RowStandardize(void);                   // Table の要素を横方向に Standardize する
    virtual void __fastcall PartialRowOrdering(int RowIndex);       // Table の要素を横方向に部分的に Ordering する
    virtual void __fastcall RowOrdering(void);                      // Table の要素を横方向に Ordering する

    virtual double __fastcall DisNormalize(int ColumnIndex, double NormalizedValue);    // ColumnIndex 列目の Normalize された値 NormalizedValue を DisNormalize して返す
    virtual double __fastcall DisStandardize(int ColumnIndex, double StandardizedValue);    // ColumnIndex 列目の Standardize された値 StandardizedValue を DisStandardize して返す
    virtual double __fastcall DisOrdering(int ColumnIndex, double Order, TDoubleDynArray& SortedOrders);    // ColumnIndex 列目の Ordering された値 Order を DisOrdering して返す

    virtual double __fastcall DisRowNormalize(int RowIndex, double RowNormalizedValue);    // RowIndex 列目の横方向に Normalize された値 RowNormalizedValue を DisRowNormalize して返す
    virtual double __fastcall DisRowStandardize(int RowIndex, double RowStandardizedValue);    // RowIndex 列目の横方向に Standardize された値 RowStandardizedValue を DisRowStandardize して返す
    virtual double __fastcall DisRowOrdering(int RowIndex, double RowOrder, TDoubleDynArray& SortedOrders);    // RowIndex 列目の横方向に Ordering された値 RowOrder を DisRowOrdering して返す

    virtual double __fastcall DisOrderingCommon(int Index, double Order, TDoubleDynArray& SortedOrders, TDoubleDynArray& SortedValues);    // DisOrdering と DisRowOrdering で使う共通の処理

    virtual double  __fastcall GetICFCoefficient(int j);    // j 列目の Inverse Case Frequency Coefficient を得る

    virtual double __fastcall GetMaxOfRow(int i);       // 行の最大値を返す．
    virtual double __fastcall GetMinOfRow(int i);       // 行の最小値を返す．
    virtual double __fastcall GetAverageOfRow(int i);   // 行の平均値を返す．
    virtual double __fastcall GetMedianOfRow(int i);    // 行の中間値を返す．
    virtual double __fastcall GetStdevOfRow(int i);     // 行の標準偏差を返す．
    virtual double __fastcall GetAveragedMultiplierOfRow(int BaseRowIndex, int ComparedRowIndex);   // ComparedRowIndex 番目の行の BaseRowIndex 番目の行に対する Averaged Multiplier を返す．
    virtual double __fastcall GetMedianOfMultiplierOfRow(int BaseRowIndex, int ComparedRowIndex);   // ComparedRowIndex 番目の行の BaseRowIndex 番目の行に対する Median of Multiplier を返す．

    virtual double __fastcall GetMaxOfColumn(int j);        // 列の最大値を返す．
    virtual double __fastcall GetMinOfColumn(int j);        // 列の最小値を返す．
    virtual double __fastcall GetAverageOfColumn(int j);    // 列の平均値を返す．
    virtual double __fastcall GetMedianOfColumn(int j);     // 列の中間値を返す．
    virtual double __fastcall GetStdevOfColumn(int j);      // 列の標準偏差を返す．
    virtual double __fastcall GetAveragedMultiplierOfColumn(int BaseColumnIndex, int ComparedColumnIndex);  // BaseColumnIndex 番目の列の ComparedColumnIndex 番目の列に対する Averaged Multiplier を返す．
    virtual double __fastcall GetMedianOfMultiplierOfColumn(int BaseColumnIndex, int ComparedColumnIndex);  // BaseColumnIndex 番目の列の ComparedColumnIndex 番目の列に対する Median of Multiplier を返す．

    // ChildCache を ChildCacheName という名前のキャッシュとして追加する
    virtual void __fastcall AddChildCache(TCFbECachedTable* ChildCache, const char* ChildCacheName, bool IsLinkedToParent);

    // ChildCacheName という名前のキャッシュを削除する
    virtual void __fastcall DeleteChildCache(const char* ChildCacheName);

protected:
    virtual TCFbECachedTable* __fastcall CreateClone(void) = 0;         // 自分自身のクローンを作成する
    virtual TCFbECachedTable* __fastcall CreateRotatedClone(void) = 0;  // 自分自身の行と列が入れ替わったクローンを作成する

    TCFbERowCachedTable*    MaxRowCache;
    TCFbERowCachedTable*    MinRowCache;
    TCFbERowCachedTable*    AverageRowCache;
    TCFbERowCachedTable*    MedianRowCache;
    TCFbERowCachedTable*    StdevRowCache;
    TCFbEColumnCachedTable* MaxColumnCache;
    TCFbEColumnCachedTable* MinColumnCache;
    TCFbEColumnCachedTable* AverageColumnCache;
    TCFbEColumnCachedTable* MedianColumnCache;
    TCFbEColumnCachedTable* StdevColumnCache;

private:

};
//---------------------------------------------------------------------------
#endif
