mirror of
https://gitee.com/BDWare/cp.git
synced 2025-01-10 01:44:08 +00:00
feat: generate tree
This commit is contained in:
parent
0b253a4625
commit
c0c580090e
@ -71,7 +71,7 @@ jar {
|
|||||||
// while develop at local use "false"
|
// while develop at local use "false"
|
||||||
configurations.runtimeClasspath.filter {
|
configurations.runtimeClasspath.filter {
|
||||||
it.getAbsolutePath().contains("/lib/")
|
it.getAbsolutePath().contains("/lib/")
|
||||||
false
|
// false
|
||||||
}.collect {
|
}.collect {
|
||||||
it.isDirectory() ? it : zipTree(it)
|
it.isDirectory() ? it : zipTree(it)
|
||||||
}
|
}
|
||||||
|
@ -3,30 +3,48 @@ package org.bdware.sc.crdt.planning;
|
|||||||
public class PlanningTest {
|
public class PlanningTest {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
int[] writers = new int[100];
|
final int nodeIdsCount = 1800;
|
||||||
int[] readers = new int[100];
|
final int writerCount = 1000;
|
||||||
|
final int readerCount = 1000;
|
||||||
|
String[] nodeIds = new String[nodeIdsCount];
|
||||||
|
int[] writers = new int[writerCount];
|
||||||
|
int[] readers = new int[readerCount];
|
||||||
|
for (int i = 0; i < nodeIdsCount; ++i) {
|
||||||
|
nodeIds[i] = "node_" + i;
|
||||||
|
if (i < writerCount) {
|
||||||
|
writers[i] = i;
|
||||||
|
}
|
||||||
|
if (i >= nodeIdsCount - readerCount) {
|
||||||
|
readers[i - nodeIdsCount + readerCount] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
long maxDelay = 60;
|
long maxDelay = 60;
|
||||||
int bandwidthUpload = 10 * 1024 * 1024;
|
int bandwidthUpload = 100 * 1024 * 1024;
|
||||||
int bandwidthDownload = 10 * 1024 * 1024;
|
int bandwidthDownload = 100 * 1024 * 1024;
|
||||||
int datasize = 100 * 1024;
|
int datasize = 10 * 1024;
|
||||||
double domainSize = 100 * datasize;
|
double domainSize = 100 * datasize;
|
||||||
|
|
||||||
PlanningWith0Expansivity planning0 = new PlanningWith0Expansivity(writers, readers, maxDelay, bandwidthDownload, bandwidthUpload, datasize);
|
PlanningWith0Expansivity planning0 = new PlanningWith0Expansivity(nodeIds, writers, readers, maxDelay, bandwidthDownload, bandwidthUpload, datasize);
|
||||||
PlanningWithkExpansivity planningK = new PlanningWithkExpansivity(writers, readers, maxDelay, bandwidthDownload, bandwidthUpload, datasize, domainSize);
|
PlanningWithkExpansivity planningK = new PlanningWithkExpansivity(nodeIds, writers, readers, maxDelay, bandwidthDownload, bandwidthUpload, datasize, domainSize);
|
||||||
PlanningWith1Expansivity planning1 = new PlanningWith1Expansivity(writers, readers, maxDelay, bandwidthDownload, bandwidthUpload, datasize);
|
PlanningWith1Expansivity planning1 = new PlanningWith1Expansivity(nodeIds, writers, readers, maxDelay, bandwidthDownload, bandwidthUpload, datasize);
|
||||||
|
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
planning0.adjustAndCalc();
|
planning0.adjustAndCalc();
|
||||||
|
planning0.allocate();
|
||||||
long end = System.currentTimeMillis();
|
long end = System.currentTimeMillis();
|
||||||
System.out.println("took " + (end - start));
|
System.out.println("took " + (end - start));
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
start = System.currentTimeMillis();
|
start = System.currentTimeMillis();
|
||||||
planningK.adjustAndCalc();
|
planningK.adjustAndCalc();
|
||||||
|
planningK.allocate();
|
||||||
end = System.currentTimeMillis();
|
end = System.currentTimeMillis();
|
||||||
System.out.println("took " + (end - start));
|
System.out.println("took " + (end - start));
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
start = System.currentTimeMillis();
|
start = System.currentTimeMillis();
|
||||||
planning1.adjustAndCalc();
|
planning1.adjustAndCalc();
|
||||||
|
planning1.allocate();
|
||||||
end = System.currentTimeMillis();
|
end = System.currentTimeMillis();
|
||||||
System.out.println("took " + (end - start));
|
System.out.println("took " + (end - start));
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
package org.bdware.sc.crdt.planning;
|
package org.bdware.sc.crdt.planning;
|
||||||
|
|
||||||
public class PlanningWith0Expansivity extends SharableNetworkPlanning {
|
public class PlanningWith0Expansivity extends SharableNetworkPlanning {
|
||||||
public PlanningWith0Expansivity(int[] writers, int[] readers, long maxDelay, int bandwidthDownload, int bandwidthUpload, int dataSize) {
|
public PlanningWith0Expansivity(String[] nodeIds, int[] writers, int[] readers, long maxDelay, int bandwidthDownload, int bandwidthUpload, int dataSize) {
|
||||||
|
this.nodeIds = nodeIds;
|
||||||
this.writers = writers;
|
this.writers = writers;
|
||||||
this.readers = readers;
|
this.readers = readers;
|
||||||
this.maxDelay = maxDelay;
|
this.maxDelay = maxDelay;
|
||||||
@ -61,6 +62,7 @@ public class PlanningWith0Expansivity extends SharableNetworkPlanning {
|
|||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
|
String[] nodeIds = new String[1500];
|
||||||
int[] writers = new int[1000];
|
int[] writers = new int[1000];
|
||||||
int[] readers = new int[1000];
|
int[] readers = new int[1000];
|
||||||
long maxDelay = 60;
|
long maxDelay = 60;
|
||||||
@ -68,7 +70,7 @@ public class PlanningWith0Expansivity extends SharableNetworkPlanning {
|
|||||||
int bandwidthDownload = 10 * 1024 * 1024;
|
int bandwidthDownload = 10 * 1024 * 1024;
|
||||||
int datasize = 10 * 1024;
|
int datasize = 10 * 1024;
|
||||||
|
|
||||||
PlanningWith0Expansivity planning = new PlanningWith0Expansivity(writers, readers, maxDelay, bandwidthDownload, bandwidthUpload, datasize);
|
PlanningWith0Expansivity planning = new PlanningWith0Expansivity(nodeIds, writers, readers, maxDelay, bandwidthDownload, bandwidthUpload, datasize);
|
||||||
|
|
||||||
long minTotalData = Long.MAX_VALUE;
|
long minTotalData = Long.MAX_VALUE;
|
||||||
String result = "";
|
String result = "";
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
package org.bdware.sc.crdt.planning;
|
package org.bdware.sc.crdt.planning;
|
||||||
|
|
||||||
public class PlanningWith1Expansivity extends SharableNetworkPlanning {
|
public class PlanningWith1Expansivity extends SharableNetworkPlanning {
|
||||||
public PlanningWith1Expansivity(int[] writers, int[] readers, long maxDelay, int bandwidthDownload, int bandwidthUpload, int dataSize) {
|
public PlanningWith1Expansivity(String[] nodeIds, int[] writers, int[] readers, long maxDelay, int bandwidthDownload, int bandwidthUpload, int dataSize) {
|
||||||
|
this.nodeIds = nodeIds;
|
||||||
this.writers = writers;
|
this.writers = writers;
|
||||||
this.readers = readers;
|
this.readers = readers;
|
||||||
this.maxDelay = maxDelay;
|
this.maxDelay = maxDelay;
|
||||||
@ -61,6 +62,7 @@ public class PlanningWith1Expansivity extends SharableNetworkPlanning {
|
|||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
|
String[] nodeIds = new String[1500];
|
||||||
int[] writers = new int[1000];
|
int[] writers = new int[1000];
|
||||||
int[] readers = new int[1000];
|
int[] readers = new int[1000];
|
||||||
long maxDelay = 60;
|
long maxDelay = 60;
|
||||||
@ -68,7 +70,7 @@ public class PlanningWith1Expansivity extends SharableNetworkPlanning {
|
|||||||
int bandwidthDownload = 10 * 1024 * 1024;
|
int bandwidthDownload = 10 * 1024 * 1024;
|
||||||
int datasize = 10 * 1024;
|
int datasize = 10 * 1024;
|
||||||
|
|
||||||
PlanningWith1Expansivity planning = new PlanningWith1Expansivity(writers, readers, maxDelay, bandwidthDownload, bandwidthUpload, datasize);
|
PlanningWith1Expansivity planning = new PlanningWith1Expansivity(nodeIds, writers, readers, maxDelay, bandwidthDownload, bandwidthUpload, datasize);
|
||||||
|
|
||||||
long minTotalData = Long.MAX_VALUE;
|
long minTotalData = Long.MAX_VALUE;
|
||||||
String result = "";
|
String result = "";
|
||||||
|
@ -5,7 +5,8 @@ public class PlanningWithkExpansivity extends SharableNetworkPlanning {
|
|||||||
|
|
||||||
private double domainSize;
|
private double domainSize;
|
||||||
|
|
||||||
public PlanningWithkExpansivity(int[] writers, int[] readers, long maxDelay, int bandwidthDownload, int bandwidthUpload, int dataSize, double domainSize) {
|
public PlanningWithkExpansivity(String[] nodeIds, int[] writers, int[] readers, long maxDelay, int bandwidthDownload, int bandwidthUpload, int dataSize, double domainSize) {
|
||||||
|
this.nodeIds = nodeIds;
|
||||||
this.writers = writers;
|
this.writers = writers;
|
||||||
this.readers = readers;
|
this.readers = readers;
|
||||||
this.maxDelay = maxDelay;
|
this.maxDelay = maxDelay;
|
||||||
@ -84,6 +85,7 @@ public class PlanningWithkExpansivity extends SharableNetworkPlanning {
|
|||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
|
String[] nodeIds = new String[1500];
|
||||||
int[] writers = new int[1000];
|
int[] writers = new int[1000];
|
||||||
int[] readers = new int[1000];
|
int[] readers = new int[1000];
|
||||||
long maxDelay = 60;
|
long maxDelay = 60;
|
||||||
@ -92,7 +94,7 @@ public class PlanningWithkExpansivity extends SharableNetworkPlanning {
|
|||||||
int datasize = 10 * 1024;
|
int datasize = 10 * 1024;
|
||||||
double domainSize = 1000 * 1024;
|
double domainSize = 1000 * 1024;
|
||||||
|
|
||||||
PlanningWithkExpansivity planning = new PlanningWithkExpansivity(writers, readers, maxDelay, bandwidthDownload, bandwidthUpload, datasize, domainSize);
|
PlanningWithkExpansivity planning = new PlanningWithkExpansivity(nodeIds, writers, readers, maxDelay, bandwidthDownload, bandwidthUpload, datasize, domainSize);
|
||||||
|
|
||||||
planning.adjustAndCalc();
|
planning.adjustAndCalc();
|
||||||
|
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package org.bdware.sc.crdt.planning;
|
package org.bdware.sc.crdt.planning;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
public class SharableNetworkPlanning {
|
public class SharableNetworkPlanning {
|
||||||
|
protected String[] nodeIds;
|
||||||
protected int[] writers;
|
protected int[] writers;
|
||||||
protected int[] readers;
|
protected int[] readers;
|
||||||
protected long maxDelay;
|
protected long maxDelay;
|
||||||
@ -102,6 +105,71 @@ public class SharableNetworkPlanning {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void allocate() {
|
||||||
|
Set<Integer> writerOnlySet = new LinkedHashSet<>();
|
||||||
|
for (int i : writers) {
|
||||||
|
writerOnlySet.add(i);
|
||||||
|
}
|
||||||
|
Set<Integer> readerOnlySet = new LinkedHashSet<>();
|
||||||
|
Set<Integer> rwSet = new LinkedHashSet<>();
|
||||||
|
for (int i : readers) {
|
||||||
|
if (writerOnlySet.contains(i)) {
|
||||||
|
rwSet.add(i);
|
||||||
|
writerOnlySet.remove(i);
|
||||||
|
} else {
|
||||||
|
readerOnlySet.add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int[] writerParents = allocateTreeNode(writerOnlySet, rwSet, (int) rootCountW, (int) treeDegreeW);
|
||||||
|
int[] readerParents = allocateTreeNode(readerOnlySet, rwSet, (int) rootCountR, (int) treeDegreeR);
|
||||||
|
System.out.println(readerParents);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int[] allocateTreeNode(Set<Integer> onlySet, Set<Integer> rwSet, int rootCount, int degree) {
|
||||||
|
int[] result = new int[nodeIds.length];
|
||||||
|
Arrays.fill(result, -2);
|
||||||
|
|
||||||
|
Map<Integer, List<Integer>> children = new HashMap<>();
|
||||||
|
Deque<Integer> notFullNodesIdx = new LinkedList<>();
|
||||||
|
for (Integer idx : onlySet) {
|
||||||
|
if (children.size() < rootCount) {
|
||||||
|
children.put(idx, new ArrayList<>());
|
||||||
|
notFullNodesIdx.add(idx);
|
||||||
|
result[idx] = -1;
|
||||||
|
} else {
|
||||||
|
int parentIdx = notFullNodesIdx.peek();
|
||||||
|
children.computeIfAbsent(parentIdx, k -> new ArrayList<>()).add(idx);
|
||||||
|
notFullNodesIdx.addLast(idx);
|
||||||
|
if (children.get(parentIdx).size() >= degree) {
|
||||||
|
notFullNodesIdx.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读写节点放在尽量靠近叶子节点,以便带宽的平衡
|
||||||
|
for (Integer idx : rwSet) {
|
||||||
|
if (children.size() < rootCount) {
|
||||||
|
children.put(idx, new ArrayList<>());
|
||||||
|
notFullNodesIdx.add(idx);
|
||||||
|
result[idx] = -1;
|
||||||
|
} else {
|
||||||
|
int parentIdx = notFullNodesIdx.peek();
|
||||||
|
children.computeIfAbsent(parentIdx, k -> new ArrayList<>()).add(idx);
|
||||||
|
notFullNodesIdx.addLast(idx);
|
||||||
|
if (children.get(parentIdx).size() >= degree) {
|
||||||
|
notFullNodesIdx.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Integer parentId : children.keySet()) {
|
||||||
|
for (int childId : children.get(parentId)) {
|
||||||
|
result[childId] = parentId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder result = new StringBuilder();
|
StringBuilder result = new StringBuilder();
|
||||||
|
Loading…
Reference in New Issue
Block a user