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 "Weed.h"
#include "Weed.c7"
#include "TMath.h"
#include <Glasses/ProductionRule.h>

// Weed

//______________________________________________________________________________
//
//

ClassImp(Weed);

//==============================================================================

void Weed::_init()
{
  bUseDispList = true;
}

Weed::Weed(const Text_t* n, const Text_t* t) :
ZNode(n, t),
mExpression(0),
mLength(0),
mLevel(0),
mAngle(TMath::PiOver2()),
mLineColor(1, 1, 0),
mLeafColor(1, 0, 1),
mFlowerColor(1, 1, 1)
{
  _init();
}

Weed::~Weed()
{}

//==============================================================================

char* Weed::ExpandString(char* oldExp, int oldSize, char* newExp, int level)
{
  ZVector &R = **(mRules);   
  int newIdx = 0;
  for (int i = 0; i < oldSize; ++i)
  {
    NameMap_i it  = mNameMap.find(oldExp[i]);
    if (it != mNameMap.end())
    {
      ProductionRule* pr = static_cast<ProductionRule*>(R[it->second]);
      TString rule = pr->GetRule(); 
      for (int k = 0; k < rule.Length(); ++k)
      {
        newExp[newIdx] = rule[k];
        ++newIdx;
      } 
    }
    else { 
      newExp[newIdx] = oldExp[i];
      ++newIdx;
    }
  }
  
  char* res = newExp;
  
  if (level < mLevel)
  {
    res = ExpandString(newExp, newIdx, oldExp, ++level);
  }

  return res;
}

//-------------------------------------------------------------------------------

void Weed::Produce()
{
  static const Exc_t _eh("Weed_GL_Rnr::Triangulate ");
  mNameMap.clear();
  
  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);
  
  // 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
  
  // 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;
  
  if (gDebug > 1)
  {
    ISdebug(1, _eh + "printing production matrix ...");
    for (int i=0; i<nRules; i++)
    {
      printf("rule %d:", i);
      for (int k =0; k<nRules; k++)
        printf("%d ", prodMatrix[i][k]);
      printf("\n");
    }
  }
  
  // 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]++;
  }
  
  if (gDebug > 1)
  {
    ISdebug(1, _eh +"printing begin state vector ...");
    for (int i = 0; i < nRules; i++)
      printf("%d ", stateVec[i]);
    printf("\n");
  }
  
  // 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
  mLength = 0;
  for (int i = 0; i< nRules; ++i)
    mLength += stateVec[i];
  ISdebug(1, _eh + GForm("size %d for level %d \n", mLength, mLevel));
  
  // free memory
  delete [] mExpression;
  mExpression = 0;
  
  char* oldExp = new char[mLength]; // TODO one less than one iteraton
  char* newExp = new char[mLength];
  strcpy(oldExp, mStart.Data());
  char* res = ExpandString(oldExp,  mStart.Length(), newExp, 1);
  if (res == newExp)
    delete [] oldExp;
  else
    delete [] newExp;
  
  mExpression = res;
}


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