Thread overview
Templates args
Jul 14, 2016
Andrey
Jul 14, 2016
Andrey
Jul 14, 2016
Lodovico Giaretta
Jul 14, 2016
Andrey
Jul 14, 2016
ag0aep6g
Jul 14, 2016
Andrey
July 14, 2016
Hi guys!

Help a newbie please.

Playing with D and trying to understand some features.
Here is my try to carry out my code from C++ project to D

struct Sigmoid(T)
{
  const T Function(T value)
  {
   ...
  }
  const T DerivateFunction(const T value)
  {
   ...
  }
}

struct Neurons_layer(T = float, size_t neurons_num = 0, F = Sigmoid!T)
  if(isFloatingPoint!T && is(typeof(F.Function)))
    {
    private:
      static if(neurons_num > 0)
	T[neurons_num] _neurons_arr;
      else
	T[] _neurons_arr;

    private:
      alias Function = F.Function;
}

unittest
{
  Neurons_layer!(float,5,Sigmoid!float) nf;
}


The question is - How to make in pretty way this line:
 Neurons_layer!(float,5,Sigmoid!float) nf;


July 14, 2016
On Thursday, 14 July 2016 at 19:27:14 UTC, Andrey wrote:
> Hi guys!
>
> Help a newbie please.
>
> Playing with D and trying to understand some features.
> Here is my try to carry out my code from C++ project to D
>
> struct Sigmoid(T)
> {
>   const T Function(T value)
>   {
>    ...
>   }
>   const T DerivateFunction(const T value)
>   {
>    ...
>   }
> }
>
> struct Neurons_layer(T = float, size_t neurons_num = 0, F = Sigmoid!T)
>   if(isFloatingPoint!T && is(typeof(F.Function)))
>     {
>     private:
>       static if(neurons_num > 0)
> 	T[neurons_num] _neurons_arr;
>       else
> 	T[] _neurons_arr;
>
>     private:
>       alias Function = F.Function;
> }
>
> unittest
> {
>   Neurons_layer!(float,5,Sigmoid!float) nf;
> }
>
>
> The question is - How to make in pretty way this line:
>  Neurons_layer!(float,5,Sigmoid!float) nf;

to something like - Neurons_layer!(float,5,Sigmoid) nf;
July 14, 2016
On Thursday, 14 July 2016 at 19:28:23 UTC, Andrey wrote:
> On Thursday, 14 July 2016 at 19:27:14 UTC, Andrey wrote:
>> Hi guys!
>>
>> Help a newbie please.
>>
>> Playing with D and trying to understand some features.
>> Here is my try to carry out my code from C++ project to D
>>
>> struct Sigmoid(T)
>> {
>>   const T Function(T value)
>>   {
>>    ...
>>   }
>>   const T DerivateFunction(const T value)
>>   {
>>    ...
>>   }
>> }
>>
>> struct Neurons_layer(T = float, size_t neurons_num = 0, F = Sigmoid!T)
>>   if(isFloatingPoint!T && is(typeof(F.Function)))
>>     {
>>     private:
>>       static if(neurons_num > 0)
>> 	T[neurons_num] _neurons_arr;
>>       else
>> 	T[] _neurons_arr;
>>
>>     private:
>>       alias Function = F.Function;
>> }
>>
>> unittest
>> {
>>   Neurons_layer!(float,5,Sigmoid!float) nf;
>> }
>>
>>
>> The question is - How to make in pretty way this line:
>>  Neurons_layer!(float,5,Sigmoid!float) nf;
>
> to something like - Neurons_layer!(float,5,Sigmoid) nf;

You don't need Sigmoid!float at all. This will work:

Neurons_layer!(float, 5) nf;

as you provided a default value for the third argument.
July 14, 2016
On Thursday, 14 July 2016 at 19:28:23 UTC, Andrey wrote:
> On Thursday, 14 July 2016 at 19:27:14 UTC, Andrey wrote:
[...]
>> struct Sigmoid(T)
>> {
[...]
>> }
>>
>> struct Neurons_layer(T = float, size_t neurons_num = 0, F = Sigmoid!T)
>>   if(isFloatingPoint!T && is(typeof(F.Function)))
>>     {
[...]
>>     private:
>>       alias Function = F.Function;
>> }
>>
>> unittest
>> {
>>   Neurons_layer!(float,5,Sigmoid!float) nf;
>> }
>>
>>
>> The question is - How to make in pretty way this line:
>>  Neurons_layer!(float,5,Sigmoid!float) nf;
>
> to something like - Neurons_layer!(float,5,Sigmoid) nf;

Make F an alias parameter:

----
struct Neurons_layer(T = float, size_t neurons_num = 0, alias F = Sigmoid)
  if(isFloatingPoint!T && is(typeof(F!T.Function)))
{
    ...
    private:
      alias Function = F!T.Function;
}

unittest
{
  Neurons_layer!(float,5,Sigmoid) nf;
}
----
July 14, 2016
On 7/14/16 3:28 PM, Andrey wrote:
> On Thursday, 14 July 2016 at 19:27:14 UTC, Andrey wrote:

>> struct Neurons_layer(T = float, size_t neurons_num = 0, F = Sigmoid!T)
>>   if(isFloatingPoint!T && is(typeof(F.Function)))
>>     {
>>     private:
>>       static if(neurons_num > 0)
>>     T[neurons_num] _neurons_arr;
>>       else
>>     T[] _neurons_arr;
>>
>>     private:
>>       alias Function = F.Function;
>> }
>>
>> unittest
>> {
>>   Neurons_layer!(float,5,Sigmoid!float) nf;
>> }
>>
>>
>> The question is - How to make in pretty way this line:
>>  Neurons_layer!(float,5,Sigmoid!float) nf;
>
> to something like - Neurons_layer!(float,5,Sigmoid) nf;

You can't pass an uninstantiated template type as a type, but you can pass as an alias:

struct Neurons_layer(T = float, size_t neurons_num = 0, alias FTemp = Sigmoid)
{
   alias F = FTemp!T;
   ...

-Steve
July 14, 2016
On Thursday, 14 July 2016 at 19:48:20 UTC, Lodovico Giaretta wrote:

>
> You don't need Sigmoid!float at all. This will work:
>
> Neurons_layer!(float, 5) nf;
>
> as you provided a default value for the third argument.

Yes, default init is present, but double, real types are desirable
July 14, 2016
On Thursday, 14 July 2016 at 19:48:38 UTC, ag0aep6g wrote:

>
> Make F an alias parameter:
>
> ----
> struct Neurons_layer(T = float, size_t neurons_num = 0, alias F = Sigmoid)
>   if(isFloatingPoint!T && is(typeof(F!T.Function)))
> {
>     ...
>     private:
>       alias Function = F!T.Function;
> }
>
> unittest
> {
>   Neurons_layer!(float,5,Sigmoid) nf;
> }
> ----

WOW! It's works. Thanks.
I like D more and more )))