ROOT logo
// $Id$

//**************************************************************************
//* This file is property of and copyright by the ALICE HLT Project        * 
//* ALICE Experiment at CERN, All rights reserved.                         *
//*                                                                        *
//* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
//*                  for The ALICE HLT Project.                            *
//*                                                                        *
//* Permission to use, copy, modify and distribute this software and its   *
//* documentation strictly for non-commercial purposes is hereby granted   *
//* without fee, provided that the above copyright notice appears in all   *
//* copies and that both the copyright notice and this permission notice   *
//* appear in the supporting documentation. The authors make no claims     *
//* about the suitability of this software for any purpose. It is          *
//* provided "as is" without express or implied warranty.                  *
//**************************************************************************

/// @file   AliHLTDataDeflaterSimple.cxx
/// @author Matthias Richter
/// @date   2011-08-10
/// @brief  Simple deflater implementation storing frequent values below a
///         maximum value with a reduced bit number and others with the full
///         number of bits.

#include "AliHLTDataDeflaterSimple.h"
#include <memory>
#include <algorithm>
#include <iostream>

/** ROOT macro for the implementation of ROOT specific class methods */
ClassImp(AliHLTDataDeflaterSimple)

AliHLTDataDeflaterSimple::AliHLTDataDeflaterSimple()
  : AliHLTDataDeflater()
  , fParameterDefinitions()
{
  // see header file for class documentation
  // or
  // refer to README to build package
  // or
  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
}

AliHLTDataDeflaterSimple::~AliHLTDataDeflaterSimple()
{
  // destructor
  Clear();

}

int AliHLTDataDeflaterSimple::AddParameterDefinition(const char* name, int bitLength, int reducedBitLength)
{
  /// add a parameter definition to the configuration, return reference id
  fParameterDefinitions.push_back(AliHLTDataDeflaterParameter(name, bitLength, reducedBitLength));
  int memberId=fParameterDefinitions.size()-1;
  if (DoStatistics()) {
    AddHistogram(memberId, name, bitLength);
  }
  return memberId;
}

bool AliHLTDataDeflaterSimple::OutputParameterBits( int memberId, AliHLTUInt64_t const & value )
{
  // write bit pattern of a member to the current byte and position
  if (memberId>=(int)fParameterDefinitions.size()) return false;

  AliHLTUInt32_t switchBit=fParameterDefinitions[memberId].SwitchBit(value); // 0 -> reduced, 1 -> full
  AliHLTUInt64_t v=fParameterDefinitions[memberId].Value(value);
  AliHLTUInt32_t length=fParameterDefinitions[memberId].ValueLength(value);
  fParameterDefinitions[memberId].IncrementBitCount(value);

  if (DoStatistics())
    FillStatistics(memberId, length, value);

  if (!OutputBit(switchBit)) return false;
  return OutputBits(v, length);
}

void AliHLTDataDeflaterSimple::Clear(Option_t * option)
{
  // internal cleanup
  unsigned i=0;
  for (vector<AliHLTDataDeflaterParameter>::iterator m=fParameterDefinitions.begin();
       m!=fParameterDefinitions.end(); m++, i++) {
    m->ResetBitCount();
  }
  AliHLTDataDeflater::Clear(option);
}

void AliHLTDataDeflaterSimple::Print(Option_t *option) const
{
  // print info
  Print(cout, option);
}

void AliHLTDataDeflaterSimple::Print(ostream& out, Option_t *option) const
{
  // print to stream
  out << "AliHLTDataDeflaterSimple:" << endl;
  AliHLTUInt64_t bitCount=0;
  AliHLTUInt64_t fullSize=0;
  for (vector<AliHLTDataDeflaterParameter>::const_iterator m=fParameterDefinitions.begin();
       m!=fParameterDefinitions.end(); m++) {
    cout << "   "; m->Print(option);
    bitCount+=m->GetBitCount();
    fullSize+=m->GetValueCount()*m->GetBitLength();
  }
  out << " total: " << bitCount << "/" << fullSize << " " << (fullSize>0?float(bitCount)/fullSize:0.0) << endl;
}

