+uint convertSize(uint cost) {
+ cost = 1.2 * cost; // fudge factor
+ return NEXTPOW2(cost);
+}
+
+void EncodingGraph::decideEdges() {
+ uint size=edgeVector.getSize();
+ for(uint i=0; i<size; i++) {
+ EncodingEdge *ee = edgeVector.get(i);
+ EncodingNode *left = ee->left;
+ EncodingNode *right = ee->right;
+
+ if (ee->encoding != EDGE_UNASSIGNED ||
+ left->encoding != BINARYINDEX ||
+ right->encoding != BINARYINDEX)
+ continue;
+
+ uint64_t eeValue = ee->getValue();
+ if (eeValue == 0)
+ return;
+
+ EncodingSubGraph *leftGraph = graphMap.get(left);
+ EncodingSubGraph *rightGraph = graphMap.get(right);
+ if (leftGraph == NULL && rightGraph !=NULL) {
+ EncodingNode *tmp = left; left=right; right=tmp;
+ EncodingSubGraph *tmpsg = leftGraph; leftGraph = rightGraph; rightGraph = tmpsg;
+ }
+
+ uint leftSize=0, rightSize=0, newSize=0;
+ uint64_t totalCost=0;
+ if (leftGraph == NULL && rightGraph == NULL) {
+ leftSize=convertSize(left->getSize());
+ rightSize=convertSize(right->getSize());
+ newSize=convertSize(left->s->getUnionSize(right->s));
+ newSize=(leftSize > newSize) ? leftSize: newSize;
+ newSize=(rightSize > newSize) ? rightSize: newSize;
+ totalCost = (newSize - leftSize) * left->elements.getSize() +
+ (newSize - rightSize) * right->elements.getSize();
+ } else if (leftGraph != NULL && rightGraph == NULL) {
+ leftSize=convertSize(leftGraph->encodingSize);
+ rightSize=convertSize(right->getSize());
+ newSize=convertSize(leftGraph->estimateNewSize(right));
+ newSize=(leftSize > newSize) ? leftSize: newSize;
+ newSize=(rightSize > newSize) ? rightSize: newSize;
+ totalCost = (newSize - leftSize) * leftGraph->numElements +
+ (newSize - rightSize) * right->elements.getSize();
+ } else {
+ //Neither are null
+ leftSize=convertSize(leftGraph->encodingSize);
+ rightSize=convertSize(rightGraph->encodingSize);
+ newSize=convertSize(leftGraph->estimateNewSize(rightGraph));
+ newSize=(leftSize > newSize) ? leftSize: newSize;
+ newSize=(rightSize > newSize) ? rightSize: newSize;
+ totalCost = (newSize - leftSize) * leftGraph->numElements +
+ (newSize - rightSize) * rightGraph->numElements;
+ }
+ double conversionfactor = 0.5;
+ if ((totalCost * conversionfactor) < eeValue) {
+ //add the edge
+ mergeNodes(left, right);
+ }
+ }
+}
+