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);
 }
}