def block_CG(A_,B_):
"""
block version of CG. Get solution to matrix equation AX = B, ie
X = A^-1 * B. Will be much faster than Cholesky for large-scale problems.
"""
n = tf.shape(B_)[0]
m = tf.shape(B_)[1]
X = tf.zeros((n,m))
V_ = tf.zeros((n,m))
R = B_
R_ = tf.matrix_set_diag(tf.zeros((n,m)),tf.ones([m]))
#somewhat arbitrary again, may want to check sensitivity
CG_EPS = tf.cast(n/1000,"float")
MAX_ITER = tf.div(n,250) + 3
def cond(i,X,R_,R,V_):
return tf.logical_and(i < MAX_ITER, tf.norm(R) > CG_EPS)
def body(i,X,R_,R,V_):
S = tf.matrix_solve(tf.matmul(tf.transpose(R_),R_),
tf.matmul(tf.transpose(R),R))
V = R + tf.matmul(V_,S)
T = tf.matrix_solve(tf.matmul(tf.transpose(V),tf.matmul(A_,V)),
tf.matmul(tf.transpose(R),R))
X = X + tf.matmul(V,T)
V_ = V
R_ = R
R = R - tf.matmul(A_,tf.matmul(V,T))
return i+1,X,R_,R,V_
i = tf.constant(0)
i,X,_,_,_ = tf.while_loop(cond,body,[i,X,R_,R,V_])
return X
评论列表
文章目录