/*
    TCFbEDataSet.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 TCFbEDataSetH
#define TCFbEDataSetH
//---------------------------------------------------------------------------
// #include "Maprof.h"

#include "math.h"
#include "TCFbEToolkit.h"
#include "TCFbETable.h"
#include "TCFbECell.h"
#include "TCFbENeighbor.h"

class TCFbESimilarityComputationAlgorithm;
#include "TCFbESimilarityComputationAlgorithm.h"

class TCFbEPredictionAlgorithm;
#include "TCFbEPredictionAlgorithm.h"
//---------------------------------------------------------------------------
// 準備されている値
enum TCFbEValueBase { vbUnknown, vbValue, vbStandardizedValue, vbNormalizedValue, vbOrder, vbDoubleStandardizedValue, vbDoubleNormalizedValue, vbDoubleOrder };

// 何ベースのアルゴリズムか（abUnknown なら abRow と同様だとみなす
enum TCFbEAlgorithmBase { abUnknown, abRow, abColumn };
//---------------------------------------------------------------------------
// Facade 的なクラス
class TCFbEDataSet : public TObject
{
public:
    __property double        Values[AnsiString RowLabel][AnsiString ColumnLabel]    = { read=GetValues, write=SetValues };    // データ要素を保持する 2 次元配列
    __property double        ValuesByIndex[int RowIndex][int ColumnIndex]        = { read=GetValuesByIndex, write=SetValuesByIndex };
    __property bool            Enabled[AnsiString RowLabel][AnsiString ColumnLabel]= { read=GetEnabled, write=SetEnabled };
    __property bool            EnabledByIndex[int RowIndex][int ColumnIndex]        = { read=GetEnabledByIndex, write=SetEnabledByIndex };
    __property int            NumberOfRows    = { read=GetNumberOfRows };
    __property int            NumberOfColumns    = { read=GetNumberOfColumns };
    __property TStringList*    RowLabelList    = { read=GetRowLabelList };
    __property TStringList*    ColumnLabelList    = { read=GetColumnLabelList };

    __property TCFbETable*    SimilarityComputationTable = { read=GetSimilarityComputationTable };
    __property TCFbETable*    PredictionTable    = { read=GetPredictionTable };

    __property TCFbEValueBase                        ValueBase        = { read=FValueBase };
    __property TCFbEAlgorithmBase                    AlgorithmBase    = { read=FAlgorithmBase };
    __property TCFbESimilarityComputationAlgorithm*    SimilarityComputationAlgorithm    = { read=FSimilarityComputationAlgorithm };
    __property TCFbEPredictionAlgorithm*            PredictionAlgorithm                = { read=FPredictionAlgorithm };
    __property int            NeighborhoodSize    = { read=FNeighborhoodSize };
    __property bool            DefaultValueEnabled    = { read=FDefaultValueEnabled };
    __property double        DefaultValue        = { read=FDefaultValue };
    __property bool            InverseCaszzeFrequencyEnabled    = { read=FInverseCaseFrequencyEnabled };
    __property double        CaseAmplifier        = { read=FCaseAmplifier };

    __property double        Similarities[AnsiString TargetRowLabel][AnsiString ComparedRowLabel] = { read=GetSimilarities };
    __property double        SimilaritiesByIndex[int TargetRowIndex][int ComparedRowIndex] = { read=GetSimilaritiesByIndex };

    __property double        PredictedValues[AnsiString TargetRowLabel][AnsiString TargetColumnLabel] = { read=GetPredictedValues };
    __property double        PredictedValuesByIndex[int TargetRowIndex][int TargetColumnIndex] = { read=GetPredictedValuesByIndex };

    virtual    __fastcall TCFbEDataSet(void);    // コンストラクタ
    virtual    __fastcall TCFbEDataSet(TStringList* SourceCsvStringList);    // コンストラクタ
    __fastcall    ~TCFbEDataSet();    // デストラクタ

    virtual void    __fastcall PrepareCF(TCFbEValueBase ValueBase, TCFbEAlgorithmBase AlgorithmBase, TCFbESimilarityComputationAlgorithm* SimilarityComputationAlgorithm, TCFbEPredictionAlgorithm* PredictionAlgorithm, int NeighborhoodSize, bool DefaultValueEnabled, double DefaultValue, bool InverseCaseFrequencyEnabled, double CaseAmplifier);    // CF の準備を行う（PredictionTable を準備する
    virtual void    __fastcall TemporaryUnable(int TargetRowIndex, int TargetColumnIndex);    // TargetRowIndex, TargetColumnIndex のセルを一時的に Enabled = false にする
    virtual void    __fastcall RecoverEnabled(void);    // 一時的に Enabled = false にしていたセルを元にもどす

    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 UpdateRow(TCFbEDataSet* DataSet, int RowIndex);    // DataSet の RowIndex 行目を更新する
    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 GetICFCoefficient(int j);    // j 列目の Inverse Case Frequency Coefficient を得る
    virtual void     __fastcall GetNearestNeighbors(int TargetRowIndex, int TargetColumnIndex, int NeighborhoodSize, TObjectList* NeighborList);    // TargetRowIndex に対する NearestNeigobors を調べる

    virtual void     __fastcall FillColumns(TCFbEDataSet* BaseDataSet);    // BaseDataSet にあって，this にない列を新たな列として追加する
    virtual bool    __fastcall IsConsistentWith(TCFbEDataSet* TargetDataSet);    // TargetDataSet と首尾一貫性があるかどうかを調べる

    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);    // ColumnIndex 列目の Ordering された値 Order を DisOrdering して返す
    virtual double    __fastcall DisDoubleNormalize(int RowIndex, int ColumnIndex, double DoubleNormalizedValue);    // RowIndex 行目，ColumnIndex 列目の DoubleNormalize された値 DoubleNormalizedValue を DisDoubleNormalize して返す
    virtual double    __fastcall DisDoubleStandardize(int RowIndex, int ColumnIndex, double DoubleStandardizedValue);    // RowIndex 行目，ColumnIndex 列目の DoubleStandardize された値 DoubleStandardizedValue を DisDoubleStandardize して返す
    virtual double    __fastcall DisDoubleOrdering(int RowIndex, int ColumnIndex, double DoubleOrder);    // RowIndex 行目，ColumnIndex 列目の DoubleOrdering された値 DoubleOrder を DisDoubleOrdering して返す

protected:
    TCFbEValueBase        FValueBase;
    TCFbEAlgorithmBase    FAlgorithmBase;
    TCFbETable*            FSourceTable;
    TCFbETable*            FSimilarityComputationTable;
    TCFbETable*         FPredictionMediateTable;
    TCFbETable*            FPredictionTable;
    bool                FAppliedTableArePrepared;
    TCFbESimilarityComputationAlgorithm*    FSimilarityComputationAlgorithm;
    TCFbEPredictionAlgorithm*                FPredictionAlgorithm;
    int                    FNeighborhoodSize;
    bool                FDefaultValueEnabled;
    double                FDefaultValue;
    bool                FInverseCaseFrequencyEnabled;
    double                FCaseAmplifier;
    TObjectList*        FSimilarityList;
    int                    TargetRowIndexOfSimilarity;
    TObjectList*        FPredictedValueList;
    int                    TargetRowIndexOfPrediction;
    int                    TemporaryUnableRowIndex;
    int                    TemporaryUnableColumnIndex;

    virtual double    __fastcall GetValues(AnsiString RowLabel, AnsiString ColumnLabel);
    virtual void    __fastcall SetValues(AnsiString RowLabel, AnsiString ColumnLabel, double Value);
    virtual double    __fastcall GetValuesByIndex(int RowIndex, int ColumnIndex);
    virtual void    __fastcall SetValuesByIndex(int RowIndex, int ColumnIndex, double Value);
    virtual bool    __fastcall GetEnabled(AnsiString RowLabel, AnsiString ColumnLabel);
    virtual void    __fastcall SetEnabled(AnsiString RowLabel, AnsiString ColumnLabel, bool Value);
    virtual bool    __fastcall GetEnabledByIndex(int RowIndex, int ColumnIndex);
    virtual void    __fastcall SetEnabledByIndex(int RowIndex, int ColumnIndex, bool Value);
    virtual int        __fastcall GetNumberOfRows(void);
    virtual int     __fastcall GetNumberOfColumns(void);
    virtual TStringList*    __fastcall GetRowLabelList(void);
    virtual TStringList*    __fastcall GetColumnLabelList(void);

    virtual TCFbETable*        __fastcall GetSimilarityComputationTable(void);
    virtual TCFbETable*        __fastcall GetPredictionTable(void);

    virtual double    __fastcall GetSimilarities(AnsiString TargetRowLabel, AnsiString ComparedRowLabel);
    virtual double    __fastcall GetSimilaritiesByIndex(int TargetRowIndex, int ComparedRowIndex);
    virtual double    __fastcall GetPredictedValues(AnsiString TargetRowLabel, AnsiString TargetColumnLabel);
    virtual double    __fastcall GetPredictedValuesByIndex(int TargetRowIndex, int TargetColumnIndex);

    virtual void    __fastcall IsUpdated(void);    // アップデートされたことをマークし，キャッシュをクリアする

    virtual void __fastcall CsvToStrings2(char* str, TStrings *List);    // CSV形式の文字列をTStringsに分解する
    
private:

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