NCV6.0会计平台技术详解:统一业务对象转换框架

版权申诉
5星 · 超过95%的资源 1 下载量 6 浏览量 更新于2024-07-06 收藏 638KB DOC 举报
"NCV61-会计平台技术红皮书" 本文档,即"NC-V6.0-会计平台-技术红皮书"由郭宝华创建,专注于介绍会计平台在NC6.0版本中的技术细节,特别是它提供的服务以及与其他系统间的交互方式。其目的是为了指导业务系统如何通过会计平台与其他业务系统进行业务实体转换,适应多组织结构的集团应用,并支持灵活的配置以满足不同业务需求。 设计原则与前提是将会计平台抽象为一个统一的业务对象转换框架,支持业务单据转换为财务凭证或责任凭证。该平台的设计考虑了以下几点: 1. 支持6.0版本的多组织结构,以适应集团级别的应用需求。 2. 允许业务单据转换为多个目标对象,如总账凭证、责任会计凭证或其他行业特定的成本单据,且转换配置可灵活调整。 3. 提供推式和拉式对象转换模式,以适应不同的业务流程。 4. 支持来源对象和目标对象的汇总处理。 5. 设计时考虑了转换规则、汇总规则、取数规则及关联关系的扩展性,便于行业插件的集成。 在名词解释部分,文档可能会定义与会计平台相关的专业术语,以便于读者理解。 总体架构设计部分,文档会展示会计平台的整体框架图,以图形化的方式展示各组件间的交互关系。虽然具体内容未给出,但可以推测会包括核心服务、数据处理模块、接口等关键元素。 核心模型设计中,主要业务模型被详细阐述,包括三种不同的工作模式: 1. 推式不汇总立即生成模型,这是默认模式,适用于财务业务一体化,要求业务确认后财务立即反映的场景。 2. 推式不汇总条件生成模式,适用于财务业务关联性不强,不要求实时同步的场景。 3. 推式,汇总来源单据模式,适用于来源单据数据量大,需要汇总处理的情况。 每个模型都会详细说明涉及的服务和接口,例如消息发送服务(IFipMessageService),该服务包含两个方法,用于发送单个或批量的消息到会计平台。 "NCV61-会计平台技术红皮书"深入探讨了会计平台的核心功能、设计原理和工作流程,对于理解如何在NC6.0环境中实现业务与财务数据的有效转换具有重要意义。它提供了丰富的技术细节,有助于开发者和分析师进行系统分析、设计和开发。

class SVDRecommender: def init(self, k=50, ncv=None, tol=0, which='LM', v0=None, maxiter=None, return_singular_vectors=True, solver='arpack'): self.k = k self.ncv = ncv self.tol = tol self.which = which self.v0 = v0 self.maxiter = maxiter self.return_singular_vectors = return_singular_vectors self.solver = solver def svds(self, A): if which == 'LM': largest = True elif which == 'SM': largest = False else: raise ValueError("which must be either 'LM' or 'SM'.") if not (isinstance(A, LinearOperator) or isspmatrix(A) or is_pydata_spmatrix(A)): A = np.asarray(A) n, m = A.shape if k <= 0 or k >= min(n, m): raise ValueError("k must be between 1 and min(A.shape), k=%d" % k) if isinstance(A, LinearOperator): if n > m: X_dot = A.matvec X_matmat = A.matmat XH_dot = A.rmatvec XH_mat = A.rmatmat else: X_dot = A.rmatvec X_matmat = A.rmatmat XH_dot = A.matvec XH_mat = A.matmat dtype = getattr(A, 'dtype', None) if dtype is None: dtype = A.dot(np.zeros([m, 1])).dtype else: if n > m: X_dot = X_matmat = A.dot XH_dot = XH_mat = _herm(A).dot else: XH_dot = XH_mat = A.dot X_dot = X_matmat = _herm(A).dot def matvec_XH_X(x): return XH_dot(X_dot(x)) def matmat_XH_X(x): return XH_mat(X_matmat(x)) XH_X = LinearOperator(matvec=matvec_XH_X, dtype=A.dtype, matmat=matmat_XH_X, shape=(min(A.shape), min(A.shape))) # Get a low rank approximation of the implicitly defined gramian matrix. eigvals, eigvec = eigsh(XH_X, k=k, tol=tol ** 2, maxiter=maxiter, ncv=ncv, which=which, v0=v0) # Gramian matrix has real non-negative eigenvalues. eigvals = np.maximum(eigvals.real, 0) # Use complex detection of small eigenvalues from pinvh. t = eigvec.dtype.char.lower() factor = {'f': 1E3, 'd': 1E6} cond = factor[t] * np.finfo(t).eps cutoff = cond * np.max(eigvals) # Get a mask indicating which eigenpairs are not degenerate tiny, # and create a reordering array for thresholded singular values. above_cutoff = (eigvals > cutoff) nlarge = above_cutoff.sum() nsmall = k - nlarge slarge = np.sqrt(eigvals[above_cutoff]) s = np.zeros_like(eigvals) s[:nlarge] = slarge if not return_singular_vectors: return np.sort(s) if n > m: vlarge = eigvec[:, above_cutoff] ularge = X_matmat(vlarge) / slarge if return_singular_vectors != 'vh' else None vhlarge = _herm(vlarge) else: ularge = eigvec[:, above_cutoff] vhlarge = _herm(X_matmat(ularge) / slarge) if return_singular_vectors != 'u' else None u = _augmented_orthonormal_cols(ularge, nsmall) if ularge is not None else None vh = _augmented_orthonormal_rows(vhlarge, nsmall) if vhlarge is not None else None indexes_sorted = np.argsort(s) s = s[indexes_sorted] if u is not None: u = u[:, indexes_sorted] if vh is not None: vh = vh[indexes_sorted] return u, s, vh将这段代码放入一个.py文件中,用Spyder查看,有报错,可能是缩进有问题,无法被调用,根据这个问题,给出解决办法,给出改正后的完整代码

2023-06-07 上传