anchor.diff:                              if ((_startInput = _endInput && _startGrammar = _endGrammar)
                                  || input.[_startInput,_endInput].Overlaps grammar.grammar.[_startGrammar, _endGrammar])
                               then 
  -                                 //intersectionResult.[backStateRemap.[(_startInput,_startGrammar)] ,backStateRemap.[(_endInput,_endGrammar)]] <- 1.0
                                    toUpdate.Add(backStateRemap.[(_startInput,_startGrammar)], backStateRemap.[(_endInput,_endGrammar)], 1.0)
  -            
  -//        for _startInput in 0..inputSize-1 do
  -//            for _endInput in 0..inputSize-1 do
  -//                if input.[_startInput, _endInput].Count <> 0 || _startInput = _endInput
  -//                then 
  -//                    for _startGrammar in 0..grammarSize-1 do
  -//                        for _endGrammar in 0..grammarSize-1 do
  -//                            if (_startInput = _endInput && _startGrammar = _endGrammar)
  -//                               || input.[_startInput, _endInput].Overlaps grammar.grammar.[_startGrammar, _endGrammar]
  -//                            then 
  -//                                 intersectionResult.[backStateRemap.[(_startInput,_startGrammar)] ,backStateRemap.[(_endInput,_endGrammar)]] <- 1.0
  -                                 //toUpdate.Add(backStateRemap.[(_startInput,_startGrammar)] ,backStateRemap.[(_endInput,_endGrammar)])
  -        //) |> ignore
  -        //printfn "f1"        
  -        //xxx.Clear()
  -        //printfn "SSS = %A" toUpdate.Count
  -        //for (i,j) in toUpdate do intersectionResult.[i,j] <- 1.0
  -        //intersectionResult <- intersectionResult.PointwiseAbsoluteMaximum xxx :?>_
  -        //printfn "f11"
  -        let cls = closure toUpdate intersectionResult gpuSparseMatrix gpuSparseMatrix1
  +
  +        let upCsr = Storage.SparseCompressedRowMatrixStorage.OfIndexedEnumerable(intersectionResult.RowCount,intersectionResult.RowCount,toUpdate) 
  +        gpuSparseMatrix1.Update (toUpdate.Count, upCsr.Values, upCsr.RowPointers, upCsr.ColumnIndices)    
  +        closure ()
           toUpdate.Clear()
  -       // printfn "s2"
           _go <- false
  -        cls
  +        intersectionResult
           |> Matrix.iteriSkipZeros (fun i j n ->
               let _startInput,_startGrammar = stateRemap.[i] 
               let _endInput,_endGrammar = stateRemap.[j]
  
positive.code:             | Some (n,s,f) when f.Contains _endGrammar -> _go <- input.[_startInput,_endInput].Add n || _go
              | _ -> ()
              )
          //printfn "f2"
  
      input
  
  
negative.code:                 incr k
          n,m
  
      let closure () =    
          let mutable res = sparseCudaGeam gpuSparseMatrix gpuSparseMatrix1 intersectionResult.RowCount
          let mutable zeros = res.Nnz
          let _go = ref true
          let ctr = ref 0
          while !_go do
              incr ctr
              res <- sparseCudaGeam res (sparseCudaGemm res res intersectionResult.RowCount) intersectionResult.RowCount
              let newZeros = res.Nnz
              _go := not (zeros = newZeros)
              zeros <- newZeros
          printfn "!!!%A" !ctr
          csr.ColumnIndices <- res.CsrColInd
          res.CsrRow.CopyTo(csr.RowPointers,0)
          csr.Values <- res.CsrVal
          
      let mutable _go = true
  
      let toUpdate = new ResizeArray<_>()
  
      while _go do
          for _startInput in 0..inputSize-1 do
              for _endInput in 0..inputSize-1 do
                  if input.[_startInput,_endInput].Count <> 0 || _startInput = _endInput
  