/*
    TCFbETable.h    June 6, 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 TCFbETableH
#define TCFbETableH
//---------------------------------------------------------------------------
#include <System.hpp>
#include <Classes.hpp>
#include <Contnrs.hpp>

// #include "Maprof.h"

#include "TCFbECell.h"
#include "TCFbEToolkit.h"
//---------------------------------------------------------------------------
class TCFbETable : public TObject
{
public:
    __property int NumberOfRows = { read=GetNumberOfRows };
    __property int NumberOfColumns = { read=GetNumberOfColumns };
    __property TCFbECell* Cells[AnsiString RowLabal][AnsiString ColumnLabel] = { read=GetCells, write=SetCells };    // テーブルの要素を保持する 2 次元配列
    __property TCFbECell* CellsByIndex[int RowIndex][int ColumnIndex] = { read=GetCellsByIndex, write=SetCellsByIndex };

    TStringList* RowLabelList;
    TStringList* ColumnLabelList;

    virtual __fastcall TCFbETable(void);    // コンストラクタ（空のテーブルを作成
    virtual __fastcall TCFbETable(TStringList* RowLabelList, TStringList* ColumnLabelList);    // 指定された行列を備えた空テーブルを作成
    __fastcall ~TCFbETable();    // デストラクタ

    virtual void __fastcall Assign(TCFbETable* SourceTable);    // SourceTable の各要素をコピーする
    virtual void __fastcall AssignWithTurn(TCFbETable* SourceTable);    // SourceTable の各要素の行と列を入替えてコピーする

    virtual void __fastcall Normalize(void);    // Table の要素を Normalize する
    virtual void __fastcall Standardize(void);    // Table の要素を Standardize する
    virtual void __fastcall Ordering(void);    // Table の要素を Ordering する

    virtual void __fastcall RowNormalize(void);    // Table の要素を横方向に Normalize する
    virtual void __fastcall RowStandardize(void);    // Table の要素を横方向に Standardize する
    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 void __fastcall AddValue(AnsiString RowLabel, AnsiString ColumnLabel, double Value);    // RowLabel, ColumnLabel のセルの値に Value を加算する
    virtual void __fastcall UpdateValue(AnsiString RowLabel, AnsiString ColumnLabel, double Value);    // RowLabel, ColumnLabel のセルの値を Value に更新する
    virtual void __fastcall DeleteValue(AnsiString RowLabel, AnsiString ColumnLabel);    // RowLabel, ColumnLabel のセルを削除する（Enabled = false にする

    virtual int __fastcall AddRow(AnsiString RowLabel);    // 行を追加する．
    virtual void __fastcall DeleteRow(AnsiString RowLabel);    // 行を削除する．
    virtual void __fastcall AddRowElements(AnsiString RowLabel, TStringList* ColumnLabelList, TDoubleDynArray& Values);    // 行の各要素を加算する．要素は ColumnLabelList で指定された順に Values に格納される．
    virtual void __fastcall UpdateRowElements(AnsiString RowLabel, TStringList* ColumnLabelList, TDoubleDynArray& Values);    // 行の各要素を更新する．要素は ColumnLabelList で指定された順に Values に格納される．
    virtual void __fastcall DeleteRowElements(AnsiString RowLabel, TStringList* ColumnLabelList);    // 行の指定要素の Enabled を false にする．要素は ColumnLabelList で指定される．行自体の削除は行わない．

    virtual int __fastcall AddColumn(AnsiString ColumnLabel);    // 列を追加する．
    virtual void __fastcall DeleteColumn(AnsiString ColumnLabel);    // 列を削除する．
    virtual void __fastcall AddColumnElements(AnsiString ColumnLabel, TStringList* RowLabelList, TDoubleDynArray& Values);    // 列の各要素を加算する．要素は RowLabelList で指定された順に Values に格納される．
    virtual void __fastcall UpdateColumnElements(AnsiString ColumnLabel, TStringList* RowLabelList, TDoubleDynArray& Values);    // 列の各要素を更新する．要素は RowLabelList で指定された順に Values に格納される．
    virtual void __fastcall DeleteColumnElements(AnsiString ColumnLabel, TStringList* RowLabelList);    // 列の指定要素の Enabled を false にする．要素は RowLabelList で指定される．列自体の削除は行わない．

    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 GetInversedDistanceOfRow(int BaseRowIndex, int ComparedRowIndex);    // ComparedRowIndex 番目の行の BaseRowIndex 番目の行に対する Inversed Distance を返す．
    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 GetWeightedMultiplierOfRow(int BaseRowIndex, int ComparedRowIndex, int BaseColumnIndex);    // BaseColumnIndex 番目の列に関する ComparedRowIndex 番目の行の BaseRowIndex 番目の行に対する Weighted 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 GetInversedDistanceOfColumn(int BaseColumnIndex, int ComparedColumnIndex);    // BaseColumnIndex 番目の列の ComparedColumnIndex 番目の列に対する Inversed Distance を返す．
    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 を返す．
    virtual double __fastcall GetWeightedMultiplierOfColumn(int BaseColumnIndex, int ComparedColumnIndex, int BaseRowIndex);    // BaseRowIndex 番目の行に関する BaseColumnIndex 番目の列の ComparedColumnIndex 番目の列に対する Weighted Multiplier を返す．
    virtual int    __fastcall GetEnabledCountOfColumn(int j);    // 列で Enabled なセルの数を返す

    virtual void __fastcall GetBothEnableSortedCellList(int TargetRowIndex, int ComparedRowIndex, TList* TargetSortedCellList, TList* ComparedSortedCellList);    // TargetRowIndex 行目と ComparedRowIndex 行目で共通して Enabled な要素をソートし，TargetSortedCellList と　ComparedSortedCellList にそれぞれ入れて返す（RankCorrelation で使われる

    virtual void __fastcall RowIsUpdated(int RowIndex);
    virtual int __fastcall RowIsUpdated(AnsiString RowLabel);
    virtual void __fastcall ColumnIsUpdated(int  ColumnIndex);
    virtual int __fastcall ColumnIsUpdated(AnsiString ColumnLabel);

    virtual void __fastcall GetSortedCellListOfRow(int RowIndex, TList* SortedCellList);    // RowIndex 番目の行の Enabled な要素をソートし，SortedCellList に入れて返す
    virtual void __fastcall GetSortedCellListOfColumn(int ColumnIndex, TList* SortedCellList);    // ColumnIndex 番目の列の Enabled な要素をソートし，SortedCellList に入れて返す

protected:
    virtual int __fastcall GetNumberOfRows(void) { return this->RowLabelList->Count; }
    virtual int __fastcall GetNumberOfColumns(void) { return this->ColumnLabelList->Count; }
    virtual TCFbECell* __fastcall GetCells(AnsiString RowLabel, AnsiString ColumnLabel);
    virtual void __fastcall SetCells(AnsiString RowLabel, AnsiString ColumnLabel, TCFbECell* Cell);
    virtual TCFbECell* __fastcall GetCellsByIndex(int RowIndex, int ColumnIndex);
    virtual void __fastcall SetCellsByIndex(int RowIndex, int ColumnIndex, TCFbECell* Cell);

    virtual void __fastcall GetEnabledCellsInRow(int RowIndex, TDoubleDynArray& DynArray);    // RowIndex 番目の行の Enabled な要素を DynArray に入れて返す
    virtual void __fastcall GetEnabledCellsInColumn(int ColumnIndex, TDoubleDynArray& DynArray);    // ColumnIndex 番目の列の Enabled な要素を DynArray に入れて返す

    TObjectList* RowList;
    TObjectList* MaxOfRowList;
    TObjectList* MinOfRowList;
    TObjectList* AverageOfRowList;
    TObjectList* MedianOfRowList;
    TObjectList* StdevOfRowList;
    TObjectList* InversedDistanceOfRowList;
    TList* CachedBaseRowListForID;

    TObjectList* MaxOfColumnList;
    TObjectList* MinOfColumnList;
    TObjectList* AverageOfColumnList;
    TObjectList* MedianOfColumnList;
    TObjectList* StdevOfColumnList;
    TObjectList* InversedDistanceOfColumnList;
    TList* CachedBaseColumnListForID;

private:

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