AI-TensorFlow-Libtensorflow

 view release on metacpan or  search on metacpan

t/upstream/CAPI/015_Graph.t  view on Meta::CPAN

#!/usr/bin/env perl

use Test2::V0;
use lib 't/lib';
use TF_TestQuiet;
use TF_Utils;
use aliased 'AI::TensorFlow::Libtensorflow';
use AI::TensorFlow::Libtensorflow::DataType qw(INT32);
use AI::TensorFlow::Libtensorflow::Lib::Types qw(
	TFOutput TFOutputFromTuple
	TFInput  TFInputFromTuple
);
use Types::Standard qw(HashRef);

my $TFOutput = TFOutput->plus_constructors(
		HashRef, 'New'
	)->plus_coercions(TFOutputFromTuple);
my $TFInput = TFInput->plus_constructors(
		HashRef, 'New'
	)->plus_coercions(TFInputFromTuple);
subtest "(CAPI, Graph)" => sub {
	my $s = AI::TensorFlow::Libtensorflow::Status->New;
	my $graph = AI::TensorFlow::Libtensorflow::Graph->New;

	note 'Make a placeholder operation.';
	my $feed = TF_Utils::Placeholder($graph, $s);
	TF_Utils::AssertStatusOK($s);

	subtest 'Test TF_Operation*() query functions.' => sub {
		is $feed->Name, 'feed', 'name';
		is $feed->OpType, 'Placeholder', 'optype';
		is $feed->Device, '', 'device';
		is $feed->NumOutputs, 1, 'num outputs';
		cmp_ok $feed->OutputType(
			$TFOutput->coerce({oper => $feed, index => 0})
		), 'eq', INT32, 'output 0 type';

		is $feed->OutputListLength("output", $s), 1, 'output list length';
		TF_Utils::AssertStatusOK($s);

		is $feed->NumInputs, 0, 'num inputs';
		is $feed->OutputNumConsumers(
			$TFOutput->coerce({oper => $feed, index => 0})
		), 0, 'output 0 num consumers';
		is $feed->NumControlInputs, 0, 'num control inputs';
		is $feed->NumControlOutputs, 0, 'num control outputs';
	};

	subtest 'Test not found errors in TF_Operation*() query functions.' => sub {
		is $feed->OutputListLength('bogus', $s), -1, 'bogus output';
		note TF_Utils::AssertStatusNotOK($s);
	};

	note 'Make a constant oper with the scalar "3".';
	my $three = TF_Utils::ScalarConst($graph, $s, 'scalar', INT32, 3);
	TF_Utils::AssertStatusOK($s);

	note 'Add oper.';
	my $add = TF_Utils::Add($feed, $three, $graph, $s);
	TF_Utils::AssertStatusOK($s);

	subtest 'Test TF_Operation*() query functions.' => sub {
		is $add->Name, 'add', 'name';
		is $add->OpType, 'AddN', 'op type';
		is $add->Device, '', 'device';
		is $add->NumOutputs, 1, 'num outputs';
		cmp_ok $add->OutputType($TFOutput->coerce([$add => 0])),
			'eq', INT32, 'output type';
		is $add->OutputListLength('sum', $s), 1, 'output list length';
		TF_Utils::AssertStatusOK($s);
		is $add->NumInputs, 2, 'num inputs';
		is $add->InputListLength("inputs", $s), 2, 'InputListLength';
		TF_Utils::AssertStatusOK($s);
		cmp_ok $add->InputType( $TFInput->coerce([$add, 0])  ),
			'eq', INT32, 'input type 0';
		cmp_ok $add->InputType( $TFInput->coerce([$add, 1])),
			'eq', INT32, 'input type 1';
		my $add_in_0 = $add->Input($TFInput->coerce([$add, 0]));
		is $add_in_0->oper->Name, $feed->Name, 'feed.out[0] -> add.in[0] by name';
		is $add_in_0->index, 0, 'by index';
		my $add_in_1 = $add->Input( $TFInput->coerce([$add, 1]) );
		is $add_in_1->oper->Name, $three->Name, 'three.out[0] -> add.in[1] by name';
		is $add_in_1->index, 0, 'by index';
		is $add->OutputNumConsumers(
			$TFOutput->coerce([$add, 0])),
			0, 'no consumers of add.out[0]';
		is $add->NumControlInputs, 0, 'no control inputs';
		is $add->NumControlOutputs, 0, 'no control outputs';
	};

	subtest 'Placeholder oper now has a consumer.' => sub {
		is $feed->OutputNumConsumers(
				$TFOutput->coerce([$feed, 0])
			), 1, 'feed has 1 consumer';
		my ($feed_port) = @{ $feed->OutputConsumers(
			$TFOutput->coerce([$feed => 0])
		) };
		is $feed_port->oper->Name, $add->Name, 'feed.out[0] -> add.in[0], by name';
		is $feed_port->index, 0, 'by index';

		note 'The scalar const oper also has a consumer.';
		is $three->OutputNumConsumers(
			$TFOutput->coerce([$three, 0])
		), 1, '1 consumer of scalar three';
		my ($three_port) = @{ $three->OutputConsumers(
			$TFOutput->coerce([$three => 0])
		) };
		is $three_port->oper->Name, $add->Name, 'three.out[0] -> add.in[1], by name';
		is $three_port->index, 1, 'by index';



( run in 0.383 second using v1.01-cache-2.11-cpan-f6376fbd888 )