ROOT logo
// $Id: Glass_SKEL.cxx 2089 2008-11-23 20:31:03Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "ParametricSystem.h"
#include "ParametricSystem.c7"

#include "TMath.h"
#include <Glasses/ProductionRule.h>


// ParametricSystem

//______________________________________________________________________________
//
//

ClassImp(ParametricSystem);


void ParametricSystem::_init()
{}

ParametricSystem::ParametricSystem(const Text_t* n, const Text_t* t) :
ZNode(n, t),
mLevel(0),
mLineColor(1, 1, 0),
mRndWeight(0.0)
{
  _init();
  bUseDispList  = true;
}

ParametricSystem::~ParametricSystem()
{}

void
ParametricSystem::SetupNameMap()
{
  mNameMap.clear();
  
  ZVector &R = **(mRules);
  Int_t nRules = R.Size()+1; // children + non-reproductive characters
  
  // cache child name to rule idx
  AList::Stepper<ZGlass> ms(*mRules);
  Int_t idx = 0;
  while(ms.step())
    mNameMap[ms->GetName()[0]] = idx++;
  mNameMap[' '] = nRules-1; // space present any non reproductive character
}

int
ParametricSystem::EvalExpressionSize()
{
  static const Exc_t _eh("ParametricSystem::EvalExpressionSize ");
  
  ZVector &R = **(mRules);
  Int_t nRules = R.Size()+1; // children + non-reproductive characters
  
  // init matrix
  std::vector< std::vector<int> > prodMatrix(nRules);
  for (Int_t i = 0; i < nRules; ++i)
    prodMatrix[i].resize(nRules);
  
  // configure matrix
  AList::Stepper<ProductionRule> s(*mRules);
  Int_t ruleIdx = 0;
  while(s.step())
  {
    TString ruleString  = s->GetRule();
    for (int i = 0; i < ruleString.Length(); ++i)
    {
      NameMap_i it = mNameMap.find(ruleString[i]);
      if (it != mNameMap.end())
        prodMatrix[ruleIdx][it->second]++;
      else
        prodMatrix[ruleIdx][nRules-1]++;
    }
    ++ruleIdx;
  }
  
  // non-repoducable
  prodMatrix[nRules-1][nRules-1] = 1;
  
  // begin state
  std::vector<int> stateVec(nRules);
  for (int i=0; i< mStart.Length(); i++)
  {    
    NameMap_i it = mNameMap.find(mStart[i]);
    if (it != mNameMap.end())
      stateVec[it->second]++;
    else
      stateVec[nRules-1]++;
  }
  
  // get final state vector
  std::vector<int> newState(nRules);
  int level = 0;
  while (level < mLevel)
  {        
    // loop over rules
    for (int r = 0; r < nRules; ++r)
    {
      newState[r] = 0;
      for (int i = 0; i < nRules; ++i )
        newState[r] += stateVec[i] * prodMatrix[i][r];  
    }
    
    for (int i = 0; i < nRules; ++i)
    {
      stateVec[i] = newState[i];
    }
    ++level;
  }    
  
  // set final length
  int length = 0;
  for (int i = 0; i< nRules; ++i)
    length += stateVec[i];
  ISdebug(1, _eh + GForm("size %d for level %d \n", length, mLevel));
  
  return length;
}

void
ParametricSystem::ExpandExpression(Segments_t& oldExp, Segments_t& newExp, int level)
{
  ZVector &R = **(mRules);
  for (Segments_i seg = oldExp.begin(); seg != oldExp.end(); ++seg)
  {
    NameMap_i it  = mNameMap.find((*seg).mType);
    if (it != mNameMap.end())
    {
      ProductionRule* pr = static_cast<ProductionRule*>(R[it->second]);
      TString rule = pr->GetRule(); 
      ExpandRule(pr->GetRule(), *seg, newExp);
    }
    else 
    { 
      newExp.push_back(*seg);
    }
  }
  
  if (level < mLevel)
  {
    oldExp.swap(newExp);
    newExp.clear();
    ExpandExpression(oldExp, newExp, ++level);  
  }
}

