8 if (Line==
"") {
break; }
12 printf(
"All nodes read!\n");
15 printf(
"All cascades read!\n");
27 if (Line==
"") {
break; }
42 if (FieldsV.
Len() == 3) {
43 Alphas.
AddDat(0.0) = FieldsV[2].GetFlt();
45 for (
int i=2; i<FieldsV.
Len()-1; i+=2) {
46 Alphas.
AddDat(FieldsV[i].GetFlt()) = FieldsV[i+1].GetFlt();
53 printf(
"Edge %d -> %d: ", FieldsV[0].GetInt(), FieldsV[1].GetInt());
55 for (
int i=0; i<AlphasE.
Len(); i+=2) { printf(
"(%f, %f)", AlphasE.
GetKey(i).Val, AlphasE[i].Val); }
71 if (Line==
"") {
break; }
92 if (Line==
"") {
break; }
98 if (verbose) { printf(
"Node:%s\n", NIdV[1].CStr()); }
107 if (FieldsV.
Len() == 3) {
108 Alphas.
AddDat(0.0) = FieldsV[2].GetFlt();
110 for (
int i=2; i<FieldsV.
Len()-1; i+=2) {
111 Alphas.
AddDat(FieldsV[i].GetFlt()) = FieldsV[i+1].GetFlt();
118 printf(
"Edge %d -> %d: ", FieldsV[0].GetInt(), FieldsV[1].GetInt());
120 for (
int i=0; i<AlphasE.
Len(); i+=2) { printf(
"(%f, %f)", AlphasE.
GetKey(i).Val, AlphasE[i].Val); }
136 if (Line==
"") {
break; }
152 if (FieldsV.
Len()==2) { CId = FieldsV[0].GetInt(); }
155 TStrV NIdV; FieldsV[FieldsV.
Len()-1].SplitOnAllCh(
',', NIdV);
157 for (
int i = 0; i < NIdV.
Len(); i+=2) {
160 NId = NIdV[i].GetInt();
161 Tm = NIdV[i+1].GetFlt();
174 C.
Add(NI.GetKey(), NI.GetDat());
181 bool verbose =
false;
183 double GlobalTime, InitTime;
193 while (C.
Len() < 2) {
199 GlobalTime = InitTime;
202 InfectedNIdH.
AddDat(StartNId) = GlobalTime;
207 const int& NId = InfectedNIdH.
BegI().
GetKey();
215 C.
Add(NId, GlobalTime);
217 if (verbose) { printf(
"GlobalTime:%f, infected node:%d\n", GlobalTime, NId); }
221 for (
int e = 0; e < NI.GetOutDeg(); e++) {
222 const int DstNId = NI.GetOutNId(e);
226 for (
int j=0; j<Alphas.
Len() && Alphas.
GetKey(j)<GlobalTime; j++) { alpha = Alphas[j]; }
227 if (verbose) { printf(
"GlobalTime:%f, nodes:%d->%d, alpha:%f\n", GlobalTime, NId, DstNId, alpha); }
229 if (alpha<1e-9) {
continue; }
232 if (InfectedBy.
IsKey(NId) && InfectedBy.
GetDat(NId).
Val == DstNId)
259 if (InfectedNIdH.
IsKey(DstNId)) {
260 double t2 = InfectedNIdH.
GetDat(DstNId);
262 InfectedNIdH.
GetDat(DstNId) = t1;
263 InfectedBy.
GetDat(DstNId) = NId;
266 InfectedNIdH.
AddDat(DstNId) = t1;
267 InfectedBy.
AddDat(DstNId) = NId;
287 if (EI().IsKey(Step)) { Alpha = EI().GetDat(Step); }
290 GraphAtT->
AddEdge(EI.GetSrcNId(), EI.GetDstNId());
303 if (EI().IsKey(Step)) { Alpha = EI().GetDat(Step); }
306 NetworkAtT->AddEdge(EI.GetSrcNId(), EI.GetDstNId(), Alpha);
319 double inferredAlpha = 0.0;
320 if (EI().IsKey(Step)) { inferredAlpha = EI().GetDat(Step); }
323 GraphAtT->
AddEdge(EI.GetSrcNId(), EI.GetDstNId());
332 NetworkAtT->AddNode(NI.GetKey(), NI.GetDat().Name);
338 double inferredAlpha = 0.0;
339 if (EI().IsKey(Step)) { inferredAlpha = EI().GetDat(Step); }
342 NetworkAtT->AddEdge(EI.GetSrcNId(), EI.GetDstNId(), inferredAlpha);
362 for (
int i=0; i<Steps.
Len()-1; i++) {
381 void TNIBs::SG(
const int& NId,
const int& Iters,
const TFltV& Steps,
const TSampling& Sampling,
const TStr& ParamSampling,
const bool& PlotPerformance) {
382 bool verbose =
false;
383 int currentCascade = -1;
389 printf(
"Node %d\n", NId);
392 for (
int t=1; t<Steps.
Len(); t++) {
395 int num_infections = 0;
397 if (
CascH[i].LenBeforeT(Steps[t]) > 1 &&
399 (Sampling==
WIN_SAMPLING && (Steps[t]-
CascH[i].GetMinTm()) <= ParamSamplingV[0].GetFlt()) ||
401 num_infections +=
CascH[i].LenBeforeT(Steps[t]);
407 if (CascadesIdx.
Len()==0) {
408 printf(
"WARNING: No cascades recorded by %f!\n", Steps[t].Val);
416 printf(
"Solving step %f: %d cascades, %d infections\n", Steps[t].Val, CascadesIdx.
Len(), num_infections);
417 SampledCascades.
Clr();
420 for (
int i=0; i < Iters; i++) {
432 currentCascade = (int)
TFlt::Rnd.GetExpDev(ParamSamplingV[0].GetFlt());
433 }
while (currentCascade > CascadesIdx.
Len()-1);
438 currentCascade = (int)
TFlt::Rnd.GetExpDev(ParamSamplingV[1].GetFlt());
439 }
while (currentCascade > CascadesIdx.
Len()-1);
444 currentCascade = (int)
TFlt::Rnd.GetRayleigh(ParamSamplingV[0].GetFlt());
445 }
while (currentCascade > CascadesIdx.
Len()-1);
449 if (!SampledCascades.
IsKey(currentCascade)) { SampledCascades.
AddDat(currentCascade) = 0; }
450 SampledCascades.
GetDat(currentCascade)++;
452 if (verbose) { printf(
"Cascade %d sampled!\n", currentCascade); }
462 for (
int j=0; j<AlphasToUpdate.
Len(); j++) {
481 if (verbose) { printf(
"%d transmission rates updated!\n", AlphasToUpdate.
Len()); }
484 printf(
"%d different cascades have been sampled for step %f!\n", SampledCascades.
Len(), Steps[t].Val);
489 if (EI().IsKey(Steps[t]) || t == 0 || !EI().IsKey(Steps[t-1])) {
continue; }
491 EI().AddDat(Steps[t]) =
Aging*EI().GetDat(Steps[t-1]);
494 if (verbose) { printf(
"%d transmission rates that did not changed were 'aged' by %f!\n", unchanged,
Aging.
Val); }
501 void TNIBs::BSG(
const int& NId,
const int& Iters,
const TFltV& Steps,
const int& BatchLen,
const TSampling& Sampling,
const TStr& ParamSampling,
const bool& PlotPerformance) {
502 bool verbose =
false;
503 int currentCascade = -1;
512 for (
int t=1; t<Steps.
Len(); t++) {
515 int num_infections = 0;
516 for (
int i = 0; i <
CascH.
Len(); i++) {
517 if (
CascH[i].LenBeforeT(Steps[t]) > 1 &&
519 (Sampling==
WIN_SAMPLING && (Steps[t]-
CascH[i].GetMinTm()) <= ParamSamplingV[0].GetFlt()) ||
521 num_infections +=
CascH[i].LenBeforeT(Steps[t]);
527 if (CascadesIdx.
Len() == 0) {
528 printf(
"WARNING: No cascades recorded by %f!\n", Steps[t].Val);
533 printf(
"Solving step %f (%d cascades, %d infections)\n", Steps[t].Val,
534 CascadesIdx.
Len(), num_infections);
540 for (
int i=0; i < Iters; i++) {
548 for (
int c=0; c<BatchLen; c++) {
560 currentCascade = (int)
TFlt::Rnd.GetExpDev(ParamSamplingV[0].GetFlt());
561 }
while (currentCascade > CascadesIdx.
Len()-1);
566 currentCascade = (int)
TFlt::Rnd.GetExpDev(ParamSamplingV[1].GetFlt());
567 }
while (currentCascade > CascadesIdx.
Len()-1);
572 currentCascade = (int)
TFlt::Rnd.GetRayleigh(ParamSamplingV[0].GetFlt());
573 }
while (currentCascade > CascadesIdx.
Len()-1);
580 if (!SampledCascades.
IsKey(currentCascade)) { SampledCascades.
AddDat(currentCascade) = 0; }
581 SampledCascades.
GetDat(currentCascade)++;
588 for (
int j=0; j<AlphasToUpdate.
Len(); j++) {
616 if (EI().IsKey(Steps[t]) || t == 0 || !EI().IsKey(Steps[t-1])) {
continue; }
618 EI().AddDat(Steps[t]) = EI().GetDat(Steps[t-1]);
621 if (verbose) { printf(
"%d unchanged transmission rates updated!\n", unchanged); }
624 printf(
"%d different cascades have been sampled for step %f!\n", SampledCascades.
Len(), Steps[t].Val);
632 bool verbose =
false;
639 for (
int t=1; t<Steps.
Len(); t++) {
642 int num_infections = 0;
644 if (
CascH[i].LenBeforeT(Steps[t]) > 1) {
645 num_infections +=
CascH[i].LenBeforeT(Steps[t]);
651 if (CascadesIdx.
Len()==0) {
652 printf(
"WARNING: No cascades recorded by %f!\n", Steps[t].Val);
657 printf(
"Solving step %f (%d cascades, %d infections)\n", Steps[t].Val, CascadesIdx.
Len(), num_infections);
663 for (
int i=0; i < Iters; i++) {
671 for (
int c=0; c<CascadesIdx.
Len(); c++) {
680 for (
int j=0; j<AlphasToUpdate.
Len(); j++) {
708 if (EI().IsKey(Steps[t]) || t == 0 || !EI().IsKey(Steps[t-1])) {
continue; }
710 EI().AddDat(Steps[t]) = EI().GetDat(Steps[t-1]);
713 if (verbose) { printf(
"%d unchanged transmission rates updated!\n", unchanged); }
727 if (Cascade.
IsNode(NId) && Cascade.
GetTm(NId) <= CurrentTime) {
730 if ( (Cascade.
GetTm(NId)<=NI.GetDat().Tm) ||
734 TIntPr Pair(NI.GetKey(), NId);
761 if ( Cascade.
IsNode(NId) && (Cascade.
GetTm(NId)<=NI.GetDat().Tm ||
766 if (NI.GetDat().Tm > CurrentTime) {
break; }
768 TIntPr Pair(NI.GetKey(), NId);
772 if (Cascade.
IsNode(NId) && Cascade.
GetTm(NId) <= CurrentTime) {
777 val = (Cascade.
GetTm(NId) - NI.GetDat().Tm) - 1.0/sum;
780 val = log((Cascade.
GetTm(NId) - NI.GetDat().Tm)/
Delta) - 1.0/((Cascade.
GetTm(NId)-NI.GetDat().Tm)*sum);
789 IAssert((CurrentTime - NI.GetDat().Tm) >= 0.0);
793 val = (CurrentTime-NI.GetDat().Tm);
829 AlphasToUpdate.
Add(Pair);
836 if ( t >= x.
Len() )
return;
841 for (
int j = 0; j < k; j++){
842 double alpha = ( (x.
Len() ) / T ) * pow( s, j );
843 double term_1 = -log(alpha) + alpha * x[t];
846 term_2 = j * log((
double) n) * gamma;
850 for (
int l = 0; l < k; l++){
851 double my_val = C(t-1, l);
852 if ( j > l ) my_val += (j - l) * log((
double) n) * gamma;
853 if ( !first || my_val < term_2 ){
859 C( t, j ) = term_1 + term_2;
862 find_C( t + 1, x, C, k, s, gamma, T );
869 for (
int t = C.
GetRows() - 1; t > 0; t --){
872 for (
int j = 0; j < C.
GetCols(); j++){
873 double c_state = C( t, j );
874 if ( t < C.
GetRows() - 2 && states[t+1] > j ){
875 c_state += ( states[t+1] - j ) * gamma * log((
double) n);
877 if ( best_state == -1 || best_val > c_state ){
882 states[t] = best_state;
890 for (
int i=0; i<LinksEdge.
Len(); i++) {
894 if (tsecs > MaxTime || tsecs < MinTime) {
continue; }
895 arrival_times.
Add(tsecs);
899 if ( arrival_times.
Len() < 2 )
return;
903 arrival_times.
Sort(
true);
904 double T = ((double)arrival_times.
Last().
GetAbsSecs()) - ((
double)arrival_times[0].GetAbsSecs());
905 for (
int i = 1; i < arrival_times.
Len(); i++){
906 x.
Add( ((
double)arrival_times[i].GetAbsSecs()) - ((
double)arrival_times[i-1].GetAbsSecs()) );
910 find_C( 0, x, Cost_matrix, k, s, gamma, T);
914 for (
int i=0; i<state_labels.
Len(); i++) { state_times.
Add((
double)arrival_times[i].GetAbsSecs()); }
919 double CurrentMAE = 0.0;
920 double CurrentMSE = 0.0;
921 TFltPr CurrentPrecisionRecall(0.0, 0.0);
922 double CurrentAccD = 0.0;
925 for (
int i=0; i<NI.GetInDeg(); i++) {
928 double trueAlpha = 0.0;
932 CurrentAccD += (double) (inferredAlpha >
MinAlpha);
940 for (
int i=0; i<NI.GetInDeg(); i++) {
941 TIntPr Pair(NI.GetInNId(i), NId);
944 double inferredAlpha = 0.0;
950 double trueAlpha = 0.0;
972 if (CurrentAccD > 0) {
985 if (NIdV.
Len() > 0 && !NIdV.
IsIn(NI.GetKey())) {
continue; }
987 FOut.
PutStr(
TStr::Fmt(
"%d \"%s\" ic Blue\r\n", NI.GetKey().Val+1, NI.GetDat().Name.CStr()));
991 if (NIdV.
Len() > 0 && (!NIdV.
IsIn(EI.GetSrcNId()) || !NIdV.
IsIn(EI.GetDstNId()))) {
continue; }
994 double inferredAlpha = 0.0;
995 if (EI().IsKey(Step)) { inferredAlpha = EI().GetDat(Step); }
1008 if (NIdV.
Len() > 0 && !NIdV.
IsIn(NI.GetKey())) {
continue; }
1010 FOut.
PutStr(
TStr::Fmt(
"%d,%s\r\n", NI.GetKey().Val, NI.GetDat().Name.CStr()));
1017 if (NIdV.
Len() > 0 && (!NIdV.
IsIn(EI.GetSrcNId()) || !NIdV.
IsIn(EI.GetDstNId()))) {
continue; }
1021 if (EI.GetSrcNId() != EI.GetDstNId()) {
1022 if (EI().Len() > 0) {
1023 TStr Line;
bool IsEdge =
false;
1024 for (
int i=0; i<EI().Len(); i++) {
1029 Line +=
TStr::Fmt(
",%f,0.0", EI().GetKey(i).Val);
1040 FOut.
PutStr(
TStr::Fmt(
"%d,%d,1\r\n", EI.GetSrcNId(), EI.GetDstNId()));
1050 if (NIdV.
Len() > 0 && !NIdV.
IsIn(NI.GetKey())) {
continue; }
1052 FOut.
PutStr(
TStr::Fmt(
"%d,%s\r\n", NI.GetKey().Val, NI.GetDat().Name.CStr()));
1058 if (NIdV.
Len() > 0 && (!NIdV.
IsIn(EI.GetSrcNId()) || !NIdV.
IsIn(EI.GetDstNId()))) {
continue; }
1062 if (EI.GetSrcNId() != EI.GetDstNId()) {
1063 double inferredAlpha = 0.0;
1064 if (EI().IsKey(Step)) { inferredAlpha = EI().GetDat(Step); }
1081 if (EI.GetSrcNId() != EI.GetDstNId()) {
1082 if (EI().Len() > 0) {
1083 TStr Line;
bool IsEdge =
false;
1084 for (
int i=0; i<EI().Len(); i++) {
1089 Line +=
TStr::Fmt(
",%f,0.0", EI().GetKey(i).Val);
1100 FOut.
PutStr(
TStr::Fmt(
"%d,%d,1\r\n", EI.GetSrcNId(), EI.GetDstNId()));
1110 FOut.
PutStr(
TStr::Fmt(
"%d,%s\r\n", NI.GetKey().Val, NI.GetDat().Name.CStr()));
1120 if (EI.GetSrcNId() != EI.GetDstNId()) {
1121 if (EI().Len() > 0) {
1123 for (
int i=0; i<EI().Len()-1; i++) { FOut.
PutStr(
TStr::Fmt(
"%f,%f,", EI().GetKey(i).Val, EI()[i].Val)); }
1124 FOut.
PutStr(
TStr::Fmt(
"%f,%f", EI().GetKey(EI().Len()-1).Val, EI()[EI().Len()-1].Val));
1128 FOut.
PutStr(
TStr::Fmt(
"%d,%d,1\r\n", EI.GetSrcNId(), EI.GetDstNId()));
1138 FOut.
PutStr(
TStr::Fmt(
"%d \"%s\" ic Blue\r\n", NI.GetKey().Val+1, NI.GetDat().Name.CStr()));
1140 FOut.
PutStr(
"*Arcs\r\n");
1143 double trueAlpha = 0.0;
1144 if (EI().IsKey(Step)) { trueAlpha = EI().GetDat(Step); }
1145 else {
for (
int j=0; j<EI().Len() && EI().GetKey(j)<=Step; j++) { trueAlpha = EI()[j]; } }
1158 FOut.
PutStr(
TStr::Fmt(
"%d,%s", NI.GetKey().Val, NI.GetDat().Name.CStr()));
1159 if (CascadesPerNode.
IsKey(NI.GetKey().Val)) {
1160 for (
int i=0; i<CascadesPerNode.
GetDat(NI.GetKey().Val).Len(); i++) {
1173 FOut.
PutStr(
TStr::Fmt(
"%d,%s\r\n", NI.GetKey().Val, NI.GetDat().Name.CStr()));
1184 if (j > 0) { FOut.
PutStr(
TStr::Fmt(
",%d,%f", NI.GetDat().NId.Val, NI.GetDat().Tm.Val)); }
1185 else { FOut.
PutStr(
TStr::Fmt(
"%d;%d,%f", CI.GetKey().Val, NI.GetDat().NId.Val, NI.GetDat().Tm.Val)); }
bool IsNode(const int &NId) const
Tests whether ID NId is a node.
void BSG(const int &NId, const int &Iters, const TFltV &Steps, const int &BatchLen, const TSampling &Sampling, const TStr &ParamSampling=TStr(""), const bool &PlotPerformance=false)
void SaveGroundTruth(const TStr &OutFNm)
void SaveInferred(const TStr &OutFNm, const TIntV &NIdV=TIntV())
TNodeInfo GetNodeInfo(const int &NId) const
TIntIntPrH SampledCascadesH
void SaveGroundTruthPajek(const TStr &OutFNm, const double &Step)
int GetEdges() const
Returns the number of edges in the network.
TEdgeI EndEI() const
Returns an iterator referring to the past-the-end edge in the network.
static const T & Mx(const T &LVal, const T &RVal)
static PNGraph New()
Static constructor that returns a pointer to the graph. Call: PNGraph Graph = TNGraph::New().
bool IsIn(const TVal &Val) const
Checks whether element Val is a member of the vector.
void Init(const TFltV &Steps)
THash< TInt, TCascade > CascH
THash< TInt, THitInfo >::TIter EndI() const
int AddNode(int NId=-1)
Adds a node of ID NId to the network.
TStrFltFltHNEDNet Network
TStrFltFltHNEDNet InferredNetwork
void LoadInferredNodesTxt(TSIn &SIn)
void LoadCascadesTxt(TSIn &SIn)
TSizeTy Len() const
Returns the number of elements in the vector.
THash< TInt, TNodeInfo > NodeNmH
void AddCasc(const TStr &CascStr, const TModel &Model=EXP)
void LoadGroundTruthTxt(TSIn &SIn)
double GetRayleigh(const double &Sigma)
int AddNode(int NId=-1)
Adds a node of ID NId to the graph.
THash< TInt, THitInfo > NIdHitH
const TDat & GetDat(const TKey &Key) const
bool GetEDat(const int &SrcNId, const int &DstNId, TEdgeData &EdgeDat) const
Returns edge data in Data for the edge from node IDs SrcNId to DstNId.
void GetInferredGraphAtT(const double &Step, PNGraph &GraphAtT)
const TKey & GetKey() const
void SaveInferredPajek(const TStr &OutFNm, const double &Step, const TIntV &NIdV=TIntV())
static PNet New()
Static constructor that returns a pointer to the network. Call: TPt > Net = TNodeEDatNet::New().
double GetTm(const int &NId) const
int AddEdge(const int &SrcNId, const int &DstNId)
Adds an edge from node IDs SrcNId to node DstNId to the network.
void Clr(const bool &DoDel=true, const bool &ResetDat=true)
Deletes all nodes and edges from the network.
void Clr(const bool &DoDel=true, const TSizeTy &NoDelLim=-1)
Clears the contents of the vector.
const TDat & GetDat() const
TNodeI GetNI(const int &NId) const
Returns an iterator referring to the node of ID NId in the network.
void Sort(const bool &Asc=true)
Sorts the elements of the vector.
TEdgeI BegEI() const
Returns an iterator referring to the first edge in the network.
int AddEdge(const int &SrcNId, const int &DstNId)
Adds an edge from node IDs SrcNId to node DstNId to the graph.
bool IsEdge(const int &SrcNId, const int &DstNId, const bool &IsDir=true) const
Tests whether an edge from node IDs SrcNId to DstNId exists in the network.
void SG(const int &NId, const int &Iters, const TFltV &Steps, const TSampling &Sampling, const TStr &ParamSampling=TStr(""), const bool &PlotPerformance=false)
static double Power(const double &Base, const double &Exponent)
void LoadInferredTxt(TSIn &SIn)
const TVal & Last() const
Returns a reference to the last element of the vector.
void GenCascade(TCascade &C)
void ComputePerformanceNId(const int &NId, const int &Step, const TFltV &Steps)
void FG(const int &NId, const int &Iters, const TFltV &Steps)
int GetRndNId(TRnd &Rnd=TInt::Rnd)
Returns an ID of a random node in the network.
TPair< TFlt, TFlt > TFltPr
void SaveSites(const TStr &OutFNm, const TIntFltVH &CascadesPerNode=TIntFltVH())
void SaveInferredEdges(const TStr &OutFNm)
void GetInferredNetworkAtT(const double &Step, PStrFltNEDNet &NetworkAtT)
bool IsNodeNm(const int &NId) const
void GetGroundTruthNetworkAtT(const double &Step, PStrFltNEDNet &NetworkAtT)
static double GetMn(const double &Flt1, const double &Flt2)
void UpdateDiff(const TOptMethod &OptMethod, const int &NId, TCascade &Cascade, TIntPrV &AlphasToUpdate, const double &CurrentTime=TFlt::Mx)
void find_C(int t, TFltV &x, TFltVV &C, const int &k, const double &s, const double &gamma, const double &T)
THash< TInt, THitInfo >::TIter BegI() const
void LoadGroundTruthNodesTxt(TSIn &SIn)
static TStr Fmt(const char *FmtStr,...)
void Add(const int &NId, const double &HitTm)
int PutStr(const char *CStr)
void SplitOnAllCh(const char &SplitCh, TStrV &StrV, const bool &SkipEmpty=true) const
void LabelBurstAutomaton(const int &SrcId, const int &DstId, TIntV &state_labels, TFltV &state_times, const bool &inferred=false, const int &k=5, const double &s=2.0, const double &gamma=1.0, const TSecTm &MinTime=TSecTm(), const TSecTm &MaxTime=TSecTm())
void Clr(const bool &DoDel=true, const int &NoDelLim=-1, const bool &ResetDat=true)
void SaveCascades(const TStr &OutFNm)
int GetUniDevInt(const int &Range=0)
bool IsKey(const TKey &Key) const
TSizeTy Add()
Adds a new element at the end of the vector, after its current last element.
TDat & AddDat(const TKey &Key)
void AddNodeNm(const int &NId, const TNodeInfo &Info)
THash< TInt, TIntFltH > DiffAlphas
const TKey & GetKey(const int &KeyId) const
void GetGroundTruthGraphAtT(const double &Step, PNGraph &GraphAtT)
bool IsNode(const int &NId) const
double GetPowerDev(const double &AlphaSlope)
void find_min_state(TFltVV &C, TIntV &states, const int &k, const double &s, const double &gamma, const double &T)
int GetNodes() const
Returns the number of nodes in the network.
bool GetNextLn(TStr &LnStr)
TIntFltH TotalCascadesAlpha
void SortByDat(const bool &Asc=true)