Best Python code snippet using hypothesis
lobpcg.py
Source:lobpcg.py  
1"""2Locally Optimal Block Preconditioned Conjugate Gradient Method (LOBPCG).3References4----------5.. [1] A. V. Knyazev (2001),6       Toward the Optimal Preconditioned Eigensolver: Locally Optimal7       Block Preconditioned Conjugate Gradient Method.8       SIAM Journal on Scientific Computing 23, no. 2,9       pp. 517-541. http://dx.doi.org/10.1137/S106482750036612410.. [2] A. V. Knyazev, I. Lashuk, M. E. Argentati, and E. Ovchinnikov (2007),11       Block Locally Optimal Preconditioned Eigenvalue Xolvers (BLOPEX)12       in hypre and PETSc.  https://arxiv.org/abs/0705.262613.. [3] A. V. Knyazev's C and MATLAB implementations:14       https://github.com/lobpcg/blopex15"""16from __future__ import division, print_function, absolute_import17import numpy as np18from scipy.linalg import (inv, eigh, cho_factor, cho_solve, cholesky, orth,19                          LinAlgError)20from scipy.sparse.linalg import aslinearoperator21from scipy.sparse.sputils import bmat22__all__ = ['lobpcg']23def _report_nonhermitian(M, name):24    """25    Report if `M` is not a hermitian matrix given its type.26    """27    from scipy.linalg import norm28    md = M - M.T.conj()29    nmd = norm(md, 1)30    tol = 10 * np.finfo(M.dtype).eps31    tol = max(tol, tol * norm(M, 1))32    if nmd > tol:33        print('matrix %s of the type %s is not sufficiently Hermitian:'34              % (name, M.dtype))35        print('condition: %.e < %e' % (nmd, tol))36def _as2d(ar):37    """38    If the input array is 2D return it, if it is 1D, append a dimension,39    making it a column vector.40    """41    if ar.ndim == 2:42        return ar43    else:  # Assume 1!44        aux = np.array(ar, copy=False)45        aux.shape = (ar.shape[0], 1)46        return aux47def _makeOperator(operatorInput, expectedShape):48    """Takes a dense numpy array or a sparse matrix or49    a function and makes an operator performing matrix * blockvector50    products."""51    if operatorInput is None:52        return None53    else:54        operator = aslinearoperator(operatorInput)55    if operator.shape != expectedShape:56        raise ValueError('operator has invalid shape')57    return operator58def _applyConstraints(blockVectorV, factYBY, blockVectorBY, blockVectorY):59    """Changes blockVectorV in place."""60    YBV = np.dot(blockVectorBY.T.conj(), blockVectorV)61    tmp = cho_solve(factYBY, YBV)62    blockVectorV -= np.dot(blockVectorY, tmp)63def _b_orthonormalize(B, blockVectorV, blockVectorBV=None, retInvR=False):64    """B-orthonormalize the given block vector using Cholesky."""65    normalization = blockVectorV.max(axis=0)+np.finfo(blockVectorV.dtype).eps66    blockVectorV = blockVectorV / normalization67    if blockVectorBV is None:68        if B is not None:69            blockVectorBV = B(blockVectorV)70        else:71            blockVectorBV = blockVectorV  # Shared data!!!72    else:73        blockVectorBV = blockVectorBV / normalization74    VBV = np.matmul(blockVectorV.T.conj(), blockVectorBV)75    try:76        # VBV is a Cholesky factor from now on...77        VBV = cholesky(VBV, overwrite_a=True)78        VBV = inv(VBV, overwrite_a=True)79        blockVectorV = np.matmul(blockVectorV, VBV)80        # blockVectorV = (cho_solve((VBV.T, True), blockVectorV.T)).T81        if B is not None:82            blockVectorBV = np.matmul(blockVectorBV, VBV)83            # blockVectorBV = (cho_solve((VBV.T, True), blockVectorBV.T)).T84        else:85            blockVectorBV = None86    except LinAlgError:87        #raise ValueError('Cholesky has failed')88        blockVectorV = None89        blockVectorBV = None90        VBV = None91    if retInvR:92        return blockVectorV, blockVectorBV, VBV, normalization93    else:94        return blockVectorV, blockVectorBV95def _get_indx(_lambda, num, largest):96    """Get `num` indices into `_lambda` depending on `largest` option."""97    ii = np.argsort(_lambda)98    if largest:99        ii = ii[:-num-1:-1]100    else:101        ii = ii[:num]102    return ii103def lobpcg(A, X,104           B=None, M=None, Y=None,105           tol=None, maxiter=None,106           largest=True, verbosityLevel=0,107           retLambdaHistory=False, retResidualNormsHistory=False):108    """Locally Optimal Block Preconditioned Conjugate Gradient Method (LOBPCG)109    LOBPCG is a preconditioned eigensolver for large symmetric positive110    definite (SPD) generalized eigenproblems.111    Parameters112    ----------113    A : {sparse matrix, dense matrix, LinearOperator}114        The symmetric linear operator of the problem, usually a115        sparse matrix.  Often called the "stiffness matrix".116    X : ndarray, float32 or float64117        Initial approximation to the ``k`` eigenvectors (non-sparse). If `A`118        has ``shape=(n,n)`` then `X` should have shape ``shape=(n,k)``.119    B : {dense matrix, sparse matrix, LinearOperator}, optional120        The right hand side operator in a generalized eigenproblem.121        By default, ``B = Identity``.  Often called the "mass matrix".122    M : {dense matrix, sparse matrix, LinearOperator}, optional123        Preconditioner to `A`; by default ``M = Identity``.124        `M` should approximate the inverse of `A`.125    Y : ndarray, float32 or float64, optional126        n-by-sizeY matrix of constraints (non-sparse), sizeY < n127        The iterations will be performed in the B-orthogonal complement128        of the column-space of Y. Y must be full rank.129    tol : scalar, optional130        Solver tolerance (stopping criterion).131        The default is ``tol=n*sqrt(eps)``.132    maxiter : int, optional133        Maximum number of iterations.  The default is ``maxiter = 20``.134    largest : bool, optional135        When True, solve for the largest eigenvalues, otherwise the smallest.136    verbosityLevel : int, optional137        Controls solver output.  The default is ``verbosityLevel=0``.138    retLambdaHistory : bool, optional139        Whether to return eigenvalue history.  Default is False.140    retResidualNormsHistory : bool, optional141        Whether to return history of residual norms.  Default is False.142    Returns143    -------144    w : ndarray145        Array of ``k`` eigenvalues146    v : ndarray147        An array of ``k`` eigenvectors.  `v` has the same shape as `X`.148    lambdas : list of ndarray, optional149        The eigenvalue history, if `retLambdaHistory` is True.150    rnorms : list of ndarray, optional151        The history of residual norms, if `retResidualNormsHistory` is True.152    Notes153    -----154    If both ``retLambdaHistory`` and ``retResidualNormsHistory`` are True,155    the return tuple has the following format156    ``(lambda, V, lambda history, residual norms history)``.157    In the following ``n`` denotes the matrix size and ``m`` the number158    of required eigenvalues (smallest or largest).159    The LOBPCG code internally solves eigenproblems of the size ``3m`` on every160    iteration by calling the "standard" dense eigensolver, so if ``m`` is not161    small enough compared to ``n``, it does not make sense to call the LOBPCG162    code, but rather one should use the "standard" eigensolver, e.g. numpy or163    scipy function in this case.164    If one calls the LOBPCG algorithm for ``5m > n``, it will most likely break165    internally, so the code tries to call the standard function instead.166    It is not that ``n`` should be large for the LOBPCG to work, but rather the167    ratio ``n / m`` should be large. It you call LOBPCG with ``m=1``168    and ``n=10``, it works though ``n`` is small. The method is intended169    for extremely large ``n / m``, see e.g., reference [28] in170    https://arxiv.org/abs/0705.2626171    The convergence speed depends basically on two factors:172    1. How well relatively separated the seeking eigenvalues are from the rest173       of the eigenvalues. One can try to vary ``m`` to make this better.174    2. How well conditioned the problem is. This can be changed by using proper175       preconditioning. For example, a rod vibration test problem (under tests176       directory) is ill-conditioned for large ``n``, so convergence will be177       slow, unless efficient preconditioning is used. For this specific178       problem, a good simple preconditioner function would be a linear solve179       for `A`, which is easy to code since A is tridiagonal.180    References181    ----------182    .. [1] A. V. Knyazev (2001),183           Toward the Optimal Preconditioned Eigensolver: Locally Optimal184           Block Preconditioned Conjugate Gradient Method.185           SIAM Journal on Scientific Computing 23, no. 2,186           pp. 517-541. http://dx.doi.org/10.1137/S1064827500366124187    .. [2] A. V. Knyazev, I. Lashuk, M. E. Argentati, and E. Ovchinnikov188           (2007), Block Locally Optimal Preconditioned Eigenvalue Xolvers189           (BLOPEX) in hypre and PETSc. https://arxiv.org/abs/0705.2626190    .. [3] A. V. Knyazev's C and MATLAB implementations:191           https://bitbucket.org/joseroman/blopex192    Examples193    --------194    Solve ``A x = lambda x`` with constraints and preconditioning.195    >>> import numpy as np196    >>> from scipy.sparse import spdiags, issparse197    >>> from scipy.sparse.linalg import lobpcg, LinearOperator198    >>> n = 100199    >>> vals = np.arange(1, n + 1)200    >>> A = spdiags(vals, 0, n, n)201    >>> A.toarray()202    array([[  1.,   0.,   0., ...,   0.,   0.,   0.],203           [  0.,   2.,   0., ...,   0.,   0.,   0.],204           [  0.,   0.,   3., ...,   0.,   0.,   0.],205           ...,206           [  0.,   0.,   0., ...,  98.,   0.,   0.],207           [  0.,   0.,   0., ...,   0.,  99.,   0.],208           [  0.,   0.,   0., ...,   0.,   0., 100.]])209    Constraints:210    >>> Y = np.eye(n, 3)211    Initial guess for eigenvectors, should have linearly independent212    columns. Column dimension = number of requested eigenvalues.213    >>> X = np.random.rand(n, 3)214    Preconditioner in the inverse of A in this example:215    >>> invA = spdiags([1./vals], 0, n, n)216    The preconditiner must be defined by a function:217    >>> def precond( x ):218    ...     return invA @ x219    The argument x of the preconditioner function is a matrix inside `lobpcg`,220    thus the use of matrix-matrix product ``@``.221    The preconditioner function is passed to lobpcg as a `LinearOperator`:222    >>> M = LinearOperator(matvec=precond, matmat=precond,223    ...                    shape=(n, n), dtype=float)224    Let us now solve the eigenvalue problem for the matrix A:225    >>> eigenvalues, _ = lobpcg(A, X, Y=Y, M=M, largest=False)226    >>> eigenvalues227    array([4., 5., 6.])228    Note that the vectors passed in Y are the eigenvectors of the 3 smallest229    eigenvalues. The results returned are orthogonal to those.230    """231    blockVectorX = X232    blockVectorY = Y233    residualTolerance = tol234    if maxiter is None:235        maxiter = 20236    if blockVectorY is not None:237        sizeY = blockVectorY.shape[1]238    else:239        sizeY = 0240    # Block size.241    if len(blockVectorX.shape) != 2:242        raise ValueError('expected rank-2 array for argument X')243    n, sizeX = blockVectorX.shape244    if verbosityLevel:245        aux = "Solving "246        if B is None:247            aux += "standard"248        else:249            aux += "generalized"250        aux += " eigenvalue problem with"251        if M is None:252            aux += "out"253        aux += " preconditioning\n\n"254        aux += "matrix size %d\n" % n255        aux += "block size %d\n\n" % sizeX256        if blockVectorY is None:257            aux += "No constraints\n\n"258        else:259            if sizeY > 1:260                aux += "%d constraints\n\n" % sizeY261            else:262                aux += "%d constraint\n\n" % sizeY263        print(aux)264    A = _makeOperator(A, (n, n))265    B = _makeOperator(B, (n, n))266    M = _makeOperator(M, (n, n))267    if (n - sizeY) < (5 * sizeX):268        # warn('The problem size is small compared to the block size.' \269        #        ' Using dense eigensolver instead of LOBPCG.')270        sizeX = min(sizeX, n)271        if blockVectorY is not None:272            raise NotImplementedError('The dense eigensolver '273                                      'does not support constraints.')274        # Define the closed range of indices of eigenvalues to return.275        if largest:276            eigvals = (n - sizeX, n-1)277        else:278            eigvals = (0, sizeX-1)279        A_dense = A(np.eye(n, dtype=A.dtype))280        B_dense = None if B is None else B(np.eye(n, dtype=B.dtype))281        vals, vecs = eigh(A_dense, B_dense, eigvals=eigvals,282                          check_finite=False)283        if largest:284            # Reverse order to be compatible with eigs() in 'LM' mode.285            vals = vals[::-1]286            vecs = vecs[:, ::-1]287        return vals, vecs288    if (residualTolerance is None) or (residualTolerance <= 0.0):289        residualTolerance = np.sqrt(1e-15) * n290    # Apply constraints to X.291    if blockVectorY is not None:292        if B is not None:293            blockVectorBY = B(blockVectorY)294        else:295            blockVectorBY = blockVectorY296        # gramYBY is a dense array.297        gramYBY = np.dot(blockVectorY.T.conj(), blockVectorBY)298        try:299            # gramYBY is a Cholesky factor from now on...300            gramYBY = cho_factor(gramYBY)301        except LinAlgError:302            raise ValueError('cannot handle linearly dependent constraints')303        _applyConstraints(blockVectorX, gramYBY, blockVectorBY, blockVectorY)304    ##305    # B-orthonormalize X.306    blockVectorX, blockVectorBX = _b_orthonormalize(B, blockVectorX)307    ##308    # Compute the initial Ritz vectors: solve the eigenproblem.309    blockVectorAX = A(blockVectorX)310    gramXAX = np.dot(blockVectorX.T.conj(), blockVectorAX)311    _lambda, eigBlockVector = eigh(gramXAX, check_finite=False)312    ii = _get_indx(_lambda, sizeX, largest)313    _lambda = _lambda[ii]314    eigBlockVector = np.asarray(eigBlockVector[:, ii])315    blockVectorX = np.dot(blockVectorX, eigBlockVector)316    blockVectorAX = np.dot(blockVectorAX, eigBlockVector)317    if B is not None:318        blockVectorBX = np.dot(blockVectorBX, eigBlockVector)319    ##320    # Active index set.321    activeMask = np.ones((sizeX,), dtype=bool)322    lambdaHistory = [_lambda]323    residualNormsHistory = []324    previousBlockSize = sizeX325    ident = np.eye(sizeX, dtype=A.dtype)326    ident0 = np.eye(sizeX, dtype=A.dtype)327    ##328    # Main iteration loop.329    blockVectorP = None  # set during iteration330    blockVectorAP = None331    blockVectorBP = None332    iterationNumber = -1333    restart = True334    explicitGramFlag = False335    while iterationNumber < maxiter:336        iterationNumber += 1337        if verbosityLevel > 0:338            print('iteration %d' % iterationNumber)339        if B is not None:340            aux = blockVectorBX * _lambda[np.newaxis, :]341        else:342            aux = blockVectorX * _lambda[np.newaxis, :]343        blockVectorR = blockVectorAX - aux344        aux = np.sum(blockVectorR.conj() * blockVectorR, 0)345        residualNorms = np.sqrt(aux)346        residualNormsHistory.append(residualNorms)347        ii = np.where(residualNorms > residualTolerance, True, False)348        activeMask = activeMask & ii349        if verbosityLevel > 2:350            print(activeMask)351        currentBlockSize = activeMask.sum()352        if currentBlockSize != previousBlockSize:353            previousBlockSize = currentBlockSize354            ident = np.eye(currentBlockSize, dtype=A.dtype)355        if currentBlockSize == 0:356            break357        if verbosityLevel > 0:358            print('current block size:', currentBlockSize)359            print('eigenvalue:', _lambda)360            print('residual norms:', residualNorms)361        if verbosityLevel > 10:362            print(eigBlockVector)363        activeBlockVectorR = _as2d(blockVectorR[:, activeMask])364        if iterationNumber > 0:365            activeBlockVectorP = _as2d(blockVectorP[:, activeMask])366            activeBlockVectorAP = _as2d(blockVectorAP[:, activeMask])367            if B is not None:368                activeBlockVectorBP = _as2d(blockVectorBP[:, activeMask])369        if M is not None:370            # Apply preconditioner T to the active residuals.371            activeBlockVectorR = M(activeBlockVectorR)372        ##373        # Apply constraints to the preconditioned residuals.374        if blockVectorY is not None:375            _applyConstraints(activeBlockVectorR,376                              gramYBY, blockVectorBY, blockVectorY)377        ##378        # B-orthogonalize the preconditioned residuals to X.379        if B is not None:380            activeBlockVectorR = activeBlockVectorR - np.matmul(blockVectorX,381                                 np.matmul(blockVectorBX.T.conj(),382                                 activeBlockVectorR))383        else:384            activeBlockVectorR = activeBlockVectorR - np.matmul(blockVectorX,385                                 np.matmul(blockVectorX.T.conj(),386                                 activeBlockVectorR))387        ##388        # B-orthonormalize the preconditioned residuals.389        aux = _b_orthonormalize(B, activeBlockVectorR)390        activeBlockVectorR, activeBlockVectorBR = aux391        activeBlockVectorAR = A(activeBlockVectorR)392        if iterationNumber > 0:393            if B is not None:394                aux = _b_orthonormalize(B, activeBlockVectorP,395                                        activeBlockVectorBP, retInvR=True)396                activeBlockVectorP, activeBlockVectorBP, invR, normal = aux397            else:398                aux = _b_orthonormalize(B, activeBlockVectorP, retInvR=True)399                activeBlockVectorP, _, invR, normal = aux400            # Function _b_orthonormalize returns None if Cholesky fails401            if activeBlockVectorP is not None:402                activeBlockVectorAP = activeBlockVectorAP / normal403                activeBlockVectorAP = np.dot(activeBlockVectorAP, invR)404                restart = False405            else:406                restart = True407        ##408        # Perform the Rayleigh Ritz Procedure:409        # Compute symmetric Gram matrices:410        if activeBlockVectorAR.dtype == 'float32':411            myeps = 1412        elif activeBlockVectorR.dtype == 'float32':413            myeps = 1e-4414        else:415            myeps = 1e-8416        if residualNorms.max() > myeps and not explicitGramFlag:417            explicitGramFlag = False418        else:419            # Once explicitGramFlag, forever explicitGramFlag.420            explicitGramFlag = True421        # Shared memory assingments to simplify the code422        if B is None:423            blockVectorBX = blockVectorX424            activeBlockVectorBR = activeBlockVectorR425            if not restart:426                activeBlockVectorBP = activeBlockVectorP427        # Common submatrices:428        gramXAR = np.dot(blockVectorX.T.conj(), activeBlockVectorAR)429        gramRAR = np.dot(activeBlockVectorR.T.conj(), activeBlockVectorAR)430        if explicitGramFlag:431            gramRAR = (gramRAR + gramRAR.T.conj())/2432            gramXAX = np.dot(blockVectorX.T.conj(), blockVectorAX)433            gramXAX = (gramXAX + gramXAX.T.conj())/2434            gramXBX = np.dot(blockVectorX.T.conj(), blockVectorBX)435            gramRBR = np.dot(activeBlockVectorR.T.conj(), activeBlockVectorBR)436            gramXBR = np.dot(blockVectorX.T.conj(), activeBlockVectorBR)437        else:438            gramXAX = np.diag(_lambda)439            gramXBX = ident0440            gramRBR = ident441            gramXBR = np.zeros((sizeX, currentBlockSize), dtype=A.dtype)442        def _handle_gramA_gramB_verbosity(gramA, gramB):443            if verbosityLevel > 0:444                _report_nonhermitian(gramA, 'gramA')445                _report_nonhermitian(gramB, 'gramB')446            if verbosityLevel > 10:447                # Note: not documented, but leave it in here for now448                np.savetxt('gramA.txt', gramA)449                np.savetxt('gramB.txt', gramB)450        if not restart:451            gramXAP = np.dot(blockVectorX.T.conj(), activeBlockVectorAP)452            gramRAP = np.dot(activeBlockVectorR.T.conj(), activeBlockVectorAP)453            gramPAP = np.dot(activeBlockVectorP.T.conj(), activeBlockVectorAP)454            gramXBP = np.dot(blockVectorX.T.conj(), activeBlockVectorBP)455            gramRBP = np.dot(activeBlockVectorR.T.conj(), activeBlockVectorBP)456            if explicitGramFlag:457                gramPAP = (gramPAP + gramPAP.T.conj())/2458                gramPBP = np.dot(activeBlockVectorP.T.conj(),459                                 activeBlockVectorBP)460            else:461                gramPBP = ident462            gramA = bmat([[gramXAX, gramXAR, gramXAP],463                          [gramXAR.T.conj(), gramRAR, gramRAP],464                          [gramXAP.T.conj(), gramRAP.T.conj(), gramPAP]])465            gramB = bmat([[gramXBX, gramXBR, gramXBP],466                          [gramXBR.T.conj(), gramRBR, gramRBP],467                          [gramXBP.T.conj(), gramRBP.T.conj(), gramPBP]])468            _handle_gramA_gramB_verbosity(gramA, gramB)469            try:470                _lambda, eigBlockVector = eigh(gramA, gramB,471                                               check_finite=False)472            except LinAlgError:473                # try again after dropping the direction vectors P from RR474                restart = True475        if restart:476            gramA = bmat([[gramXAX, gramXAR],477                          [gramXAR.T.conj(), gramRAR]])478            gramB = bmat([[gramXBX, gramXBR],479                          [gramXBR.T.conj(), gramRBR]])480            _handle_gramA_gramB_verbosity(gramA, gramB)481            try:482                _lambda, eigBlockVector = eigh(gramA, gramB,483                                               check_finite=False)484            except LinAlgError:485                raise ValueError('eigh has failed in lobpcg iterations')486        ii = _get_indx(_lambda, sizeX, largest)487        if verbosityLevel > 10:488            print(ii)489            print(_lambda)490        _lambda = _lambda[ii]491        eigBlockVector = eigBlockVector[:, ii]492        lambdaHistory.append(_lambda)493        if verbosityLevel > 10:494            print('lambda:', _lambda)495#         # Normalize eigenvectors!496#         aux = np.sum( eigBlockVector.conj() * eigBlockVector, 0 )497#         eigVecNorms = np.sqrt( aux )498#         eigBlockVector = eigBlockVector / eigVecNorms[np.newaxis, :]499#         eigBlockVector, aux = _b_orthonormalize( B, eigBlockVector )500        if verbosityLevel > 10:501            print(eigBlockVector)502        # Compute Ritz vectors.503        if B is not None:504            if not restart:505                eigBlockVectorX = eigBlockVector[:sizeX]506                eigBlockVectorR = eigBlockVector[sizeX:sizeX+currentBlockSize]507                eigBlockVectorP = eigBlockVector[sizeX+currentBlockSize:]508                pp = np.dot(activeBlockVectorR, eigBlockVectorR)509                pp += np.dot(activeBlockVectorP, eigBlockVectorP)510                app = np.dot(activeBlockVectorAR, eigBlockVectorR)511                app += np.dot(activeBlockVectorAP, eigBlockVectorP)512                bpp = np.dot(activeBlockVectorBR, eigBlockVectorR)513                bpp += np.dot(activeBlockVectorBP, eigBlockVectorP)514            else:515                eigBlockVectorX = eigBlockVector[:sizeX]516                eigBlockVectorR = eigBlockVector[sizeX:]517                pp = np.dot(activeBlockVectorR, eigBlockVectorR)518                app = np.dot(activeBlockVectorAR, eigBlockVectorR)519                bpp = np.dot(activeBlockVectorBR, eigBlockVectorR)520            if verbosityLevel > 10:521                print(pp)522                print(app)523                print(bpp)524            blockVectorX = np.dot(blockVectorX, eigBlockVectorX) + pp525            blockVectorAX = np.dot(blockVectorAX, eigBlockVectorX) + app526            blockVectorBX = np.dot(blockVectorBX, eigBlockVectorX) + bpp527            blockVectorP, blockVectorAP, blockVectorBP = pp, app, bpp528        else:529            if not restart:530                eigBlockVectorX = eigBlockVector[:sizeX]531                eigBlockVectorR = eigBlockVector[sizeX:sizeX+currentBlockSize]532                eigBlockVectorP = eigBlockVector[sizeX+currentBlockSize:]533                pp = np.dot(activeBlockVectorR, eigBlockVectorR)534                pp += np.dot(activeBlockVectorP, eigBlockVectorP)535                app = np.dot(activeBlockVectorAR, eigBlockVectorR)536                app += np.dot(activeBlockVectorAP, eigBlockVectorP)537            else:538                eigBlockVectorX = eigBlockVector[:sizeX]539                eigBlockVectorR = eigBlockVector[sizeX:]540                pp = np.dot(activeBlockVectorR, eigBlockVectorR)541                app = np.dot(activeBlockVectorAR, eigBlockVectorR)542            if verbosityLevel > 10:543                print(pp)544                print(app)545            blockVectorX = np.dot(blockVectorX, eigBlockVectorX) + pp546            blockVectorAX = np.dot(blockVectorAX, eigBlockVectorX) + app547            blockVectorP, blockVectorAP = pp, app548    if B is not None:549        aux = blockVectorBX * _lambda[np.newaxis, :]550    else:551        aux = blockVectorX * _lambda[np.newaxis, :]552    blockVectorR = blockVectorAX - aux553    aux = np.sum(blockVectorR.conj() * blockVectorR, 0)554    residualNorms = np.sqrt(aux)555    # Future work: Need to add Postprocessing here:556    # Making sure eigenvectors "exactly" satisfy the blockVectorY constrains?557    # Making sure eigenvecotrs are "exactly" othonormalized by final "exact" RR558    # Computing the actual true residuals559    if verbosityLevel > 0:560        print('final eigenvalue:', _lambda)561        print('final residual norms:', residualNorms)562    if retLambdaHistory:563        if retResidualNormsHistory:564            return _lambda, blockVectorX, lambdaHistory, residualNormsHistory565        else:566            return _lambda, blockVectorX, lambdaHistory567    else:568        if retResidualNormsHistory:569            return _lambda, blockVectorX, residualNormsHistory570        else:...js.js
Source:js.js  
1var chess=document.getElementById('chess');2var context=chess.getContext('2d');3var i;4var superBlock=-1;5var block=[];6var startD=[],endD=[];7for(var i=1;i<=10;i++){8    block[i]=[];9    for(j=1;j<=10;j++){10        block[i][j]=0;11    }12}13window.onload=function(){14    drawchessbox();15    clickXY();16}17//¼üÅÌʼþ18document.onkeydown=function(event){19    var e = event || window.event || arguments.callee.caller.arguments[0];20    if(e && e.keyCode==65){ // °´ A21        mvRobot();22        mvSuper(1,0);23    }24    if(e && e.keyCode==68){ // °´ D25        mvRobot();26        mvSuper(-1,0);27    }28    if(e && e.keyCode==83){ // S ¼ü29        mvRobot();30        mvSuper(0,-1);31    }32    if(e && e.keyCode==87){ // W ¼ü33        mvRobot();34        mvSuper(0,1);35    }36};37function mvRobot(){38    for(var i=1;i<=10;i++){39        for(var j=1;j<=10;j++){40            if(block[i][j]==3){41                robot(i,j);42            }43        }44    }45}46function robot(i,j){47    if(i<=startD[1]&&j<=endD[1]){48        if(block[i][j]==2){49            drawBlock(i+1,j,"red");50            drawBlock(i,j,"white");51            block[i+1][j]=3;52            block[i][j]=0;53        }else{54            drawBlock(i,j+1,"red");55            drawBlock(i,j,"white");56            block[i][j+1]=3;57            block[i][j]=0;58        }59    }else if(i>startD[1]&&j<=endD[1]){60        if(block[i][j]==2){61            drawBlock(i,j+1,"red");62            drawBlock(i,j,"white");63            block[i][j+1]=3;64            block[i][j]=0;65        }else{66            drawBlock(i-1,j,"red");67            drawBlock(i,j,"white");68            block[i-1][j]=3;69            block[i][j]=0;70        }71    }else if(i>startD[1]&&j>endD[1]){72        if(block[i][j]==2){73            drawBlock(i-1,j,"red");74            drawBlock(i,j,"white");75            block[i-1][j]=3;76            block[i][j]=0;77        }else{78            drawBlock(i,j-1,"red");79            drawBlock(i,j,"white");80            block[i][j-1]=3;81            block[i][j]=0;82        }83    }else if(i<=startD[1]&&j>endD[1]){84        if(block[i][j]==2){85            drawBlock(i,j-1,"red");86            drawBlock(i,j,"white");87            block[i][j-1]=3;88            block[i][j]=0;89        }else{90            drawBlock(i+1,j,"red");91            drawBlock(i,j,"white");92            block[i+1][j]=3;93            block[i][j]=0;94        }95    }96}97//ÒÆ¶¯»úÆ÷ÈË98//function mvRobot(){99//    for(var i=1;i<10;i++){100//        for(var j=1;j<10;j++){101//            if(block[i][j]==3){102//                if(i<=startD[1]){103//                    if(j<=endD[1]){104//                        if(block[i][j+1]==2){105//                            drawBlock(i+1,j,"red");106//                            drawBlock(i,j,"white");107//                            block[i+1][j]=3;108//                            block[i][j]=0;109//                        }else {110//                            if(j-endD[1]>=i-startD[1]){111//                                drawBlock(i,j+1,"red");112//                                drawBlock(i,j,"white");113//                                block[i][j+1]=3;114//                                block[i][j]=0;115//                            }else if(j-endD[1]<i-startD[1]){116//                                drawBlock(i+1,j,"red");117//                                drawBlock(i,j,"white");118//                                block[i+1][j]=3;119//                                block[i][j]=0;120//                            }121//                        }122//                    }else{123//                        if(block[i][j+1]==2){124//                            drawBlock(i-1,j,"red");125//                            drawBlock(i,j,"white");126//                            block[i-1][j]=3;127//                            block[i][j]=0;128//                        }else{129//                            if(j-endD[1]>=i-startD[1]){130//                                drawBlock(i,j-1,"red");131//                                drawBlock(i,j,"white");132//                                block[i][j-1]=3;133//                                block[i][j]=0;134//                            }else if(j-endD[1]<i-startD[1]){135//                                drawBlock(i-1,j,"red");136//                                drawBlock(i,j,"white");137//                                block[i-1][j]=3;138//                                block[i][j]=0;139//                            }140//                        }141//                    }142//                }else{143//                    if(j<=endD[1]){144//                        if(block[i][j+1]==2){145//                            drawBlock(i-1,j,"red");146//                            drawBlock(i,j,"white");147//                            block[i-1][j]=3;148//                            block[i][j]=0;149//                        }else{150//                            if(j-endD[1]>=i-startD[1]){151//                                drawBlock(i,j+1,"red");152//                                drawBlock(i,j,"white");153//                                block[i][j+1]=3;154//                                block[i][j]=0;155//                            }else if(j-endD[1]<i-startD[1]){156//                                drawBlock(i+1,j,"red");157//                                drawBlock(i,j,"white");158//                                block[i+1][j]=3;159//                                block[i][j]=0;160//                            }161//                        }162//                    }else{163//                        if(block[i][j+1]==2){164//                            drawBlock(i+1,j,"red");165//                            drawBlock(i,j,"white");166//                            block[i+1][j]=3;167//                            block[i][j]=0;168//                        }else{169//                            if(j-endD[1]>=i-startD[1]){170//                                drawBlock(i,j-1,"red");171//                                drawBlock(i,j,"white");172//                                block[i][j-1]=3;173//                                block[i][j]=0;174//                            }else if(j-endD[1]<i-startD[1]){175//                                drawBlock(i-1,j,"red");176//                                drawBlock(i,j,"white");177//                                block[i-1][j]=3;178//                                block[i][j]=0;179//                            }180//                        }181//                    }182//                }183//            }184//        }185//    }186//}187//ÒÆ¶¯hero188function mvSuper(pX,pY){189    if(block[startD[1]-pX][endD[1]-pY]==0){//-1 0190        startD[1] -= pX;191        endD[1]-=pY;192        if(superBlock==-1){193            drawBlock(startD[1],endD[1],"green");194        }else if(superBlock<3){195            drawBlock(startD[1],endD[1],"#6BF65E");196            superBlock+=1;197            if(superBlock==2){198                superBlock=-1;199            }200        }201        drawBlock(startD[1]+pX,endD[1]+pY,"white");//+1 0202        block[startD[1]][endD[1]]=-1;203        block[startD[1]+pX][endD[1]+pY]=0;//+1 0204    }else if(block[startD[1]-pX][endD[1]-pY]==2){//-1 0205        alert("no");206    }else if(block[startD[1]-pX][endD[1]-pY]==1){207        startD[1] -= pX;208        endD[1]-=pY;209        drawBlock(startD[1],endD[1],"#6BF65E");210        drawBlock(startD[1]+pX,endD[1]+pY,"white");211        block[startD[1]][endD[1]]=-1;212        block[startD[1]+pX][endD[1]+pY]=0;213        superBlock=0;214    }else if(block[startD[1]-pX][endD[1]-pY]==3){215        if(superBlock==-1) {216            alert("failed");217        } else if(superBlock!=-1){218            startD[1] -= pX;219            endD[1]-=pY;220            drawBlock(startD[1],endD[1],"#6BF65E");221            drawBlock(startD[1]+pX,endD[1]+pY,"white");222            block[startD[1]][endD[1]]=-1;223            block[startD[1]+1][endD[1]]=0;224            superBlock++;225        }226    }227    var robot=0;228    var suptool=0;229    for(var i=1;i<=10;i++){230        for(var j=1;j<=10;j++){231            if(block[i][j]==3){232                robot++;233            }234            if(block[i][j]==1){235                suptool++;236            }237        }238    }239    if(robot==0){240        alert("win");241    }else if(robot!=0 || (robot!=0&&suptool==0)){242        if(superBlock==-1) alert("failed");243        else{244            return;245        }246    }247}248//²úÉúhero robot super as....249function clickXY(){250    i=1;251    var x,y;252    chess.onclick=function(e){253        x= e.offsetX;254        y= e.offsetY;255        startD[i]= Math.floor(x / 30);256        endD [i]= Math.floor(y / 30);257        if(startD[i]<1 || startD[i]>10 || endD[i]<1 || endD[i]>10) return;258            if(i==1){259                drawBlock(startD[i],endD[i],"green");260                block[startD[i]][endD[i]]=-1;261                //console.log(startD[i],endD[i]);262                i++;263            }else if(i>1){264                if(block[startD[i]][endD[i]]==0){265                    var str=window.prompt("1,0,2","");266                    if(str==0){267                        drawBlock(startD[i],endD[i],"red");268                        block[startD[i]][endD[i]]=3;269                        i++;270                    }else if(str==1){271                        drawBlock(startD[i],endD[i],"blue");272                        block[startD[i]][endD[i]]=1;273                        i++;274                    }else if(str==2){275                        drawBlock(startD[i],endD[i],"#F6C462");276                        block[startD[i]][endD[i]]=2;277                        i++;278                    }279                }else alert("repeat");280            }281        else return;282    }283}284//»±í¸ñ285var drawchessbox=function(){286    for(var i=0;i<11;i++)287    {288        context.moveTo(30+i*30,30);289        context.lineTo(30+i*30,360-30);290        context.stroke();291        context.moveTo(30,30+i*30);292        context.lineTo(360-30,30+i*30);293        context.stroke();294    }295}296//»·½¿é297function drawBlock(startD,endD,color) {298    if(startD>0&&startD<11&&endD>0&&endD<11){299        context.strokeStyle = "block";300        context.fillStyle = color;301        context.fillRect(startD*30,endD*30,30,30);302        context.strokeRect(startD*30,endD*30,30,30);303    }304}305//if(block[startD[1]-1][endD[1]]==0){306//    startD[1] -= 1;307//    if(superBlock==-1){308//        drawBlock(startD[1],endD[1],"green");309//    }else if(superBlock<3){310//        drawBlock(startD[1],endD[1],"#6BF65E");311//        superBlock+=1;312//        if(superBlock==2){313//            superBlock=-1;314//        }315//    }316//    drawBlock(startD[1]+1,endD[1],"white");317//    block[startD[1]][endD[1]]=-1;318//    block[startD[1]+1][endD[1]]=0;319//}else if(block[startD[1]-1][endD[1]]==2){320//    alert("no");321//}else if(block[startD[1]-1][endD[1]]==1){322//    startD[1] -= 1;323//    drawBlock(startD[1],endD[1],"#6BF65E");324//    drawBlock(startD[1]+1,endD[1],"white");325//    block[startD[1]][endD[1]]=-1;326//    block[startD[1]+1][endD[1]]=0;327//    superBlock=0;328//}else if(block[startD[1]-1][endD[1]]==3){329//    if(superBlock==-1) {330//        alert("failed");331//    } else if(superBlock!=-1){332//        startD[1] -= 1;333//        drawBlock(startD[1],endD[1],"#6BF65E");334//        drawBlock(startD[1]+1,endD[1],"white");335//        block[startD[1]][endD[1]]=-1;336//        block[startD[1]+1][endD[1]]=0;337//        superBlock++;338//    }339//}340//startD[1] += 1;341//drawBlock(startD[1],endD[1],"green");342//drawBlock(startD[1]-1,endD[1],"white");343//endD[1] += 1;344//drawBlock(startD[1],endD[1],"green");345//drawBlock(startD[1],endD[1]-1,"white");346//endD[1] -= 1;347//drawBlock(startD[1],endD[1],"green");348//drawBlock(startD[1],endD[1]+1,"white");349//if(i<=startD[1]){350//    if(j<=endD[1]){351//        if(block[i][j+1]!=2){352//            drawBlock(i,j+1,"red");353//            drawBlock(i,j-1,"white");354//            block[i][j+1]=3;355//            block[i][j]=0;356//        }else{357//            drawBlock(i+1,j,"red");358//            drawBlock(i-1,j,"white");359//            block[i+1][j]=3;360//            block[i][j]=0;361//        }362//    }else{363//        if(block[i][j-1]!=2){364//            drawBlock(i,j-1,"red");365//            drawBlock(i,j+1,"white");366//            block[i][j-1]=3;367//            block[i][j]=0;368//        }else{369//            drawBlock(i-1,j,"red");370//            drawBlock(i+1,j,"white");371//            block[i-1][j]=3;372//            block[i][j]=0;373//        }374//    }375//}376//if(i>startD[1]){377//    if(j<=endD[1]){378//        if(block[i][j-1]!=2){379//            drawBlock(i,j-1,"red");380//            drawBlock(i,j+1,"white");381//            block[i][j-1]=3;382//            block[i][j]=0;383//        }else{384//            drawBlock(i-1,j,"red");385//            drawBlock(i+1,j,"white");386//            block[i-1][j]=3;387//            block[i][j]=0;388//        }389//    }else{390//        if(block[i][j+1]!=2){391//            drawBlock(i,j+1,"red");392//            drawBlock(i,j-1,"white");393//            block[i][j+1]=3;394//            block[i][j]=0;395//        }else{396//            drawBlock(i+1,j,"red");397//            drawBlock(i-1,j,"white");398//            block[i+1][j]=3;399//            block[i][j]=0;400//        }401//    }...block-prop-container.ts
Source:block-prop-container.ts  
1import {AfterViewInit, ChangeDetectorRef, Component, Inject, ViewChild} from "@angular/core";2import {Compbaser} from "ng-mslib";3import {YellowPepperService} from "../../services/yellowpepper.service";4import {BlockService, IBlockData, ISceneData} from "./block-service";5import {CampaignTimelineChanelPlayersModel} from "../../store/imsdb.interfaces_auto";6import {ColorPickerService} from "ngx-color-picker";7import {Tab} from "../../comps/tabs/tab";8import {BlockLabels, PLACEMENT_CHANNEL, PLACEMENT_SCENE} from "../../interfaces/Consts";9@Component({10    selector: 'block-prop-container',11    template: `12        <small class="debug">{{me}}</small>13        <tabs>14            <tab [tabtitle]="'style'">15                <block-prop-common [setBlockData]="m_blockData"></block-prop-common>16            </tab>17            <tab [tabtitle]="m_tabTitle">18                <div [ngSwitch]="m_blockTypeSelected">19                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_IMAGE">20                        <block-prop-image [external]="false" [setBlockData]="m_blockData"></block-prop-image>21                    </div>22                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_SVG">23                        <block-prop-image [external]="false" [setBlockData]="m_blockData"></block-prop-image>24                    </div>25                    <div *ngSwitchCase="m_blockLabels.IMAGE">26                        <block-prop-image [external]="true" [setBlockData]="m_blockData"></block-prop-image>27                    </div>28                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_VIDEO">29                        <block-prop-video [external]="false" [setBlockData]="m_blockData"></block-prop-video>30                    </div>31                    <div *ngSwitchCase="m_blockLabels.EXTERNAL_VIDEO">32                        <block-prop-video [external]="true" [setBlockData]="m_blockData"></block-prop-video>33                    </div>34                    <div *ngSwitchCase="m_blockLabels.MRSS">35                        <block-prop-mrss [setBlockData]="m_blockData"></block-prop-mrss>36                    </div>37                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_COLLECTION">38                        <block-prop-collection [setBlockData]="m_blockData"></block-prop-collection>39                    </div>40                    <div *ngSwitchCase="m_blockLabels.RSS">41                        <block-prop-rss [setBlockData]="m_blockData"></block-prop-rss>42                    </div>43                    <div *ngSwitchCase="m_blockLabels.LABEL">44                        <block-prop-label [setBlockData]="m_blockData"></block-prop-label>45                    </div>46                    <div *ngSwitchCase="m_blockLabels.QR">47                        <block-prop-qr [setBlockData]="m_blockData"></block-prop-qr>48                    </div>49                    <div *ngSwitchCase="m_blockLabels.CLOCK">50                        <block-prop-clock [setBlockData]="m_blockData"></block-prop-clock>51                    </div>52                    <div *ngSwitchCase="m_blockLabels.HTML">53                        <block-prop-html [setBlockData]="m_blockData"></block-prop-html>54                    </div>55                    <div *ngSwitchCase="m_blockLabels.FASTERQ">56                        <block-prop-fasterq [setBlockData]="m_blockData"></block-prop-fasterq>57                    </div>58                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_SCENE">59                        <block-prop-scene [setBlockData]="m_blockData"></block-prop-scene>60                    </div>61                    <div *ngSwitchCase="m_blockLabels.LOCATION">62                        <block-prop-location [setBlockData]="m_blockData"></block-prop-location>63                    </div>64                    <div *ngSwitchCase="m_blockLabels.YOUTUBE">65                        <block-prop-youtube [setBlockData]="m_blockData"></block-prop-youtube>66                    </div>67                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_JSON">68                        <block-prop-json-player [standAlone]="true" [setBlockData]="m_blockData"></block-prop-json-player>69                    </div>70                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_JSON_ITEM">71                        <block-prop-json-item [setBlockData]="m_blockData"></block-prop-json-item>72                    </div>73                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_WORLD_WEATHER">74                        <block-prop-weather [setBlockData]="m_blockData"></block-prop-weather>75                    </div>76                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_INSTAGRAM">77                        <block-prop-instagram [setBlockData]="m_blockData"></block-prop-instagram>78                    </div>79                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_DIGG">80                        <block-prop-digg [setBlockData]="m_blockData"></block-prop-digg>81                    </div>82                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_CALENDAR">83                        <block-prop-calendar [setBlockData]="m_blockData"></block-prop-calendar>84                    </div>85                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_TWITTERV3">86                        <block-prop-twitter [setBlockData]="m_blockData"></block-prop-twitter>87                    </div>88                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_GOOGLE_SHEETS">89                        <block-prop-sheets [setBlockData]="m_blockData"></block-prop-sheets>90                    </div>91                    <div *ngSwitchDefault>92                        <h3>no block prop found, new?</h3>93                        {{m_blockTypeSelected}}94                    </div>95                </div>96            </tab>97            <!-- below are JSON based blocked which bind to scenes -->98            <tab #settings [tabtitle]="'settings'">99                <div [ngSwitch]="m_blockTypeSelected">100                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_WORLD_WEATHER">101                        <block-prop-weather [jsonMode]="true" [setBlockData]="m_blockData"></block-prop-weather>102                    </div>103                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_INSTAGRAM">104                        <block-prop-instagram [jsonMode]="true" [setBlockData]="m_blockData"></block-prop-instagram>105                    </div>106                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_DIGG">107                        <block-prop-digg [jsonMode]="true" [setBlockData]="m_blockData"></block-prop-digg>108                    </div>109                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_CALENDAR">110                        <block-prop-calendar [jsonMode]="true" [setBlockData]="m_blockData"></block-prop-calendar>111                    </div>112                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_TWITTERV3">113                        <block-prop-twitter [jsonMode]="true" [setBlockData]="m_blockData"></block-prop-twitter>114                    </div>115                    <div *ngSwitchCase="m_blockLabels.BLOCKCODE_GOOGLE_SHEETS">116                        <block-prop-sheets [jsonMode]="true" [setBlockData]="m_blockData"></block-prop-sheets>117                    </div>118                </div>119            </tab>120        </tabs>121    `,122})123export class BlockPropContainer extends Compbaser implements AfterViewInit {124    m_blockTypeSelected: string = 'none';125    m_blockLabels = BlockLabels;126    m_blockData: IBlockData;127    m_tabTitle: string = 'none';128    m_showSettingsTab = true;129    constructor(@Inject('BLOCK_PLACEMENT') private blockPlacement: string, private yp: YellowPepperService, private bs: BlockService, private cpService: ColorPickerService, private cd: ChangeDetectorRef) {130        super();131        // console.log(blockPlacement);132        if (this.blockPlacement == PLACEMENT_CHANNEL)133            this._listenOnChannels();134        if (this.blockPlacement == PLACEMENT_SCENE)135            this._listenOnScenes();136    }137    @ViewChild('settings')138    settings: Tab;139    ngAfterViewInit() {140        this.toggleSettingsTab();141    }142    private _listenOnChannels() {143        this.cancelOnDestroy(144            //145            this.yp.listenBlockChannelSelectedOrChanged()146                .mergeMap((i_campaignTimelineChanelPlayersModel: CampaignTimelineChanelPlayersModel) => {147                    return this.bs.getBlockData(i_campaignTimelineChanelPlayersModel.getCampaignTimelineChanelPlayerId())148                })149                .subscribe((blockData: IBlockData) => {150                    this.m_blockTypeSelected = blockData.blockCode;151                    this.m_tabTitle = blockData.blockAcronym;152                    this.m_blockData = blockData;153                    // for json based scenes show the settings, unless its the actual Json Player which we don't154                    if (blockData.playerMimeScene && this.m_blockTypeSelected != '4300') {155                        this.m_showSettingsTab = true;156                        this.toggleSettingsTab();157                    } else {158                        this.m_showSettingsTab = false;159                        this.toggleSettingsTab();160                    }161                }, (e) => console.error(e))162        )163    }164    private _listenOnScenes() {165        this.cancelOnDestroy(166            //167            this.yp.listenSceneOrBlockSelectedChanged()168                .mergeMap((i_sceneData: ISceneData) => {169                    return this.bs.getBlockDataInScene(i_sceneData)170                })171                .subscribe((blockData: IBlockData) => {172                    this.m_blockTypeSelected = blockData.blockCode;173                    this.m_tabTitle = blockData.blockAcronym;174                    this.m_blockData = blockData;175                    this.m_showSettingsTab = false;176                    this.toggleSettingsTab();177                    this.cd.markForCheck();178                }, (e) => console.error(e))179        )180    }181    // private getTabTitle(i_blockData: IBlockData): string {182    //     // this.bs.getCommonBorderXML()if (i_blockData.blockAcronym.indexOf('JSON')) > -1 ? blockData.playerMimeScene : blockData.blockAcronym183    // }184    private toggleSettingsTab() {185        if (!this.settings) return;186        this.settings.show = this.m_showSettingsTab;187    }188    ngOnInit() {189    }190    destroy() {191    }...zerocoin_publicSpend_reorg.py
Source:zerocoin_publicSpend_reorg.py  
...38        block_count = self.node.getblockcount()39        pastBlockHash = self.node.getblockhash(block_count)40        self.log.info("Block count: %d - Current best: %s..." % (self.node.getblockcount(), self.node.getbestblockhash()[:5]))41        pastBlock = CBlock()42        pastBlock.deserialize(BytesIO(hex_str_to_bytes(self.node.getblock(pastBlockHash, False))))43        checkpoint = pastBlock.nAccumulatorCheckpoint44        # 5) get the raw zerocoin spend txes45        self.log.info("Getting the raw zerocoin public spends...")46        public_spend_A = self.node.createrawzerocoinpublicspend(mints[0].get("serial hash"))47        tx_A = CTransaction()48        tx_A.deserialize(BytesIO(hex_str_to_bytes(public_spend_A)))49        tx_A.rehash()50        public_spend_B = self.node.createrawzerocoinpublicspend(mints[1].get("serial hash"))51        tx_B = CTransaction()52        tx_B.deserialize(BytesIO(hex_str_to_bytes(public_spend_B)))53        tx_B.rehash()54        # Spending same coins to different recipients to get different txids55        my_addy = "yAVWM5urwaTyhiuFQHP2aP47rdZsLUG5PH"56        public_spend_A2 = self.node.createrawzerocoinpublicspend(mints[0].get("serial hash"), my_addy)57        tx_A2 = CTransaction()58        tx_A2.deserialize(BytesIO(hex_str_to_bytes(public_spend_A2)))59        tx_A2.rehash()60        public_spend_B2 = self.node.createrawzerocoinpublicspend(mints[1].get("serial hash"), my_addy)61        tx_B2 = CTransaction()62        tx_B2.deserialize(BytesIO(hex_str_to_bytes(public_spend_B2)))63        tx_B2.rehash()64        self.log.info("tx_A id: %s" % str(tx_A.hash))65        self.log.info("tx_B id: %s" % str(tx_B.hash))66        self.log.info("tx_A2 id: %s" % str(tx_A2.hash))67        self.log.info("tx_B2 id: %s" % str(tx_B2.hash))68        self.test_nodes[0].handle_connect()69        # 6) create block_A --> main chain70        self.log.info("")71        self.log.info("*** block_A ***")72        self.log.info("Creating block_A [%d] with public spend tx_A in it." % (block_count + 1))73        block_A = self.new_block(block_count, pastBlock, checkpoint, tx_A)74        self.log.info("Hash of block_A: %s..." % block_A.hash[:5])75        self.log.info("sending block_A...")76        var = self.node.submitblock(bytes_to_hex_str(block_A.serialize()))77        if var is not None:78            self.log.info("result: %s" % str(var))79            raise Exception("block_A not accepted")80        time.sleep(2)81        assert_equal(self.node.getblockcount(), block_count+1)82        assert_equal(self.node.getbestblockhash(), block_A.hash)83        self.log.info("  >>  block_A connected  <<")84        self.log.info("Current chain: ... --> block_0 [%d] --> block_A [%d]\n" % (block_count, block_count+1))85        # 7) create block_B --> forked chain86        self.log.info("*** block_B ***")87        self.log.info("Creating block_B [%d] with public spend tx_B in it." % (block_count + 1))88        block_B = self.new_block(block_count, pastBlock, checkpoint, tx_B)89        self.log.info("Hash of block_B: %s..." % block_B.hash[:5])90        self.log.info("sending block_B...")91        var = self.node.submitblock(bytes_to_hex_str(block_B.serialize()))92        self.log.info("result of block_B submission: %s" % str(var))93        time.sleep(2)94        assert_equal(self.node.getblockcount(), block_count+1)95        assert_equal(self.node.getbestblockhash(), block_A.hash)96        # block_B is not added. Chain remains the same97        self.log.info("  >>  block_B not connected  <<")98        self.log.info("Current chain: ... --> block_0 [%d] --> block_A [%d]\n" % (block_count, block_count+1))99        # 8) Create new block block_C on the forked chain (block_B)100        block_count += 1101        self.log.info("*** block_C ***")102        self.log.info("Creating block_C [%d] on top of block_B triggering the reorg" % (block_count + 1))103        block_C = self.new_block(block_count, block_B, checkpoint)104        self.log.info("Hash of block_C: %s..." % block_C.hash[:5])105        self.log.info("sending block_C...")106        var = self.node.submitblock(bytes_to_hex_str(block_C.serialize()))107        if var is not None:108            self.log.info("result: %s" % str(var))109            raise Exception("block_C not accepted")110        time.sleep(2)111        assert_equal(self.node.getblockcount(), block_count+1)112        assert_equal(self.node.getbestblockhash(), block_C.hash)113        self.log.info("  >>  block_A disconnected / block_B and block_C connected  <<")114        self.log.info("Current chain: ... --> block_0 [%d] --> block_B [%d] --> block_C [%d]\n" % (115                block_count - 1, block_count, block_count+1116        ))117        # 7) Now create block_D which tries to spend same coin of tx_B again on the (new) main chain118        # (this block will be rejected)119        block_count += 1120        self.log.info("*** block_D ***")121        self.log.info("Creating block_D [%d] trying to double spend the coin of tx_B" % (block_count + 1))122        block_D = self.new_block(block_count, block_C, checkpoint, tx_B2)123        self.log.info("Hash of block_D: %s..." % block_D.hash[:5])124        self.log.info("sending block_D...")125        var = self.node.submitblock(bytes_to_hex_str(block_D.serialize()))126        self.log.info("result of block_D submission: %s" % str(var))127        time.sleep(2)128        assert_equal(self.node.getblockcount(), block_count)129        assert_equal(self.node.getbestblockhash(), block_C.hash)130        # block_D is not added. Chain remains the same131        self.log.info("  >>  block_D rejected  <<")132        self.log.info("Current chain: ... --> block_0 [%d] --> block_B [%d] --> block_C [%d]\n" % (133                block_count - 2, block_count - 1, block_count134        ))135        # 8) Now create block_E which spends tx_A again on main chain136        # (this block will be accepted and connected since tx_A was spent on block_A now disconnected)137        self.log.info("*** block_E ***")138        self.log.info("Creating block_E [%d] trying spend tx_A on main chain" % (block_count + 1))139        block_E = self.new_block(block_count, block_C, checkpoint, tx_A)140        self.log.info("Hash of block_E: %s..." % block_E.hash[:5])141        self.log.info("sending block_E...")142        var = self.node.submitblock(bytes_to_hex_str(block_E.serialize()))143        if var is not None:144            self.log.info("result: %s" % str(var))145            raise Exception("block_E not accepted")146        time.sleep(2)147        assert_equal(self.node.getblockcount(), block_count+1)148        assert_equal(self.node.getbestblockhash(), block_E.hash)149        self.log.info("  >>  block_E connected <<")150        self.log.info("Current chain: ... --> block_0 [%d] --> block_B [%d] --> block_C [%d] --> block_E [%d]\n" % (151                block_count - 2, block_count - 1, block_count, block_count+1152        ))153        # 9) Now create block_F which tries to double spend the coin in tx_A154        # # (this block will be rejected)155        block_count += 1156        self.log.info("*** block_F ***")157        self.log.info("Creating block_F [%d] trying to double spend the coin in tx_A" % (block_count + 1))158        block_F = self.new_block(block_count, block_E, checkpoint, tx_A2)159        self.log.info("Hash of block_F: %s..." % block_F.hash[:5])160        self.log.info("sending block_F...")161        var = self.node.submitblock(bytes_to_hex_str(block_F.serialize()))162        self.log.info("result of block_F submission: %s" % str(var))163        time.sleep(2)164        assert_equal(self.node.getblockcount(), block_count)165        assert_equal(self.node.getbestblockhash(), block_E.hash)166        self.log.info("  >>  block_F rejected <<")167        self.log.info("Current chain: ... --> block_0 [%d] --> block_B [%d] --> block_C [%d] --> block_E [%d]\n" % (168                block_count - 3, block_count - 2, block_count - 1, block_count169        ))170        self.log.info("All good.")171    def new_block(self, block_count, prev_block, checkpoint, zcspend = None):172        if prev_block.hash is None:173            prev_block.rehash()174        staking_utxo_list = [self.unspent.pop()]175        pastBlockHash = prev_block.hash176        stakingPrevOuts = self.get_prevouts(staking_utxo_list, block_count)177        block = self.create_spam_block(pastBlockHash, stakingPrevOuts, block_count + 1)178        if zcspend is not None:179            block.vtx.append(zcspend)180            block.hashMerkleRoot = block.calc_merkle_root()181        block.nAccumulatorCheckpoint = checkpoint182        block.rehash()183        block.sign_block(self.block_sig_key)184        return block185if __name__ == '__main__':...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