void AliHLTDataDeflaterSimple::AliHLTDataDeflaterParameter::Print(const char* /*option*/) const
{
  // print info
  cout << fName << " (" << fFullBitLength << "," << fReducedBitLength << "): "
       << fValueCount << " entries  "
       << fBitCount << "/" << fFullBitLength*fValueCount;
  if (fFullBitLength && fValueCount) {
    cout << " " << float(fBitCount)/(fValueCount*fFullBitLength);
  }
  cout << endl;
}

ostream& operator<<(ostream &out, const AliHLTDataDeflaterSimple& me)
{
  me.Print(out);
  return out;
}
 AliHLTDataDeflaterSimple.cxx:1
 AliHLTDataDeflaterSimple.cxx:2
 AliHLTDataDeflaterSimple.cxx:3
 AliHLTDataDeflaterSimple.cxx:4
 AliHLTDataDeflaterSimple.cxx:5
 AliHLTDataDeflaterSimple.cxx:6
 AliHLTDataDeflaterSimple.cxx:7
 AliHLTDataDeflaterSimple.cxx:8
 AliHLTDataDeflaterSimple.cxx:9
 AliHLTDataDeflaterSimple.cxx:10
 AliHLTDataDeflaterSimple.cxx:11
 AliHLTDataDeflaterSimple.cxx:12
 AliHLTDataDeflaterSimple.cxx:13
 AliHLTDataDeflaterSimple.cxx:14
 AliHLTDataDeflaterSimple.cxx:15
 AliHLTDataDeflaterSimple.cxx:16
 AliHLTDataDeflaterSimple.cxx:17
 AliHLTDataDeflaterSimple.cxx:18
 AliHLTDataDeflaterSimple.cxx:19
 AliHLTDataDeflaterSimple.cxx:20
 AliHLTDataDeflaterSimple.cxx:21
 AliHLTDataDeflaterSimple.cxx:22
 AliHLTDataDeflaterSimple.cxx:23
 AliHLTDataDeflaterSimple.cxx:24
 AliHLTDataDeflaterSimple.cxx:25
 AliHLTDataDeflaterSimple.cxx:26
 AliHLTDataDeflaterSimple.cxx:27
 AliHLTDataDeflaterSimple.cxx:28
 AliHLTDataDeflaterSimple.cxx:29
 AliHLTDataDeflaterSimple.cxx:30
 AliHLTDataDeflaterSimple.cxx:31
 AliHLTDataDeflaterSimple.cxx:32
 AliHLTDataDeflaterSimple.cxx:33
 AliHLTDataDeflaterSimple.cxx:34
 AliHLTDataDeflaterSimple.cxx:35
 AliHLTDataDeflaterSimple.cxx:36
 AliHLTDataDeflaterSimple.cxx:37
 AliHLTDataDeflaterSimple.cxx:38
 AliHLTDataDeflaterSimple.cxx:39
 AliHLTDataDeflaterSimple.cxx:40
 AliHLTDataDeflaterSimple.cxx:41
 AliHLTDataDeflaterSimple.cxx:42
 AliHLTDataDeflaterSimple.cxx:43
 AliHLTDataDeflaterSimple.cxx:44
 AliHLTDataDeflaterSimple.cxx:45
 AliHLTDataDeflaterSimple.cxx:46
 AliHLTDataDeflaterSimple.cxx:47
 AliHLTDataDeflaterSimple.cxx:48
 AliHLTDataDeflaterSimple.cxx:49
 AliHLTDataDeflaterSimple.cxx:50
 AliHLTDataDeflaterSimple.cxx:51
 AliHLTDataDeflaterSimple.cxx:52
 AliHLTDataDeflaterSimple.cxx:53
 AliHLTDataDeflaterSimple.cxx:54
 AliHLTDataDeflaterSimple.cxx:55
 AliHLTDataDeflaterSimple.cxx:56
 AliHLTDataDeflaterSimple.cxx:57
 AliHLTDataDeflaterSimple.cxx:58
 AliHLTDataDeflaterSimple.cxx:59
 AliHLTDataDeflaterSimple.cxx:60
 AliHLTDataDeflaterSimple.cxx:61
 AliHLTDataDeflaterSimple.cxx:62
 AliHLTDataDeflaterSimple.cxx:63
 AliHLTDataDeflaterSimple.cxx:64
 AliHLTDataDeflaterSimple.cxx:65
 AliHLTDataDeflaterSimple.cxx:66
 AliHLTDataDeflaterSimple.cxx:67
 AliHLTDataDeflaterSimple.cxx:68
 AliHLTDataDeflaterSimple.cxx:69
 AliHLTDataDeflaterSimple.cxx:70
 AliHLTDataDeflaterSimple.cxx:71
 AliHLTDataDeflaterSimple.cxx:72
 AliHLTDataDeflaterSimple.cxx:73
 AliHLTDataDeflaterSimple.cxx:74
 AliHLTDataDeflaterSimple.cxx:75
 AliHLTDataDeflaterSimple.cxx:76
 AliHLTDataDeflaterSimple.cxx:77
 AliHLTDataDeflaterSimple.cxx:78
 AliHLTDataDeflaterSimple.cxx:79
 AliHLTDataDeflaterSimple.cxx:80
 AliHLTDataDeflaterSimple.cxx:81
 AliHLTDataDeflaterSimple.cxx:82
 AliHLTDataDeflaterSimple.cxx:83
 AliHLTDataDeflaterSimple.cxx:84
 AliHLTDataDeflaterSimple.cxx:85
 AliHLTDataDeflaterSimple.cxx:86
 AliHLTDataDeflaterSimple.cxx:87
 AliHLTDataDeflaterSimple.cxx:88
 AliHLTDataDeflaterSimple.cxx:89
 AliHLTDataDeflaterSimple.cxx:90
 AliHLTDataDeflaterSimple.cxx:91
 AliHLTDataDeflaterSimple.cxx:92
 AliHLTDataDeflaterSimple.cxx:93
 AliHLTDataDeflaterSimple.cxx:94
 AliHLTDataDeflaterSimple.cxx:95
 AliHLTDataDeflaterSimple.cxx:96
 AliHLTDataDeflaterSimple.cxx:97
 AliHLTDataDeflaterSimple.cxx:98
 AliHLTDataDeflaterSimple.cxx:99
 AliHLTDataDeflaterSimple.cxx:100
 AliHLTDataDeflaterSimple.cxx:101
 AliHLTDataDeflaterSimple.cxx:102
 AliHLTDataDeflaterSimple.cxx:103
 AliHLTDataDeflaterSimple.cxx:104
 AliHLTDataDeflaterSimple.cxx:105
 AliHLTDataDeflaterSimple.cxx:106
 AliHLTDataDeflaterSimple.cxx:107
 AliHLTDataDeflaterSimple.cxx:108
 AliHLTDataDeflaterSimple.cxx:109
 AliHLTDataDeflaterSimple.cxx:110
 AliHLTDataDeflaterSimple.cxx:111
 AliHLTDataDeflaterSimple.cxx:112
 AliHLTDataDeflaterSimple.cxx:113
 AliHLTDataDeflaterSimple.cxx:114
 AliHLTDataDeflaterSimple.cxx:115
 AliHLTDataDeflaterSimple.cxx:116
 AliHLTDataDeflaterSimple.cxx:117
 AliHLTDataDeflaterSimple.cxx:118
 AliHLTDataDeflaterSimple.cxx:119
 AliHLTDataDeflaterSimple.cxx:120
 AliHLTDataDeflaterSimple.cxx:121
 AliHLTDataDeflaterSimple.cxx:122
 AliHLTDataDeflaterSimple.cxx:123
 AliHLTDataDeflaterSimple.cxx:124
 AliHLTDataDeflaterSimple.cxx:125
 AliHLTDataDeflaterSimple.cxx:126
 AliHLTDataDeflaterSimple.cxx:127
 AliHLTDataDeflaterSimple.cxx:128