void
ParametricSystem::Produce()
{
  // free memory
  mExpression.clear();
  
  // eval memory usage, reserve space
  SetupNameMap();
  int l = EvalExpressionSize();
  mExpression.reserve(l);
  Segments_t refExp;
  refExp.reserve(l);
  
  InitialiseExpression();
  
  // create starting expresion from start rule and init paramters
  
  ExpandExpression(mExpression, refExp, 1);
  mExpression.swap(refExp);
  refExp.clear();
}

void ParametricSystem::DumpInfo()  
{
   printf("Expression[%d]: \n", (int)mExpression.size());
   for (Segments_i i = mExpression.begin(); i != mExpression.end(); ++i)
   {
      printf("%c", (*i).mType);
   }      
   printf(" \n");
}
 ParametricSystem.cxx:1
 ParametricSystem.cxx:2
 ParametricSystem.cxx:3
 ParametricSystem.cxx:4
 ParametricSystem.cxx:5
 ParametricSystem.cxx:6
 ParametricSystem.cxx:7
 ParametricSystem.cxx:8
 ParametricSystem.cxx:9
 ParametricSystem.cxx:10
 ParametricSystem.cxx:11
 ParametricSystem.cxx:12
 ParametricSystem.cxx:13
 ParametricSystem.cxx:14
 ParametricSystem.cxx:15
 ParametricSystem.cxx:16
 ParametricSystem.cxx:17
 ParametricSystem.cxx:18
 ParametricSystem.cxx:19
 ParametricSystem.cxx:20
 ParametricSystem.cxx:21
 ParametricSystem.cxx:22
 ParametricSystem.cxx:23
 ParametricSystem.cxx:24
 ParametricSystem.cxx:25
 ParametricSystem.cxx:26
 ParametricSystem.cxx:27
 ParametricSystem.cxx:28
 ParametricSystem.cxx:29
 ParametricSystem.cxx:30
 ParametricSystem.cxx:31
 ParametricSystem.cxx:32
 ParametricSystem.cxx:33
 ParametricSystem.cxx:34
 ParametricSystem.cxx:35
 ParametricSystem.cxx:36
 ParametricSystem.cxx:37
 ParametricSystem.cxx:38
 ParametricSystem.cxx:39
 ParametricSystem.cxx:40
 ParametricSystem.cxx:41
 ParametricSystem.cxx:42
 ParametricSystem.cxx:43
 ParametricSystem.cxx:44
 ParametricSystem.cxx:45
 ParametricSystem.cxx:46
 ParametricSystem.cxx:47
 ParametricSystem.cxx:48
 ParametricSystem.cxx:49
 ParametricSystem.cxx:50
 ParametricSystem.cxx:51
 ParametricSystem.cxx:52
 ParametricSystem.cxx:53
 ParametricSystem.cxx:54
 ParametricSystem.cxx:55
 ParametricSystem.cxx:56
 ParametricSystem.cxx:57
 ParametricSystem.cxx:58
 ParametricSystem.cxx:59
 ParametricSystem.cxx:60
 ParametricSystem.cxx:61
 ParametricSystem.cxx:62
 ParametricSystem.cxx:63
 ParametricSystem.cxx:64
 ParametricSystem.cxx:65
 ParametricSystem.cxx:66
 ParametricSystem.cxx:67
 ParametricSystem.cxx:68
 ParametricSystem.cxx:69
 ParametricSystem.cxx:70
 ParametricSystem.cxx:71
 ParametricSystem.cxx:72
 ParametricSystem.cxx:73
 ParametricSystem.cxx:74
 ParametricSystem.cxx:75
 ParametricSystem.cxx:76
 ParametricSystem.cxx:77
 ParametricSystem.cxx:78
 ParametricSystem.cxx:79
 ParametricSystem.cxx:80
 ParametricSystem.cxx:81
 ParametricSystem.cxx:82
 ParametricSystem.cxx:83
 ParametricSystem.cxx:84
 ParametricSystem.cxx:85
 ParametricSystem.cxx:86
 ParametricSystem.cxx:87
 ParametricSystem.cxx:88
 ParametricSystem.cxx:89
 ParametricSystem.cxx:90
 ParametricSystem.cxx:91
 ParametricSystem.cxx:92
 ParametricSystem.cxx:93
 ParametricSystem.cxx:94
 ParametricSystem.cxx:95
 ParametricSystem.cxx:96
 ParametricSystem.cxx:97
 ParametricSystem.cxx:98
 ParametricSystem.cxx:99
 ParametricSystem.cxx:100
 ParametricSystem.cxx:101
 ParametricSystem.cxx:102
 ParametricSystem.cxx:103
 ParametricSystem.cxx:104
 ParametricSystem.cxx:105
 ParametricSystem.cxx:106
 ParametricSystem.cxx:107
 ParametricSystem.cxx:108
 ParametricSystem.cxx:109
 ParametricSystem.cxx:110
 ParametricSystem.cxx:111
 ParametricSystem.cxx:112
 ParametricSystem.cxx:113
 ParametricSystem.cxx:114
 ParametricSystem.cxx:115
 ParametricSystem.cxx:116
 ParametricSystem.cxx:117
 ParametricSystem.cxx:118
 ParametricSystem.cxx:119
 ParametricSystem.cxx:120
 ParametricSystem.cxx:121
 ParametricSystem.cxx:122
 ParametricSystem.cxx:123
 ParametricSystem.cxx:124
 ParametricSystem.cxx:125
 ParametricSystem.cxx:126
 ParametricSystem.cxx:127
 ParametricSystem.cxx:128
 ParametricSystem.cxx:129
 ParametricSystem.cxx:130
 ParametricSystem.cxx:131
 ParametricSystem.cxx:132
 ParametricSystem.cxx:133
 ParametricSystem.cxx:134
 ParametricSystem.cxx:135
 ParametricSystem.cxx:136
 ParametricSystem.cxx:137
 ParametricSystem.cxx:138
 ParametricSystem.cxx:139
 ParametricSystem.cxx:140
 ParametricSystem.cxx:141
 ParametricSystem.cxx:142
 ParametricSystem.cxx:143
 ParametricSystem.cxx:144
 ParametricSystem.cxx:145
 ParametricSystem.cxx:146
 ParametricSystem.cxx:147
 ParametricSystem.cxx:148
 ParametricSystem.cxx:149
 ParametricSystem.cxx:150
 ParametricSystem.cxx:151
 ParametricSystem.cxx:152
 ParametricSystem.cxx:153
 ParametricSystem.cxx:154
 ParametricSystem.cxx:155
 ParametricSystem.cxx:156
 ParametricSystem.cxx:157
 ParametricSystem.cxx:158
 ParametricSystem.cxx:159
 ParametricSystem.cxx:160
 ParametricSystem.cxx:161
 ParametricSystem.cxx:162
 ParametricSystem.cxx:163
 ParametricSystem.cxx:164
 ParametricSystem.cxx:165
 ParametricSystem.cxx:166
 ParametricSystem.cxx:167
 ParametricSystem.cxx:168
 ParametricSystem.cxx:169
 ParametricSystem.cxx:170
 ParametricSystem.cxx:171
 ParametricSystem.cxx:172
 ParametricSystem.cxx:173
 ParametricSystem.cxx:174
 ParametricSystem.cxx:175
 ParametricSystem.cxx:176
 ParametricSystem.cxx:177
 ParametricSystem.cxx:178
 ParametricSystem.cxx:179
 ParametricSystem.cxx:180
 ParametricSystem.cxx:181
 ParametricSystem.cxx:182
 ParametricSystem.cxx:183
 ParametricSystem.cxx:184
 ParametricSystem.cxx:185