On Fri, Apr 27, 2018 at 10:45 AM, Esteban Lorenzano <estebanlm@gmail.com> wrote:
hi,
it all depends on how you are declaring your types.
here, for example you are passing
aTF_OutputArray getHandle
thatâs a âvoid*â value (an ExternalAddress or ExternalData object), and in declaration you have (if I read correctly):
TF_Output *
so, first question is: if TF_Output != void, then you have a coercing problem :).
âTF_Output != void, because this is a subclass of FFIOpaqueObject â
you can fix that just changing the notation to receive a void * (in C is all the same, but not in pharo :))
note that this can be happening in a lot of places, since your function has a lot of arguments, I just put an example of what can be wrong.
â I try to replace all types by void* here: TF_Session>>runSession: aTF_Session options: opsTF_Buffer inputs: inTF_OutputArray values: inTF_TensorArray count: inCount outputs: outTF_OutputArray values: outTF_TensorArrayPtr count: outCount targets: aTF_OperationArray count: targetCount metadata: metaTF_Buffer status: aTF_Status "F_CAPI_EXPORT extern void TF_SessionRun( TF_Session* session, // RunOptions const TF_Buffer* run_options, // Input tensors const TF_Output* inputs, TF_Tensor* const* input_values, int ninputs, // Output tensors const TF_Output* outputs, TF_Tensor** output_values, int noutputs, // Target operations const TF_Operation* const* target_opers, int ntargets, // RunMetadata TF_Buffer* run_metadata, // Output status TF_Status*);" ^ self ffiCall: #(void TF_SessionRun #(void* aTF_Session, void* opsTF_Buffer, void* inTF_OutputArray, void* inTF_TensorArray, int inCount, void* outTF_OutputArray, void* outTF_TensorArrayPtr, int outCount, void* aTF_OperationArray, int targetCount, void* metaTF_Buffer, void* aTF_Status)) module: TensorFlowCAPI but still have some error: "Could not coerce arguments" .... First method was called by : TF_Session>>runOutputs: aTF_OutputArray size: anInteger | status outvalues | status := TF_Status create. outvalues := FFIExternalArray externalNewType: 'TF_Tensor*' size: anInteger. self library runSession: self getHandle options: FFIExternalObject null inputs: FFIExternalObject null values: FFIExternalObject null count: 0 outputs: aTF_OutputArray getHandle values: outvalues getHandle count: anInteger targets: FFIExternalObject null count: 0 metadata: FFIExternalObject null status: status getHandle. status check. ^ outvalues called by: TF_Session>>runOutputs: anArrayOfTF_Outputs | outputs | outputs := FFIExternalArray externalNewType: 'TF_Output' fromArray: anArrayOfTF_Outputs. ^ self runOutputs: outputs size: anArrayOfTF_Outputs size called by : TF_Session>>runOutput: aTF_Output | results | results := self runOutputs: {aTF_Output}. ^ results first called by : testGraphZeros | graph session result zeros values | graph := TF_Graph create. zeros := graph zerosShaped: #(100 100 10). session := TF_Session on: graph. result := session runOutput: (zeros output: 0). values := result allFloats. self assert: #(100 100 10) equals: result shape. self assert: 100 * 100 * 10 equals: values size. self assert: 0 equals: values min. self assert: 0 equals: values max I'm a bit desperated :-( And impossible to know where the problem come from ... -- Serge Stinckwich UMI UMMISCO 209 (SU/IRD/UY1) "Programs must be written for people to read, and only incidentally for machines to execute."http://www.doesnotunderstand.org/