int TNEANetMP::AddEdge(const int& SrcNId, const int& DstNId, int EId) { int i; if (EId == -1) { EId = MxEId; MxEId++; } else { MxEId = TMath::Mx(EId+1, MxEId()); } IAssertR(!IsEdge(EId), TStr::Fmt("EdgeId %d already exists", EId)); IAssertR(IsNode(SrcNId) && IsNode(DstNId), TStr::Fmt("%d or %d not a node.", SrcNId, DstNId).CStr()); EdgeH.AddDat(EId, TEdge(EId, SrcNId, DstNId)); GetNode(SrcNId).OutEIdV.AddSorted(EId); GetNode(DstNId).InEIdV.AddSorted(EId); // update attribute columns for (i = 0; i < VecOfIntVecsE.Len(); i++) { TVec<TInt>& IntVec = VecOfIntVecsE[i]; IntVec.Ins(EdgeH.GetKeyId(EId), TInt::Mn); } TVec<TStr> DefIntVec = TVec<TStr>(); IntDefaultsE.GetKeyV(DefIntVec); for (i = 0; i < DefIntVec.Len(); i++) { TStr attr = DefIntVec[i]; TVec<TInt>& IntVec = VecOfIntVecsE[KeyToIndexTypeE.GetDat(DefIntVec[i]).Val2]; IntVec[EdgeH.GetKeyId(EId)] = GetIntAttrDefaultE(attr); } for (i = 0; i < VecOfStrVecsE.Len(); i++) { TVec<TStr>& StrVec = VecOfStrVecsE[i]; StrVec.Ins(EdgeH.GetKeyId(EId), TStr::GetNullStr()); } TVec<TStr> DefStrVec = TVec<TStr>(); IntDefaultsE.GetKeyV(DefStrVec); for (i = 0; i < DefStrVec.Len(); i++) { TStr attr = DefStrVec[i]; TVec<TStr>& StrVec = VecOfStrVecsE[KeyToIndexTypeE.GetDat(DefStrVec[i]).Val2]; StrVec[EdgeH.GetKeyId(EId)] = GetStrAttrDefaultE(attr); } for (i = 0; i < VecOfFltVecsE.Len(); i++) { TVec<TFlt>& FltVec = VecOfFltVecsE[i]; FltVec.Ins(EdgeH.GetKeyId(EId), TFlt::Mn); } TVec<TStr> DefFltVec = TVec<TStr>(); FltDefaultsE.GetKeyV(DefFltVec); for (i = 0; i < DefFltVec.Len(); i++) { TStr attr = DefFltVec[i]; TVec<TFlt>& FltVec = VecOfFltVecsE[KeyToIndexTypeE.GetDat(DefFltVec[i]).Val2]; FltVec[NodeH.GetKeyId(EId)] = GetFltAttrDefaultE(attr); } return EId; }
int TNEANet::DelAttrDatE(const int& EId, const TStr& attr) { // TODO(nkhadke): add error checking TInt vecType = KeyToIndexTypeE(attr).Val1; if (vecType == IntType) { VecOfIntVecsE[KeyToIndexTypeE.GetDat(attr).Val2][EId] = GetIntAttrDefaultE(attr); } else if (vecType == StrType) { VecOfStrVecsE[KeyToIndexTypeE.GetDat(attr).Val2][EId] = GetStrAttrDefaultE(attr); } else if (vecType == FltType) { VecOfFltVecsE[KeyToIndexTypeE.GetDat(attr).Val2][EId] = GetFltAttrDefaultE(attr); } else { return -1; } return 0; }
int TNEANet::AddStrAttrDatE(const int& EId, const TStr& value, const TStr& attr) { int i; TInt CurrLen; if (!IsEdge(EId)) { //AddEdge(EId); return -1; } if (KeyToIndexTypeE.IsKey(attr)) { TVec<TStr>& NewVec = VecOfStrVecsE[KeyToIndexTypeE.GetDat(attr).Val2]; NewVec[EdgeH.GetKeyId(EId)] = value; } else { CurrLen = VecOfStrVecsE.Len(); KeyToIndexTypeE.AddDat(attr, TIntPr(StrType, CurrLen)); TVec<TStr> NewVec = TVec<TStr>(); for (i = 0; i < MxEId; i++) { NewVec.Ins(i, GetStrAttrDefaultE(attr)); } NewVec[EdgeH.GetKeyId(EId)] = value; VecOfStrVecsE.Add(NewVec); } return 0; }
bool TNEANet::EdgeAttrIsStrDeleted(const int& EId, const TStrIntPrH::TIter& EdgeHI) const { return (EdgeHI.GetDat().Val1 == StrType && GetStrAttrDefaultE(EdgeHI.GetKey()) == this->VecOfStrVecsE.GetVal( this->KeyToIndexTypeE.GetDat(EdgeHI.GetKey()).Val2).GetVal(EId)); }