We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[BUG] Fuse operand's sparse value is wrong
<!--
Thank you for your contribution!

Please review https://github.com/mars-project/mars/blob/master/CONTRIBUTING.rst before opening an issue.
-->

**Describe the bug**
A fuse operand's sparseness should be the same as tail node's, it is not set correctly now.

**To Reproduce**
``` Python
In [1]: import scipy.sparse as sps                                                                                                 

In [2]: import mars.tensor as mt                                                                                                   

In [3]: data = sps.rand(10, 10, density=0.05)                                                                                      

In [4]: a = mt.tensor(data, chunk_size=3)                                                                                          

In [5]: b = (a * 2) * 2                                                                                                            

In [6]: g = b.build_graph(tiled=True, compose=True)                                                                                

In [7]: list(g)[0].op.sparse                                                                                                       
Out[7]: False

In [8]: list(g)[0].op                                                                                                              
Out[8]: <mars.tensor.expressions.fuse.core.TensorFuseChunk at 0xa208b7048>

In [9]: list(g)[0].composed[-1].op.sparse                                                                                         
Out[9]: True
```



--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `mars/tensor/expressions/fuse/core.py`
Content:
```
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 # Copyright 1999-2018 Alibaba Group Holding Ltd.
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 #      http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16 
17 from .... import operands
18 from ....tiles import NotSupportTile
19 from ..core import TensorOperandMixin
20 
21 
22 class TensorFuseChunk(operands.Fuse, TensorOperandMixin):
23     def __init__(self, dtype=None, **kw):
24         super(TensorFuseChunk, self).__init__(_dtype=dtype, **kw)
25 
26     def calc_shape(self, *inputs_shape):
27         in_shapes = inputs_shape
28         out_shape = None
29 
30         # TODO: the logic will be changed when fusion is not only straight line
31         for c in self.outputs[0].composed:
32             out_shape = c.op.calc_shape(*in_shapes)
33             in_shapes = [out_shape]
34         return out_shape
35 
36     @classmethod
37     def tile(cls, op):
38         raise NotSupportTile('TensorFuseChunk is a chunk operand which does not support tile')
39 
40 
41 class TensorFuseChunkMixin(TensorOperandMixin):
42     __slots__ = ()
43 
44     @classmethod
45     def tile(cls, op):
46         raise NotSupportTile('TensorFuseChunk is a chunk operand which does not support tile')
47 
48     def __call__(self, fuse_chunks):
49         head_chunk = fuse_chunks[0]
50         tail_chunk = fuse_chunks[-1]
51         setattr(self, '_operands', [c.op for c in fuse_chunks])
52         return self.new_chunk(head_chunk.inputs, tail_chunk.shape,
53                               _composed=fuse_chunks, _key=tail_chunk.key)
54
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/mars/tensor/expressions/fuse/core.py b/mars/tensor/expressions/fuse/core.py
--- a/mars/tensor/expressions/fuse/core.py
+++ b/mars/tensor/expressions/fuse/core.py
@@ -20,8 +20,8 @@
 
 
 class TensorFuseChunk(operands.Fuse, TensorOperandMixin):
-    def __init__(self, dtype=None, **kw):
-        super(TensorFuseChunk, self).__init__(_dtype=dtype, **kw)
+    def __init__(self, dtype=None, sparse=False, **kw):
+        super(TensorFuseChunk, self).__init__(_dtype=dtype, _sparse=sparse, **kw)
 
     def calc_shape(self, *inputs_shape):
         in_shapes = inputs_shape

{"golden_diff": "diff --git a/mars/tensor/expressions/fuse/core.py b/mars/tensor/expressions/fuse/core.py\n--- a/mars/tensor/expressions/fuse/core.py\n+++ b/mars/tensor/expressions/fuse/core.py\n@@ -20,8 +20,8 @@\n \n \n class TensorFuseChunk(operands.Fuse, TensorOperandMixin):\n-    def __init__(self, dtype=None, **kw):\n-        super(TensorFuseChunk, self).__init__(_dtype=dtype, **kw)\n+    def __init__(self, dtype=None, sparse=False, **kw):\n+        super(TensorFuseChunk, self).__init__(_dtype=dtype, _sparse=sparse, **kw)\n \n     def calc_shape(self, *inputs_shape):\n         in_shapes = inputs_shape\n", "issue": "[BUG] Fuse operand's sparse value is wrong\n<!--\r\nThank you for your contribution!\r\n\r\nPlease review https://github.com/mars-project/mars/blob/master/CONTRIBUTING.rst before opening an issue.\r\n-->\r\n\r\n**Describe the bug**\r\nA fuse operand's sparseness should be the same as tail node's, it is not set correctly now.\r\n\r\n**To Reproduce**\r\n``` Python\r\nIn [1]: import scipy.sparse as sps                                                                                                 \r\n\r\nIn [2]: import mars.tensor as mt                                                                                                   \r\n\r\nIn [3]: data = sps.rand(10, 10, density=0.05)                                                                                      \r\n\r\nIn [4]: a = mt.tensor(data, chunk_size=3)                                                                                          \r\n\r\nIn [5]: b = (a * 2) * 2                                                                                                            \r\n\r\nIn [6]: g = b.build_graph(tiled=True, compose=True)                                                                                \r\n\r\nIn [7]: list(g)[0].op.sparse                                                                                                       \r\nOut[7]: False\r\n\r\nIn [8]: list(g)[0].op                                                                                                              \r\nOut[8]: <mars.tensor.expressions.fuse.core.TensorFuseChunk at 0xa208b7048>\r\n\r\nIn [9]: list(g)[0].composed[-1].op.sparse                                                                                         \r\nOut[9]: True\r\n```\r\n\r\n\n", "before_files": [{"content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# Copyright 1999-2018 Alibaba Group Holding Ltd.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom .... import operands\nfrom ....tiles import NotSupportTile\nfrom ..core import TensorOperandMixin\n\n\nclass TensorFuseChunk(operands.Fuse, TensorOperandMixin):\n    def __init__(self, dtype=None, **kw):\n        super(TensorFuseChunk, self).__init__(_dtype=dtype, **kw)\n\n    def calc_shape(self, *inputs_shape):\n        in_shapes = inputs_shape\n        out_shape = None\n\n        # TODO: the logic will be changed when fusion is not only straight line\n        for c in self.outputs[0].composed:\n            out_shape = c.op.calc_shape(*in_shapes)\n            in_shapes = [out_shape]\n        return out_shape\n\n    @classmethod\n    def tile(cls, op):\n        raise NotSupportTile('TensorFuseChunk is a chunk operand which does not support tile')\n\n\nclass TensorFuseChunkMixin(TensorOperandMixin):\n    __slots__ = ()\n\n    @classmethod\n    def tile(cls, op):\n        raise NotSupportTile('TensorFuseChunk is a chunk operand which does not support tile')\n\n    def __call__(self, fuse_chunks):\n        head_chunk = fuse_chunks[0]\n        tail_chunk = fuse_chunks[-1]\n        setattr(self, '_operands', [c.op for c in fuse_chunks])\n        return self.new_chunk(head_chunk.inputs, tail_chunk.shape,\n                              _composed=fuse_chunks, _key=tail_chunk.key)\n", "path": "mars/tensor/expressions/fuse/core.py"}], "after_files": [{"content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# Copyright 1999-2018 Alibaba Group Holding Ltd.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom .... import operands\nfrom ....tiles import NotSupportTile\nfrom ..core import TensorOperandMixin\n\n\nclass TensorFuseChunk(operands.Fuse, TensorOperandMixin):\n    def __init__(self, dtype=None, sparse=False, **kw):\n        super(TensorFuseChunk, self).__init__(_dtype=dtype, _sparse=sparse, **kw)\n\n    def calc_shape(self, *inputs_shape):\n        in_shapes = inputs_shape\n        out_shape = None\n\n        # TODO: the logic will be changed when fusion is not only straight line\n        for c in self.outputs[0].composed:\n            out_shape = c.op.calc_shape(*in_shapes)\n            in_shapes = [out_shape]\n        return out_shape\n\n    @classmethod\n    def tile(cls, op):\n        raise NotSupportTile('TensorFuseChunk is a chunk operand which does not support tile')\n\n\nclass TensorFuseChunkMixin(TensorOperandMixin):\n    __slots__ = ()\n\n    @classmethod\n    def tile(cls, op):\n        raise NotSupportTile('TensorFuseChunk is a chunk operand which does not support tile')\n\n    def __call__(self, fuse_chunks):\n        head_chunk = fuse_chunks[0]\n        tail_chunk = fuse_chunks[-1]\n        setattr(self, '_operands', [c.op for c in fuse_chunks])\n        return self.new_chunk(head_chunk.inputs, tail_chunk.shape,\n                              _composed=fuse_chunks, _key=tail_chunk.key)\n", "path": "mars/tensor/expressions/fuse/core.py"}]}