samufi
samufi
MModular
Created by samufi on 8/5/2024 in #questions
Is there a (N-D) contiguous data structure for non-trivial structs?
I need a data strucuture that is a 2-dimensional array of (inline) lists of pairs. That is, if subdata = data[i][j], then subdata is a dynamic data structure that contains tuples of size 2. My take on solving this was to use a Tensor for the 2-D data structure, an InlinedFixedVector for the flexible part, and a StaticTuple for the pair.
from tensor import Tensor
from collections import InlinedFixedVector
from utils import StaticTuple


struct MyStruct:
var data: Tensor[InlinedFixedVector[StaticTuple[Float64, 2], 10]]
from tensor import Tensor
from collections import InlinedFixedVector
from utils import StaticTuple


struct MyStruct:
var data: Tensor[InlinedFixedVector[StaticTuple[Float64, 2], 10]]
However, I get the following error:
'Tensor' parameter #0 has 'DType' type, but value has type 'AnyStruct[InlinedFixedVector[StaticTuple[SIMD[float64, 1], 2], 10]]'
'Tensor' parameter #0 has 'DType' type, but value has type 'AnyStruct[InlinedFixedVector[StaticTuple[SIMD[float64, 1], 2], 10]]'
I figure that Tensors can only hold trivial data types. If so, is there a good general data structure for multi-dimensional data? I was thinking of putting InlineList into a self-made 2D represntation of List, but InlineList does not implement CollectionElement (as of yet?).
6 replies
MModular
Created by samufi on 8/2/2024 in #questions
How can I write asynchronous code?
How can I implement asynchroneous code in mojo (using async etc.)? In the Changelog, I find the following example (slightly adjusted):
async fn add_three(a: Int, b: Int, c: Int) -> Int:
return a + b + c

async fn call_it():
var task = add_three(1, 2, 3)
print(await task)
async fn add_three(a: Int, b: Int, c: Int) -> Int:
return a + b + c

async fn call_it():
var task = add_three(1, 2, 3)
print(await task)
This gives me the following compiler error:
test_async.mojo:39:17: error: 'Coroutine[Int, {}]' is not copyable because it has no '__copyinit__'
print(await task)
^~~~
test_async.mojo:39:17: error: 'Coroutine[Int, {}]' is not copyable because it has no '__copyinit__'
print(await task)
^~~~
I do not understand this error, as I thought that Coroutine is register passable (as visible in the source code). What works is
async fn add_three(a: Int, b: Int, c: Int) -> Int:
return a + b + c

async fn call_it():
var task = await add_three(1, 2, 3)
print(task)
async fn add_three(a: Int, b: Int, c: Int) -> Int:
return a + b + c

async fn call_it():
var task = await add_three(1, 2, 3)
print(task)
However, if I always put await on the right hand side, I will never be able to execute code asynchroneously, as I am always waiting until the line has finished. What am I doing wrong / where is my misconception? (Or is this simply a bug?) In the changelog it furthermore says that tasks can be "resumed" after completion (see here). What is meant by "resume" and how do I do that? I am working with the nightly built mojo 2024.7.2005 (96a1562c). Addon: I asked this question on the Q&A page and on SO some time ago. Sorry for the double posting; I just do not know what is the best way to get in touch with people who can help. I will keep the copies up to date (or delete them if people think this would be better).
11 replies