trait Symbolic[NativeOutput] extends AnyRef
Provides @Symbolic
annotation to create symbolic methods, in which you can create Layers from mathematical formulas.
Symbolic
is a dependent type class that calculates a specific Layer type according to NativeOutput
.
Combining with implicit-dependent-type compiler plugin,
it can be treated as a type annotation in the form of NativeOutput @Symbolic
, converting NativeOutput
to a specific Layer type.
Three usages of @Symbolic
Implicit parameter types used for symbol methods
In case that the implicit parameter of an method is marked with @Symbolic
, then this method is symbol method. The implicit parameter type marked with @Symbolic
is the input type of this symbol method.
In this case, NativeOutput @Symbolic
will be expanded as:
Identity[NativeOutput, Derivative type of NativeOutput]
For example:
def sumNetwork(implicit scores: INDArray @Symbolic): Double = { exp(scores).sum }
In the above code, because the derivative type of INDArray
is also INDArray
, the input type INDArray @Symbolic
of sumNetwork
, once expanded, is Identity[INDArray, INDArray]
Used for symbol method internal variable and return value
A NativeOutput @Symbolic
inside a symbol method, or at the return position of a symbol method, will be expanded as:
Layer.Aux[Tape.Aux[value type of input type, derivative type of input type], Tape.Aux[NativeOutput, derivative type of NativeOutput]]
For example:
def sumNetwork(implicit scores: INDArray @Symbolic): Double @Symbolic = { val expScores: INDArray @Symbolic = exp(scores) val result: Double @Symbolic = expScores.sum result }
In the above code, the type INDArray @Symbolic
of expScores
is expanded as:
Layer.Aux[Tape.Aux[INDArray, INDArray], Tape.Aux[INDArray, INDArray]]
The type Double @Symbolic
of result
is expanded as:
Layer.Aux[Tape.Aux[INDArray, INDArray], Tape.Aux[Double, Double]]
Used for cases excluding symbol method
(NativeInput => NativeOutput) @Symbolic
outside a symbol method, will be expanded as:
Layer.Aux[Tape.Aux[NativeInput, derivative type of NativeInput], Tape.Aux[NativeOutput, derivative type of NativeOutput]]
For example:
val predictor: (INDArray => Double) @Symbolic = sumNetwork
In the above code, type (INDArray => Double) @Symbolic
of predictor
is expanded as:
Layer.Aux[Tape.Aux[INDArray, INDArray], Tape.Aux[Double, Double]]
Custom symbol type
The @Symbolic
determines the mapping relation between the primitive type and derivative by checking Symbolic.ToLiteral implicit value. Therefore, @Symbolic
can be a custom symbol type once you define your own the implicit Symbolic.ToLiteral.
For example, if you want to support Short @Symbolic
, using Float as the derivative type of Short, then you can conduct the follows:
implicit object ShortToLiteral extends ToLiteral[Short] { override type Data = Short override type Delta = Float override def apply(data: Short) = Literal(data) } def makeShortNetwork(implicit input: Short @Symbolic): Short @Symbolic = { input } val shortNetwork: (Short => Short) @Symbolic = makeShortNetwork
Thus, type of shortNetwork
is expanded as:
Layer.Aux[Tape.Aux[Short, Float], Tape.Aux[Short, Float]]
- Annotations
- @implicitNotFound( ... )
- See also
- Alphabetic
- By Inheritance
- Symbolic
- AnyRef
- Any
- by autoToLayer
- by ToTapeOps
- by ToLayerOps
- by any2stringadd
- by StringFormat
- by Ensuring
- by ArrowAssoc
- Hide All
- Show All
- Public
- All
Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
- def +(other: String): String
- def ->[B](y: B): (Symbolic[NativeOutput], B)
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
- def ensuring(cond: (Symbolic[NativeOutput]) ⇒ Boolean, msg: ⇒ Any): Symbolic[NativeOutput]
- def ensuring(cond: (Symbolic[NativeOutput]) ⇒ Boolean): Symbolic[NativeOutput]
- def ensuring(cond: Boolean, msg: ⇒ Any): Symbolic[NativeOutput]
- def ensuring(cond: Boolean): Symbolic[NativeOutput]
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
- def formatted(fmtstr: String): String
-
def
forward: ((input: _1.Input)_1.Output) forSome {val _1: Layer { ... /* 2 definitions in type refinement */ }}
- Implicit
- This member is added by an implicit conversion from Symbolic[NativeOutput] to Aux[Input, Aux[OutputData, OutputDelta]] performed by method autoToLayer in com.thoughtworks.deeplearning.Symbolic. This conversion will take place only if an implicit value of type Aux[Symbolic[NativeOutput], Input, OutputData, OutputDelta] is in scope.
- Definition Classes
- Layer
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toLayer: Aux[Input, Aux[OutputData, OutputDelta]]
- Implicit
- This member is added by an implicit conversion from Symbolic[NativeOutput] to ToLayerOps[Symbolic[NativeOutput], Input, OutputData, OutputDelta] performed by method ToLayerOps in com.thoughtworks.deeplearning.Symbolic. This conversion will take place only if an implicit value of type Aux[Symbolic[NativeOutput], Input, OutputData, OutputDelta] is in scope.
- Definition Classes
- ToLayerOps
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
def
toTape: Aux[Data, Delta]
- Implicit
- This member is added by an implicit conversion from Symbolic[NativeOutput] to ToTapeOps[Symbolic[NativeOutput], Data, Delta] performed by method ToTapeOps in com.thoughtworks.deeplearning.Symbolic. This conversion will take place only if an implicit value of type Aux[Symbolic[NativeOutput], Data, Delta] is in scope.
- Definition Classes
- ToTapeOps
- Annotations
- @inline()
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
- def →[B](y: B): (Symbolic[NativeOutput], B)