 
        
        
          Добавил:
          
          
        
        
    
            Studfiles2
            
            
            
            
            
            Опубликованный материал нарушает ваши авторские права? Сообщите нам.
          
          Вуз:
          Предмет:
          Файл:Инструментарий для выполнения лабораторных работ / Sampler_new / Samp16 / SDATA
.CPP/* -------------------------------------------------------------------- */
/*                                                                      */
/* FILE : sdata.h                                                       */
/*                                                                      */
/* DESC : Sampler data definition.                                      */
/*                                                                      */
/* PROJ : CSA\sampler                                                   */
/*                                                                      */
/* CREATED  16.02.98 19:28    by L&M.                                   */
/* MODIFIED 03.02.99 15:49    by A.V.                                   */
/*                                                                      */
/*                                                                      */
/*                                     1995-98 (c) by Leonid Moiseichuk */
/* -------------------------------------------------------------------- */
/* ==========================[ includes ]============================== */
#include "SData.h"
#ifndef __LIMITS_H
#include <Limits.h>
#endif
#pragma hdrstop
#include <iostream.h>
#ifndef __STDLIB_H
#include <StdLib.h>
#endif
/* ===========================[ methods ]============================== */
static void WriteLine(FILE* Stream, int nStrips = 78)
{
   fprintf( Stream, "\n" );
   for ( int index=0; index<nStrips; index++ ) fprintf( Stream,"-" );
   fprintf( Stream, "\n" );
} // WriteLine
/* --- Class FileMgr --- */
FileHandle FileMgr :: HandleOf( PChar aName )
{
   for ( FileHandle index=0; index<Counter; index++ )
      if ( strcmp(Files[index],aName)==0 ) return index+1 ;
   if ( Counter<MAX_FILES )
   {
      strcpy( Files[ Counter++ ],aName );
      return Counter;
   }
   else return 0;
}  // HandleOf
void FileMgr :: Print( FILE* Stream ) const
{
   fprintf( Stream,"\n\n\t\t‘ЇЁб®Є ®Ўа Ў®в ле д ©«®ў.\n" );
   WriteLine( Stream );
   fprintf( Stream," %4s            %s","NN","€¬п ®Ўа Ў®в ®Ј® д ©« " );
   WriteLine( Stream );
   for ( uint index=0; index<Counter; index++ )
   {
      if (index) fprintf( Stream,"\n" );
      fprintf( Stream,"  %2u.\t%s",index+1,Files[index] );
   }
   WriteLine( Stream );
} // Print
void FileMgr :: Put( FILE* Stream ) const
{
   fwrite (&Counter,sizeof(Counter),1,Stream);
   for (uint i = 0; i < Counter; i++)
   {
      fwrite (Files+i,MAXPATH,1,Stream);
   }
}
void FileMgr :: Get( FILE* Stream )
{
   fread (&Counter,sizeof(Counter),1,Stream);
   for (uint i = 0; i < Counter; i++)
   {
      fread (Files+i,MAXPATH,1,Stream);
   }
}
/* --- Class Sample List --- */
/*void SamplerList ::LoadArc(uchar idx, float ProbVal) {
	Conditions[idx].Prob = ProbVal;
	for (uint k = 0; k<SubCounter; k++)
	 if ( (*SubEntriesPtr)[k]->FileID() == Conditions[idx].FileID() &&
	      (*SubEntriesPtr)[k]->LineNo() == Conditions[idx].LineNo() )
	 {  (*SubEntriesPtr)[k]->Prob = ProbVal; break; }
}*/
SumOfInProbsInfo SamplerList::SumOfInProbs() {
 float res = 0;
 int CrsTimes = 0;
 for (uchar k=0; k<SubCounter; k++)
  if ( (*SubEntriesPtr)[k]->Count() )
   for (uchar n=0; n < (*SubEntriesPtr)[k]->Count() ; n++)
    if ( (*SubEntriesPtr)[k]->CondOf(n)->FileID() == FileID() &&
	 (*SubEntriesPtr)[k]->CondOf(n)->LineNo() == LineNo() )
    { if ( !(*SubEntriesPtr)[k]->CondOf(n)->Prob )
       CrsTimes += !(*SubEntriesPtr)[k]->CondOf(n)->CrossTimes;
      res += (*SubEntriesPtr)[k]->CondOf(n)->Prob; break; }
 SumOfInProbsInfo tmp;
 tmp.Prob = res;
 tmp.CrossTimes = CrsTimes;
 return tmp;
};
void SamplerList :: Append( const SamplerRecord& rec )
{
   for ( uchar index=0; index<Counter && !(Conditions[index] == rec) ; index++ ) ;
   if ( index==Counter )
   {
      if ( Counter==MAX_CONDS ) return ;
      Counter ++ ;
   }
   Conditions[ index ] += rec ;
} // Append
void SamplerList :: Print( FILE* Stream, TIME ttime, Tscl Scale) const
{
   if (Counter)
   {
      WriteLine(Stream);
      for (uchar index=0; index<Counter; index++ )
      {
	 if (index) fprintf( Stream,"\n" );
	 Locate::Print(Stream);
	 fprintf( Stream," " );
	 Conditions[ index ].Print(Stream, ttime, Scale);
      }
   }
} // Print
void SamplerList :: Put( FILE* Stream ) const
{
   Locate :: Put (Stream);
   fwrite (&Counter,sizeof(Counter),1,Stream);
   for (uint i = 0; i < Counter; i++)
   {
      Conditions[i].Put (Stream);
   }
}
void SamplerList :: Get( FILE* Stream )
{
   Locate :: Get (Stream);
   fread (&Counter,sizeof(Counter),1,Stream);
   for (uint i = 0; i < Counter; i++)
   {
      Conditions[i].Get (Stream);
   }
}
/* --- Class Access --- */
static void SetProb(SamplerList* Entry) { //IV
  if ( !Entry->Count() ) return;
  SumOfInProbsInfo TempProb;
  TempProb.Prob = 1;
  //the first node has only one outgoing arc
  if (Entry->InArcs == 0) { Entry->CondOf(0)->Prob = 1; }
  else {
    TempProb = Entry->SumOfInProbs();
    if (!TempProb.Prob) return; //Entry musn't be processed in this brunch
    if (Entry->InArcs == 1) {
       long Total = 0;
      //fork, the prob. of the outgoing arc depends on the sum of entering arcs
       for (uchar p=0; p<Entry->Count(); p++)
	Total += Entry->CondOf(p)->CrossTimes;
       for (p=0; p<Entry->Count(); p++)
	Entry->CondOf(p)->Prob = Entry->CondOf(p)->CrossTimes/Total*TempProb.Prob;
    } //InArcs == 1
    if (Entry->InArcs == 2) {
       //it is the last node in simple loop
      if (Entry->Count() == 1)
      {
	if (!TempProb.CrossTimes) { Entry->CondOf(0)->Prob = TempProb.Prob; }
	else{
	}
      }
    }
  }; //else
  Entry->Prob = TempProb.Prob;
  //set recursion for outgoing arcs
 for (uchar n=0; n<Entry->Count(); n++)
  for (uint k = 0; k<Entry->SubCounter; k++)
   if ( (*Entry->SubEntriesPtr)[k]->FileID() == Entry->CondOf(n)->FileID() &&
	(*Entry->SubEntriesPtr)[k]->LineNo() == Entry->CondOf(n)->LineNo() )
   { if ( !(*Entry->SubEntriesPtr)[k]->Prob )
      SetProb( (*Entry->SubEntriesPtr)[k] ); break; }
}
void Access ::MapProbs() {           //IV
  //SubEntriesPtr and SubCounter in Entries[i] must be initialized
  for (uchar k=0; k<Counter; k++) {
   Entries[k]->SubCounter = Counter;
   Entries[k]->SubEntriesPtr = &Entries;
   //every Entries[i] must know the number of InArcs
   if ( Entries[k]->Count() )
    for (uchar n=0; n<Entries[k]->Count(); n++)
     for (uchar t=0; t<Counter; t++)
      if ( Entries[k]->CondOf(n)->LineNo() == Entries[t]->LineNo() &&
	   Entries[k]->CondOf(n)->FileID() == Entries[t]->FileID() )
      {  Entries[t]->InArcs++; break; }
  }
 //  SetProb(Entries[0]);
};
SamplerList* Access :: Search( const Locate& aSample ) const
{
   uint lower = 0;
   uint upper = Counter - 1;
   if( Counter > 0 )
   {
      while( lower < upper && upper!=UINT_MAX )
      {
         uint middle( (lower+upper)>>1 );
         SamplerList* Current( Entries[middle] );
         if( *Current == aSample ) return Current;
         if( *Current <  aSample ) lower = middle+1;
         else upper = middle-1;
      }
   }
   return ( lower == upper && *(Entries[lower]) == aSample)? Entries[lower] : NULL;
} // Search
SamplerList* Access :: Search( const FileHandle nFile, const uint nLine, uint& idx) const
{
   uint lower = 0;
   uint upper = Counter - 1;
   Locate aSample ( nFile, nLine );
   if( Counter > 0 )
   {
      while( lower < upper && upper!=UINT_MAX )
      {
         uint middle( (lower+upper)>>1 );
         SamplerList* Current( Entries[middle] );
         if( *Current == aSample )
         {  idx = middle;
            return Current;
         }
	 if( *Current <  aSample ) lower = middle+1;
         else upper = middle-1;
      }
   }
   if ( lower == upper && *(Entries[lower]) == aSample )
   {  idx = lower;
      return Entries[lower];
   }
   return NULL;
} // Search
void Access :: Append( SamplerList* forAdd )
{
   if ( Counter<MAX_ENTRIES )
   {
      for( uint loc = Counter; loc > 0 && *forAdd < *(Entries[loc-1]); loc-- ) ;
      memmove( Entries+loc+1,Entries+loc,sizeof(*Entries)*(Counter-loc) );
      Counter ++ ;
      Entries[loc] = forAdd;
   }
} // Append
void Access :: Print( FILE* Stream ) const
{
   fprintf( Stream,"\n\n   ’ Ў«Ёж  б १г«мв в ¬Ё Ё§¬ҐаҐЁ© ( ЁбЇ®«м§гҐвбп %u Ё§ %u § ЇЁбҐ© )\n",Counter,MAX_ENTRIES );
   WriteLine(Stream);
   //fprintf( Stream ,"€бе.Џ®§. ЏаЁҐ¬.Џ®§.  ЋЎйҐҐ ўаҐ¬п (б.)  Љ®«-ў® Їа®е. ‘।ҐҐ ўаҐ¬п (б.)" );
   fprintf( Stream ,"€бе.Џ®§. ЏаЁҐ¬.Џ®§.  ЋЎйҐҐ ўаҐ¬п(¬Єб)  Љ®«-ў® Їа®е. ‚Ґа-вм ‘аҐ¤ҐҐ ўаҐ¬п(¬Єб)"); 
   for ( uint index=0; index<Counter; index++ )
      if ( Entries[index] ) Entries[index]->Print(Stream, timeTrue, corrNum);
} // Print
/* --- Class CallsHandler --- */
CallsHandler :: CallsHandler()
   : LastUsedRec(NULL)
{
   SamplerStorage = new Storage;
   SamplerAccess  = new Access ;
   SamplerFiles   = new FileMgr ;
} // CallsHandler
CallsHandler :: ~CallsHandler()
{
   delete SamplerFiles ;
   delete SamplerAccess;
   delete SamplerStorage;
} // ~CallsHandler
void CallsHandler :: Handle( TIME time, PChar File, uint Line )
{
   SamplerRecord NewRecord;
   (Locate&)NewRecord = Locate( SamplerFiles->HandleOf(File),Line ) ;
   NewRecord.TotalTime  = time ;
   NewRecord.CrossTimes = 1 ;
   if ( LastUsedRec ) LastUsedRec->Append( NewRecord );
   LastUsedRec = SamplerAccess -> Search( NewRecord );
   if ( LastUsedRec==NULL )
   {
      LastUsedRec = SamplerStorage -> Allocate();
      if ( LastUsedRec != NULL )
      {
         *(Locate*)LastUsedRec = NewRecord ;
         SamplerAccess -> Append( LastUsedRec );
      }
   }
} // Handle
void CallsHandler :: Print( FILE* Stream , PChar ProgName ) const
{
   fprintf( Stream,"\n\n\tЋвзҐв ® १г«мв в е Ё§¬ҐаҐЁ© ¤«п Їа®Ја ¬¬л %s.",ProgName );
   fprintf( Stream,"\n\n\t‘®§¤  Їа®Ја ¬¬®© Sampler ( ўҐабЁп ®в %s )",__DATE__ );
   fprintf( Stream,"\n\t\t1995-98 (c) ‘ЏЎѓќ’“, Њ®©бҐ©згЄ ‹Ґ®Ё¤." );
   fprintf( Stream,"\n\t\t2006 (c) ‘ЏЎѓќ’“, ђл¦®ў €ў  (¬®¤ҐаЁ§ жЁп).\n\n" );
   SamplerFiles  -> Print(Stream);
   SamplerAccess -> Print(Stream);
   WriteLine(Stream);
} // Print
void CallsHandler :: PrintCSA( FILE* Stream, PChar ProgName ) const  //IV
{
 fprintf( Stream,"<model type = \"Objects::AMC::Model\" name = \"Sampler graph for %s\">", ProgName);
 if (SamplerAccess->Counter)
 {
   uint AbsorbLine; uchar AbsorbFileID;
   char buf1[20], buf2[20];
   for (uint i = 0; i < SamplerAccess->Counter; i++)
   {
     if (i == SamplerAccess->Counter-1)
     { fprintf( Stream, "\n        <node type = \"Objects::AMC::Top\" name = \"absorb\"></node>");
       AbsorbFileID = SamplerAccess->Entries[i]->FileID();
       AbsorbLine = SamplerAccess->Entries[i]->LineNo();
     }
     else
     { fprintf( Stream, "\n        <node type = \"Objects::AMC::Top\" name = \"%i_%i\"></node>",
       SamplerAccess->Entries[i]->FileID(), SamplerAccess->Entries[i]->LineNo()); };
   }
   for (i = 0; i < SamplerAccess->Counter; i++)
   {
     if ( SamplerAccess->Entries[i]->Count() ) {
      int TotalEntries = 0; uint k;
      for (k = 0; k < SamplerAccess->Entries[i]->Count(); k++)
	 TotalEntries+=SamplerAccess->Entries[i]->CondOf(k)->CrossTimes;
      if (i == SamplerAccess->Counter-1) { sprintf(buf1,"%s","absorb"); } else
       { sprintf(buf1, "%i_%i", SamplerAccess->Entries[i]->FileID(), SamplerAccess->Entries[i]->LineNo()); }
      for (k = 0; k < SamplerAccess->Entries[i]->Count(); k++)
      {
	double precTime = 0.0;
	TIME   corrTime(UINT32(SamplerAccess->TrueTime())*SamplerAccess->Entries[i]->CondOf(k)->CrossTimes);
	precTime = TimeAsMicroSeconds(SamplerAccess->Entries[i]->CondOf(k)->TotalTime - corrTime, SamplerAccess->CorrScale());
	if ( SamplerAccess->Entries[i]->CondOf(k)->FileID() == AbsorbFileID &&
	   SamplerAccess->Entries[i]->CondOf(k)->LineNo() == AbsorbLine)
	{ sprintf(buf2,"%s","absorb"); } else
	{ sprintf(buf2, "%i_%i", SamplerAccess->Entries[i]->CondOf(k)->FileID(),
	  SamplerAccess->Entries[i]->CondOf(k)->LineNo()); }
	fprintf( Stream, "\n        <link type = \"Objects::AMC::Link\" name = \"%s", buf1);
	fprintf( Stream, "-->%s\" probability = \"%.2lf\" intensity = \"%.2lf\" deviation=\"0.0\" source = \"%s\" dest = \"%s\"></link>",
	buf2, (double)SamplerAccess->Entries[i]->CondOf(k)->CrossTimes/TotalEntries,
	 precTime, buf1, buf2);
      }
     }
  }
 }
 fprintf( Stream, "\n        <link type = \"Objects::AMC::Link\" name = \"absorb");
 fprintf( Stream, "-->absorb\" probability = \"1.00\" intensity = \"0.00\" deviation=\"0.0\" source = \"absorb\" dest = \"absorb\"></link>");
 fprintf( Stream,"\n</model>");
}
typedef char TGraphSign[5] ;
static TGraphSign gsEtalon = { 'S','M','P','2','V' } ;
void CallsHandler :: Put( FILE* Stream ) const
{
   fwrite(gsEtalon, sizeof(TGraphSign), 1, Stream);
   SamplerFiles -> Put ( Stream );
   fwrite (&(SamplerAccess->timeTrue),sizeof(SamplerAccess->timeTrue),1,Stream);
   fwrite (&(SamplerAccess->corrNum),sizeof(SamplerAccess->corrNum),1,Stream);
   fwrite (&(SamplerAccess->Counter),sizeof(SamplerAccess->Counter),1,Stream);
   for (uint i = 0; i < SamplerAccess->Counter; i++)
   {
      ( SamplerAccess->Entries[i] ) -> Put ( Stream ) ;
   }
}
int CallsHandler :: Get( FILE* Stream )
{
   delete SamplerStorage;
   SamplerStorage = new Storage;
   delete SamplerAccess;
   SamplerAccess = new Access;
   TGraphSign gSign;
   fread (gSign, sizeof(gSign), 1, Stream);
   if ( memcmp(gSign,gsEtalon,sizeof(TGraphSign)) )
      return 0;
   SamplerFiles -> Get ( Stream );
   fread (&(SamplerAccess->timeTrue),sizeof(SamplerAccess->timeTrue),1,Stream);
   fread (&(SamplerAccess->corrNum),sizeof(SamplerAccess->corrNum),1,Stream);
   fread (&(SamplerAccess->Counter),sizeof(SamplerAccess->Counter),1,Stream);
   for (uint i = 0; i < SamplerAccess->Counter; i++)
   {
      LastUsedRec = SamplerStorage -> Allocate();
      if ( LastUsedRec != NULL )
      {
         LastUsedRec -> Get ( Stream );
         SamplerAccess->Entries[i] = LastUsedRec;
      }
   }
   return 1;
}
/* ----- End of file SData.cpp ----- */
          Соседние файлы в папке Samp16
          
      
    
    
    
          