Re: [julia-users] Embedding Julia in C++ - Determining returned array types

2016-10-19 Thread Kyle Kotowick
Aha, that fixed it!

I'm running into one issue though. What do I do with the data when it's a 
"Float16" type? C++ has no way to represent a 16-bit float, so I'm having 
difficulty converting it to a regular 32-bit float.

jl_value_t *ret = jl_eval_string(code_string);
jl_array_t *ret_array = (jl_array_t*)ret;

if (jl_array_eltype(ret) == jl_float16_type) {

 /* now I need to convert the 'ret_array' to a C++ array of floats, but how 
do I do that when they're given in Float16? */

}


On Tuesday, 18 October 2016 20:57:10 UTC-4, Isaiah wrote:
>
> The issue here is that `jl_array_eltype` is already returning a type.
>
> `jl_typeis(v, t)` becomes `jl_typeof(v) == t`, so your checks become:
>
> jl_typeof(array_type) == jl_int64_type
>
> But
>
> jl_typeof(array_type) -> DataType
>
> Instead, either do the equality check directly:
>
>   array_type == jl_int64_type
>
> Or use the exported API only (jlapi.c):
>
>   strcmp(jl_typename_str(array_type), jl_typename_str(jl_int64_type))
>
> On Tue, Oct 18, 2016 at 7:52 PM, Kyle Kotowick <ky...@kotowick.ca 
> > wrote:
>
>> I apologize for the formatting, that should be:
>>
>> jl_value_t *ret = jl_eval_string(code_string);
>> void* array_type = jl_array_eltype(ret);
>> jl_array_t *ret_array = (jl_array_t*)ret;
>>
>> if (jl_typeis(array_type, jl_int64_type)) {
>>   long *data = (long*) jl_array_data(ret_array);
>> }
>> else if (jl_typeis(array_type, jl_float64_type)) { 
>>   double *data = (double*) jl_array_data(ret_array);
>> }
>>
>>
>> And the issue is that even if it is an Int64 or Float64, neither of those 
>> IF statements will return true.
>>
>>
>>
>> On Sunday, 16 October 2016 21:36:03 UTC-4, Kyle Kotowick wrote:
>>>
>>> Awesome, thanks. Could you show how to use it in a minimal code example? 
>>> Here's what I'm currently trying, but it does not appear to be working:
>>>
>>> jl_value_t *ret = jl_eval_string(code_string);
>>> void* array_type = jl_array_eltype(ret);
>>> jl_array_t *ret_array = (jl_array_t*)ret;
>>>
>>>
>>>
>>> if (jl_typeis(array_type, jl_int64_type)) {
>>>  long *data = (long*) jl_array_data(ret_array);
>>> }
>>> else if (jl_typeis(array_type, jl_float64_type)) { double *data = (
>>> double*) jl_array_data(ret_array);
>>> }
>>>
>>>
>>> On Friday, 14 October 2016 20:45:18 UTC-4, Isaiah wrote:
>>>>
>>>> On Fri, Oct 14, 2016 at 2:28 PM, Kyle Kotowick <ky...@kotowick.ca> 
>>>> wrote:
>>>>>
>>>>>
>>>>> After determining that an array was returned, how would you determine 
>>>>> what the inner type of the array is (i.e. the type of the objects it 
>>>>> contains)?
>>>>>
>>>>
>>>> `jl_array_eltype`
>>>>  
>>>>
>>>>>
>>>>> And furthermore, if it returns an array of type "Any", would there be 
>>>>> any way to tell what the type is of any arbitrary element in that array?
>>>>>
>>>>
>>>> `jl_typeof`, after retrieving the element (which will be boxed)
>>>>  
>>>>
>>>>>
>>>>> Thanks!
>>>>>
>>>>
>>>>
>

Re: [julia-users] Embedding Julia in C++ - Determining returned array types

2016-10-18 Thread Kyle Kotowick
I apologize for the formatting, that should be:

jl_value_t *ret = jl_eval_string(code_string);
void* array_type = jl_array_eltype(ret);
jl_array_t *ret_array = (jl_array_t*)ret;

if (jl_typeis(array_type, jl_int64_type)) {
  long *data = (long*) jl_array_data(ret_array);
}
else if (jl_typeis(array_type, jl_float64_type)) { 
  double *data = (double*) jl_array_data(ret_array);
}


And the issue is that even if it is an Int64 or Float64, neither of those 
IF statements will return true.


On Sunday, 16 October 2016 21:36:03 UTC-4, Kyle Kotowick wrote:
>
> Awesome, thanks. Could you show how to use it in a minimal code example? 
> Here's what I'm currently trying, but it does not appear to be working:
>
> jl_value_t *ret = jl_eval_string(code_string);
> void* array_type = jl_array_eltype(ret);
> jl_array_t *ret_array = (jl_array_t*)ret;
>
>
>
> if (jl_typeis(array_type, jl_int64_type)) {
>  long *data = (long*) jl_array_data(ret_array);
> }
> else if (jl_typeis(array_type, jl_float64_type)) { double *data = (double
> *) jl_array_data(ret_array);
> }
>
>
> On Friday, 14 October 2016 20:45:18 UTC-4, Isaiah wrote:
>>
>> On Fri, Oct 14, 2016 at 2:28 PM, Kyle Kotowick <ky...@kotowick.ca> wrote:
>>>
>>>
>>> After determining that an array was returned, how would you determine 
>>> what the inner type of the array is (i.e. the type of the objects it 
>>> contains)?
>>>
>>
>> `jl_array_eltype`
>>  
>>
>>>
>>> And furthermore, if it returns an array of type "Any", would there be 
>>> any way to tell what the type is of any arbitrary element in that array?
>>>
>>
>> `jl_typeof`, after retrieving the element (which will be boxed)
>>  
>>
>>>
>>> Thanks!
>>>
>>
>>

[julia-users] Embedding Julia in C++ - Determining returned array types

2016-10-14 Thread Kyle Kotowick
I'm trying to embed Julia code in a C++ app I'm building. I have it all 
working and can do some basic calls, all good so far.

One thing I'm struggling with, though, is determining what type of array is 
returned by a Julia evaluation. The only available documentation seems to 
be this page , 
which is far from comprehensive and doesn't show how to do this. Let's say 
I call some abstract Julia code (dynamic, unknown at compile time) like 
this:

jl_value_t *ret = jl_eval_string(some_code_string);
if(jl_is_array(ret)) {

// we now know that the returned value is an array, but how do we know 
what the inner type is? (e.g. Float64, Int64, etc.)

}

After determining that an array was returned, how would you determine what 
the inner type of the array is (i.e. the type of the objects it contains)?

And furthermore, if it returns an array of type "Any", would there be any 
way to tell what the type is of any arbitrary element in that array?

Thanks!