Graph 构造Chapel中的稀疏热带极限函数
给定矩阵Graph 构造Chapel中的稀疏热带极限函数,graph,sparse-matrix,hpc,convergence,chapel,Graph,Sparse Matrix,Hpc,Convergence,Chapel,给定矩阵A和B,热带乘积被定义为通常的矩阵乘积,乘法换成加法,加法换成最小值。也就是说,它返回一个新的矩阵C,这样 C_ij=最小值(A_ij,B_ij,A_i1+B_1j,A_i2+B_12,…,A_im+B_mj) 给定图g的基本邻接矩阵A\u g,与热带乘积相关的n的“功率”表示节点之间最多可通过n步数达到的连接。也就是说,如果节点i和j由mk分隔,则C_ij=(A**n)_ij具有值m,并且矩阵D_ij=A**k被称为表示图中所有节点之间距离的“距离矩阵”项 我在chapel中编写了一
A
和B
,热带乘积被定义为通常的矩阵乘积,乘法换成加法,加法换成最小值。也就是说,它返回一个新的矩阵C
,这样
C_ij=最小值(A_ij,B_ij,A_i1+B_1j,A_i2+B_12,…,A_im+B_mj)
给定图g
的基本邻接矩阵A\u g
,与热带乘积相关的n
的“功率”表示节点之间最多可通过n
步数达到的连接。也就是说,如果节点i
和j
由mk
分隔,则C_ij=(A**n)_ij
具有值m
,并且矩阵D_ij=A**k
被称为表示图中所有节点之间距离的“距离矩阵”项
我在chapel中编写了一个热带积函数,我想编写一个函数,它接受邻接矩阵并返回结果距离矩阵。我尝试过以下方法,但没有效果。我们将非常感谢您对克服这些错误的指导
proc tropicLimit(A:[] real,B:[] real) {
var R = tropic(A,B);
if A == R {
return A;
} else {
tropicLimit(R,B);
}
}
这引发了域不匹配错误,因此我进行了以下编辑:
proc tropicLimit(A:[] real,B:[] real) {
var R = tropic(A,B);
if A.domain == R.domain {
if && reduce (A == R) {
return R;
} else {
tropicLimit(R,B);
}
} else {
tropicLimit(R,B);
}
}
哪个扔
src/MatrixOps.chpl:602:错误:控件到达返回值的函数末尾
让我回到这个错误
src/MatrixOps.chpl:605:error:halt-reated-稀疏数组只能使用其域和同级数组(CS布局)压缩
我还尝试使用带有中断
条件的for
循环,但也不起作用
proc tropicLimit(B:[] real) {
var R = tropic(B,B);
for n in B.domain.dim(2) {
var S = tropic(R,B);
if S.domain != R.domain {
R = S; // Intended to just reassign the handle "R" to the contents of "S" i.o.w. destructive update of R
} else {
break;
}
}
return R;
}
有什么建议吗
src/MatrixOps.chpl:605:error:halt-reated-除了其域和同级数组(CS布局)之外,无法对稀疏数组进行压缩
我相信您在当前的实现中遇到了压缩稀疏数组的限制,如中所述
除去等式中的一些未知数,我相信这段经过提炼的代码片段演示了您遇到的问题:
use LayoutCS;
var dom = {1..10, 1..10};
var Adom: sparse subdomain(dom) dmapped CS();
var Bdom: sparse subdomain(dom) dmapped CS();
var A: [Adom] real;
var B: [Bdom] real;
Adom += (1,1);
Bdom += (1,1);
A[1,1] = 1.0;
B[1,1] = 2.0;
writeln(A.domain == B.domain); // true
var willThisWork = && reduce (A == B);
// dang.chpl:19: error: halt reached - Sparse arrays can't be zippered with
// anything other than their domains and sibling arrays (CS layout)
作为一种解决方法,我建议在确认域相等并执行和&reduce
后,在稀疏索引上循环。这是可以包装在助手函数中的内容,例如
proc main() {
var dom = {1..10, 1..10};
var Adom: sparse subdomain(dom) dmapped CS();
var Bdom: sparse subdomain(dom) dmapped CS();
var A: [Adom] real;
var B: [Bdom] real;
Adom += (1,1);
Bdom += (1,1);
A[1,1] = 1.0;
B[1,1] = 2.0;
if A.domain == B.domain {
writeln(equal(A, B));
}
}
/* Some day, this should be A.equals(B) ! */
proc equal(A: [], B: []) {
// You could also return 'false' if domains do not match
assert(A.domain == B.domain);
var s = true;
forall (i,j) in A.domain with (&& reduce s) {
s &&= (A[i,j] == B[i,j]);
}
return s;
}
src/MatrixOps.chpl:602:错误:控件到达返回值的函数末尾
此错误是由于没有在每种情况下返回某些内容造成的。我相信你打算:
proc tropicLimit(A:[] real,B:[] real) {
var R = tropic(A,B);
if A.domain == R.domain {
if && reduce (A == R) {
return R;
} else {
return tropicLimit(R,B);
}
} else {
return tropicLimit(R,B);
}
}
其实只有一个问题。我还举了几个我试过但没用的例子。编译器无法使用您建议的这两种编辑解析返回类型
proc tropicLimit(A:[] real,B:[] real) {
var R = tropic(A,B);
if A.domain == R.domain {
if && reduce (A == R) {
return R;
} else {
return tropicLimit(R,B);
}
} else {
return tropicLimit(R,B);
}
}