@@ -398,54 +398,84 @@ static Status ValuesFromConstNode(const NodeDef& node,
398398 }
399399 values->resize (n_elements);
400400
401- auto val_lastsaved = (T)0 ; // cast
401+ // Extract dtype and size of the values provided in proto
402+ auto & tensor = node.attr ().at (" value" ).tensor ();
403+ auto dt = node.attr ().at (" dtype" ).type ();
404+ int64 val_size = 0 ;
405+ switch (dt) {
406+ // TODO(amprocte/NGRAPH-2502): there are more element types to support
407+ // here
408+ case DT_INT32:
409+ val_size = tensor.int_val_size ();
410+ break ;
411+ case DT_INT64:
412+ val_size = tensor.int64_val_size ();
413+ break ;
414+ case DT_FLOAT:
415+ val_size = tensor.float_val_size ();
416+ break ;
417+ case DT_BOOL:
418+ val_size = tensor.bool_val_size ();
419+ break ;
420+ case DT_DOUBLE:
421+ val_size = tensor.double_val_size ();
422+ break ;
423+ default :
424+ OVTF_VLOG (0 ) << " Const node has empty tensor and we don't know how to "
425+ " handle this element type" ;
426+ OVTF_VLOG (0 ) << node.DebugString ();
427+ OVTF_VLOG (0 ) << shape.DebugString ();
428+ return errors::Unimplemented (" Encountered unknown element type " ,
429+ DataType_Name (dt), " on an empty tensor" );
430+ }
402431
432+ auto val_lastsaved = (T)0 ; // cast
403433 for (auto i = 0 ; i < n_elements; i++) {
404- auto & tensor = node.attr ().at (" value" ).tensor ();
405- auto dt = node.attr ().at (" dtype" ).type ();
406- int64 val_size = 0 ;
407- auto val_i = (T)0 ; // cast
408- switch (dt) {
409- // TODO(amprocte/NGRAPH-2502): there are more element types to support
410- // here
411- case DT_INT32:
412- val_size = tensor.int_val_size ();
413- if (val_size > 0 ) val_i = tensor.int_val ()[i];
414- break ;
415- case DT_INT64:
416- val_size = tensor.int64_val_size ();
417- if (val_size > 0 ) val_i = tensor.int64_val ()[i];
418- break ;
419- case DT_FLOAT:
420- val_size = tensor.float_val_size ();
421- if (val_size > 0 ) val_i = tensor.float_val ()[i];
422- break ;
423- case DT_BOOL:
424- val_size = tensor.bool_val_size ();
425- if (val_size > 0 ) val_i = tensor.bool_val ()[i];
426- break ;
427- case DT_DOUBLE:
428- val_size = tensor.double_val_size ();
429- if (val_size > 0 ) val_i = tensor.double_val ()[i];
430- break ;
431- default :
432- OVTF_VLOG (0 )
433- << " Const node has empty tensor and we don't know how to "
434- " handle this element type" ;
435- OVTF_VLOG (0 ) << node.DebugString ();
436- OVTF_VLOG (0 ) << shape.DebugString ();
437- return errors::Unimplemented (" Encountered unknown element type " ,
438- DataType_Name (dt),
439- " on an empty tensor" );
440- }
434+ // Default value set to 0 and typecasted to the dtype of the const op
435+ auto val_i = (T)0 ;
436+ // If no values are specified for the const node, fill all the values with
437+ // default value or return error based on the TF version
441438 if (val_size == 0 ) {
442439#if (TF_MAJOR_VERSION > 1 && TF_MINOR_VERSION >= 7)
443- val_i = 0 ;
440+ (*values)[i] = val_i ;
444441#else
445442 return errors::InvalidArgument (" Empty values vector" );
446443#endif
444+ continue ;
445+ }
447446
448- } else if (i < val_size) {
447+ // If the values are same for all the elements or repeating after certain
448+ // index, then copy the single value or the last occured value for all the
449+ // remaining indices
450+ if (i < val_size) {
451+ switch (dt) {
452+ // TODO(amprocte/NGRAPH-2502): there are more element types to support
453+ // here
454+ case DT_INT32:
455+ val_i = tensor.int_val ()[i];
456+ break ;
457+ case DT_INT64:
458+ val_i = tensor.int64_val ()[i];
459+ break ;
460+ case DT_FLOAT:
461+ val_i = tensor.float_val ()[i];
462+ break ;
463+ case DT_BOOL:
464+ val_i = tensor.bool_val ()[i];
465+ break ;
466+ case DT_DOUBLE:
467+ val_i = tensor.double_val ()[i];
468+ break ;
469+ default :
470+ OVTF_VLOG (0 )
471+ << " Const node has empty tensor and we don't know how to "
472+ " handle this element type" ;
473+ OVTF_VLOG (0 ) << node.DebugString ();
474+ OVTF_VLOG (0 ) << shape.DebugString ();
475+ return errors::Unimplemented (" Encountered unknown element type " ,
476+ DataType_Name (dt),
477+ " on an empty tensor" );
478+ }
449479 (*values)[i] = val_i;
450480 val_lastsaved = val_i;
451481 } else {
@@ -4412,7 +4442,6 @@ Status Builder::TranslateGraph(
44124442 OVTF_VLOG (5 ) << " Not using Fused translation for "
44134443 << " CTCGreedyDecoder and SparseToDense Ops" ;
44144444 }
4415- //
44164445
44174446 const function<Status (const Node*, const std::vector<const Tensor*>&,
44184447 Builder::OpMap&)>* op_fun;
0 commit comments