private IntPtr handle = IntPtr.Zero;
private bool disposed = false;
+ /// if false, model will be destroy dataset handle
+ private bool hasOwnership = true;
+
/// <summary>
/// Constructs the dataset.
/// </summary>
public Dataset()
{
NNTrainerError ret = Interop.Dataset.Create(out handle);
+ if (ret != NNTrainerError.None) {
+ handle = IntPtr.Zero;
+ }
NNTrainer.CheckException(ret, "Failed to create dataset instance");
Log.Info(NNTrainer.Tag, "Create Dataset");
}
{
// release managed object
}
+
+ disposed = true;
+
+ if (!hasOwnership){
+ Log.Info(NNTrainer.Tag, "Cannot destroy dataset already added in a Model. Model will destroy this dataset");
+ return;
+ }
+
// release unmanaged object
if (handle != IntPtr.Zero)
{
handle = IntPtr.Zero;
}
- disposed = true;
}
/// <summary>
return handle;
}
+ internal void RemoveOwnership()
+ {
+ this.hasOwnership = false;
+ }
+
/// <summary>
/// Sets the neural network dataset property.
/// </summary>
public Layer(NNTrainerLayerType type)
{
NNTrainerError ret = Interop.Layer.Create(out handle, type);
+ if (ret != NNTrainerError.None) {
+ handle = IntPtr.Zero;
+ }
NNTrainer.CheckException(ret, "Failed to create model instance");
Log.Info(NNTrainer.Tag, $"Create layer with type:{type}");
}
disposed = true;
if (!hasOwnership){
- Log.Error(NNTrainer.Tag, "Cannot destroy layer already added in a Model. Model will destroy this layer");
+ Log.Info(NNTrainer.Tag, "Cannot destroy layer already added in a Model. Model will destroy this layer");
return;
}
NNTrainer.CheckException(NNTrainerError.InvalidParameter, "modelConf is null");
NNTrainerError ret = Interop.Model.ConstructWithConf(modelConf, out handle);
+ if (ret != NNTrainerError.None) {
+ handle = IntPtr.Zero;
+ }
NNTrainer.CheckException(ret, "Failed to create model instance with modelConf");
Log.Info(NNTrainer.Tag, "Created Model with Conf path: "+ modelConf);
}
public Layer GetLayer(string layerName)
{
IntPtr layerHandle = IntPtr.Zero;
- if (string.IsNullOrEmpty(layerName))
+ if (string.IsNullOrEmpty(layerName))
NNTrainer.CheckException(NNTrainerError.InvalidParameter, "layerName is null");
NNTrainerError ret = Interop.Model.GetLayer(handle, layerName, out layerHandle);
NNTrainerError ret = Interop.Model.SetOptimizer(handle, optimizer.GetHandle());
NNTrainer.CheckException(ret, "Failed to set optimizer");
+ optimizer.RemoveOwnership();
}
/// <summary>
NNTrainerError ret = Interop.Model.SetDataset(handle, dataset.GetHandle());
NNTrainer.CheckException(ret, "Failed to set dataset");
+ dataset.RemoveOwnership();
}
internal static TensorsInfo CreateTensorsInfoFormHandle(IntPtr handle)
private IntPtr handle = IntPtr.Zero;
private bool disposed = false;
+ /// if false, model will be destroy optimizer handle
+ private bool hasOwnership = true;
+
/// <summary>
/// Creates a neural network optimizer.
/// </summary>
public Optimizer(NNTrainerOptimizerType type)
{
NNTrainerError ret = Interop.Optimizer.Create(out handle, type);
+ if (ret != NNTrainerError.None) {
+ handle = IntPtr.Zero;
+ }
NNTrainer.CheckException(ret, "Failed to create optimizer instance");
Log.Info(NNTrainer.Tag, $"Create optimizer with type:{type}");
}
{
// release managed object
}
+
+ disposed = true;
+
+ if (!hasOwnership){
+ Log.Info(NNTrainer.Tag, "Cannot destroy optimizer already added in a Model. Model will destroy this optimizer");
+ return;
+ }
+
// release unmanaged object
if (handle != IntPtr.Zero)
{
handle = IntPtr.Zero;
}
- disposed = true;
}
/// <summary>
{
return handle;
}
+
+ internal void RemoveOwnership()
+ {
+ this.hasOwnership = false;
+ }
}
}