Files
SAPFOR/src/Distribution/GraphCSR.h
2025-03-12 14:28:04 +03:00

172 lines
8.4 KiB
C++

#pragma once
#include <vector>
#include <map>
#include <set>
#include <tuple>
#include "../Utils/RationalNum.h"
typedef enum links { RR_link, WR_link, WW_link } LinkType;
#define MAX_LOOP_DIM 8
#define MAX_CHAIN_LEN 8
namespace Distribution
{
class Array;
template<typename vType> class Arrays;
template<typename vType, typename wType, typename attrType> class Cycle;
template<typename vType, typename wType, typename attrType>
class GraphCSR
{
private:
vType numVerts;
vType numEdges;
vType lastNumOfV;
std::vector<vType> neighbors;
std::vector<vType> edges;
std::vector<wType> weights;
std::vector<uint8_t> linkType;
std::vector<attrType> attributes;
std::vector<vType> localIdx;
std::vector<vType> globalIdx;
//for finding
std::vector<vType> color;
vType *activeV;
vType *activeE;
std::pair<wType, attrType> *activeArcs;
uint64_t usedMem;
std::vector<std::pair<int, int>> treesQuality;
int activeCounter;
vType findFrom;
bool hardLinksWasUp;
int maxChainLen;
int maxLoopDim;
uint64_t maxAvailMemory;
std::map<vType, std::map<vType, std::tuple<int, Array*, std::pair<RationalNum, RationalNum>>>> cacheLinks;
int countRequestsToAdd, countMissToAdd;
private:
GraphCSR(const std::vector<vType> &neighbors, const std::vector<vType> &edges,
const std::vector<wType> &weights, const std::vector<vType> &localIdx,
const std::vector<vType> &globalIdx, const std::vector<attrType> &attributes,
const std::vector<uint8_t> &linkType, const bool hardLinksWasUp) :
neighbors(neighbors), edges(edges), weights(weights), localIdx(localIdx),
globalIdx(globalIdx), attributes(attributes), linkType(linkType), hardLinksWasUp(hardLinksWasUp)
{
numVerts = (int)neighbors.size() - 1;
numEdges = (int)edges.size();
}
vType GetLocalVNum(const vType &V, bool &ifNew);
void AddEdgeToGraph(const vType &V1, const vType &V2, const wType &W, const attrType &attr, const bool &ifNew, const uint8_t linkType);
void IncreaseWeight(const int &idx, const int &idxRev, const wType &W);
int CheckExist(const vType &V1, const vType &V2, const attrType &attr, const bool &ifNew, const uint8_t &linkType);
//old algorithm without sort in the fly
//TODO: need to update
void FindLoop(std::vector<Cycle<vType, wType, attrType>> &cycles, const vType V, const vType VPrev);
void FindLoop(std::vector<std::map<std::vector<unsigned>, Cycle<vType, wType, attrType>>> &cycles, const vType V, const vType VPrev, const std::vector<vType> &numbers);
void RemoveDuplicates(std::vector<Cycle<vType, wType, attrType>> &cycles);
bool findLink(const vType v1, std::pair<int, int> &inGraphAttr1, const vType v2, std::pair<int, int> &inGraphAttr2);
std::pair<RationalNum, RationalNum> findLinkWithTempate2(const vType v1, int &templV, Array *&templ, const Arrays<vType> &allArrays, std::set<vType> wasDone);
int findDimNumLink(const vType v, const Array *to, const Arrays<vType> &allArrays, std::set<vType> &wasDone) const;
bool checkFirstCoefOfNode(vType node);
bool getOptimalBoundsForNode(vType nodeFrom, vType nodeTo, int &needBound, std::pair<int, int> &bounds);
bool hasLinkWithTempate(const vType root, const Arrays<vType> &allArrays, bool, int newValue = 0);
public:
GraphCSR()
{
ClearGraphCSR();
}
GraphCSR(const GraphCSR &G) : GraphCSR(G.neighbors, G.edges, G.weights, G.localIdx, G.globalIdx, G.attributes, G.linkType, G.hardLinksWasUp)
{
this->lastNumOfV = G.lastNumOfV;
this->maxLoopDim = G.maxLoopDim;
this->maxChainLen = G.maxChainLen;
this->maxAvailMemory = G.maxAvailMemory;
this->countRequestsToAdd = G.countRequestsToAdd;
this->countMissToAdd = G.countMissToAdd;
this->treesQuality = G.treesQuality;
}
void cleanCacheLinks() { cacheLinks.clear(); }
void ClearGraphCSR()
{
lastNumOfV = numVerts = numEdges = 0;
hardLinksWasUp = false;
neighbors.resize(0);
edges.resize(0);
weights.resize(0);
linkType.resize(0);
localIdx.resize(0);
globalIdx.resize(0);
attributes.resize(0);
treesQuality.resize(0);
maxLoopDim = MAX_LOOP_DIM;
maxChainLen = MAX_CHAIN_LEN;
maxAvailMemory = 0;
countRequestsToAdd = 0;
countMissToAdd = 0;
}
std::set<vType> FindTrees(std::vector<vType> &inTree, std::vector<std::vector<vType>> &vertByTrees);
bool SaveGraphToFile(FILE *file);
bool LoadGraphFromFile(FILE *file);
int AddToGraph(const vType &V1, const vType &V2, const wType &W, const attrType &attr, const uint8_t linkType);
void GetAllSimpleLoops(std::vector<std::vector<Cycle<vType, wType, attrType>>> &cycles, bool needPrint, bool useSavedQ);
int SortLoopsBySize(std::vector<Cycle<vType, wType, attrType>> &cycles, bool needPrint);
int SortLoopsByWeight(std::vector<Cycle<vType, wType, attrType>> &cycles, bool needPrint);
int GetConflictCycles(const std::vector<Cycle<vType, wType, attrType>> &cycles, const Arrays<vType> &allArrays, std::vector<std::pair<int, int>> &indexOfConflict, bool needPrint);
void RemoveMultipleArcsByWeights();
void RemoveMultipleArcsOptimal();
void RemoveVerticesByWeight();
int CreateGraphWiz(const char *fileName, const std::vector<std::tuple<vType, vType, attrType>> &toDelArcs, const Arrays<vType> &allArrays, const bool onlyTree);
void RemovedEdges(const std::vector<std::tuple<vType, vType, attrType>> &toDelArcs, const Arrays<vType> &allArrays);
void HighlightLinks();
int GetAlignRuleForArray(Array *inputArray, const Arrays<vType> &allArrays, std::vector<std::vector<std::tuple<Array*, vType, attrType>>> &assignedArrays);
int GetAlignRuleWithTemplate(Array *inputArray, const Arrays<vType> &allArrays, std::vector<std::tuple<Array*, vType, std::pair<int, int>>> &rules, const uint64_t regionId);
void FindLinksBetweenArrays(const Arrays<vType> &allArrays, const Array *from, const Array *to, std::vector<int> &links) const;
void FindLinkWithMaxDim(const vType from, const Arrays<vType> &allArrays, std::pair<Array*, int> &result, std::set<int> &wasDone);
int FindAllArraysTrees(std::map<Array*, int> &trees, const Arrays<vType> &allArrays);
vType GetNumberOfV() const { return numVerts; }
vType GetNumberOfE() const { return numEdges; }
void SetMaxLoopDim(const int newMaxLoopDim) { maxLoopDim = newMaxLoopDim; }
void SetMaxChainLen(const int newMaxChainLen) { maxChainLen = newMaxChainLen; }
int GetMaxLoopDim() const { return maxLoopDim; }
int GetMaxChainLen() const { return maxChainLen; }
void SetMaxAvailMemory(const uint64_t memSize) { maxAvailMemory = memSize; }
void ChangeQuality(const int newMaxLoopDim, const int newMaxChainLen) { SetMaxLoopDim(newMaxLoopDim); SetMaxChainLen(newMaxChainLen); }
int getCountOfReq() const { return countRequestsToAdd; }
int getCountOfMiss() const { return countMissToAdd; }
std::vector<attrType> GetAllAttributes(const int vert) const;
int CountOfConnected(const vType startV) const;
int CountOfConnectedForArray(const vType startV) const;
std::vector<std::tuple<vType, vType, attrType>> CreateMaximumSpanningTree();
std::pair<int, int> MakeConnected(const vType startV, std::vector<unsigned char> &inSet) const;
double CalculateSumOfWeights() const
{
double ret = 0;
for (int z = 0; z < weights.size(); ++z)
ret += weights[z] / 2.0;
return ret;
}
void RemoveAllEdgesFromGraph(const std::map<Array*, std::vector<std::pair<int, int>>>& toDel, const Arrays<vType>& allArrays);
};
std::pair<int, int> Fx(const std::pair<int, int> &x, const std::pair<int, int> &F);
}