|
|
|
@ -72,21 +72,34 @@ func newOptimizer(paramWithConfigs ParameterWithConfig, State []byte) *optimizer
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
o.config = c
|
|
|
|
|
o.opt = C.paddle_create_optimizer((*C.uchar)(&c[0]), C.int(len(c)),
|
|
|
|
|
C.paddle_element_type(p.ElementType), cbuffer, C.int(paramBufferSize), (*C.char)(cstate), C.int(len(s)))
|
|
|
|
|
o.opt = C.paddle_create_optimizer(
|
|
|
|
|
(*C.uchar)(&c[0]),
|
|
|
|
|
C.int(len(c)),
|
|
|
|
|
C.paddle_element_type(p.ElementType),
|
|
|
|
|
cbuffer,
|
|
|
|
|
C.int(paramBufferSize),
|
|
|
|
|
(*C.char)(cstate),
|
|
|
|
|
C.int(len(s)),
|
|
|
|
|
)
|
|
|
|
|
return o
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (o *optimizer) GetWeights() []byte {
|
|
|
|
|
var buffer unsafe.Pointer
|
|
|
|
|
// we do not own the buffer, no need to free later.
|
|
|
|
|
bufferLen := C.paddle_optimizer_get_weights(o.opt, &buffer)
|
|
|
|
|
return cArrayToSlice(buffer, int(bufferLen)*C.sizeof_float)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (o *optimizer) GetStates() []byte {
|
|
|
|
|
var cbuffer *C.char
|
|
|
|
|
// we owns the state buffer, need to free later.
|
|
|
|
|
cbufferLen := C.paddle_optimizer_get_state(o.opt, &cbuffer)
|
|
|
|
|
return cArrayToSlice(unsafe.Pointer(cbuffer), int(cbufferLen))
|
|
|
|
|
buf := cArrayToSlice(unsafe.Pointer(cbuffer), int(cbufferLen))
|
|
|
|
|
cpy := make([]byte, len(buf))
|
|
|
|
|
copy(cpy, buf)
|
|
|
|
|
C.free(unsafe.Pointer(cbuffer))
|
|
|
|
|
return cpy
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (o *optimizer) UpdateParameter(g Gradient) error {
|
|
|
|
|