aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rw-r--r--backend/api/api/.config/dotnet-tools.json12
-rw-r--r--backend/api/api/Controllers/DatasetController.cs32
-rw-r--r--backend/api/api/Controllers/ModelController.cs32
-rw-r--r--backend/api/api/Controllers/PredictorController.cs22
-rw-r--r--backend/api/api/Interfaces/IDatasetService.cs3
-rw-r--r--backend/api/api/Interfaces/IModelService.cs3
-rw-r--r--backend/api/api/Models/Model.cs4
-rw-r--r--backend/api/api/Services/DatasetService.cs20
-rw-r--r--backend/api/api/Services/FileService.cs2
-rw-r--r--backend/api/api/Services/FillAnEmptyDb.cs36
-rw-r--r--backend/api/api/Services/ModelService.cs18
-rw-r--r--backend/microservice/api/controller.py5
-rw-r--r--backend/microservice/api/newmlservice.py13
13 files changed, 162 insertions, 40 deletions
diff --git a/backend/api/api/.config/dotnet-tools.json b/backend/api/api/.config/dotnet-tools.json
new file mode 100644
index 00000000..e80b80ff
--- /dev/null
+++ b/backend/api/api/.config/dotnet-tools.json
@@ -0,0 +1,12 @@
+{
+ "version": 1,
+ "isRoot": true,
+ "tools": {
+ "dotnet-ef": {
+ "version": "6.0.5",
+ "commands": [
+ "dotnet-ef"
+ ]
+ }
+ }
+} \ No newline at end of file
diff --git a/backend/api/api/Controllers/DatasetController.cs b/backend/api/api/Controllers/DatasetController.cs
index c93ac9db..9a3c3d86 100644
--- a/backend/api/api/Controllers/DatasetController.cs
+++ b/backend/api/api/Controllers/DatasetController.cs
@@ -282,5 +282,37 @@ namespace api.Controllers
return Ok($"Dataset with ID = {id} deleted");
}
+
+ [HttpPut("UpdateAccessibleByLink/{datasetId}")]
+ [Authorize(Roles = "User")]
+ public ActionResult UpdateAccessibleByLink(string datasetId, [FromBody] bool accessibleByLink)
+ {
+ string uploaderId = getUserId();
+
+ Dataset dataset = _datasetService.GetOneDataset(datasetId);
+
+ if (uploaderId != dataset.uploaderId)
+ return Unauthorized();
+
+ _datasetService.UpdateAccessibleByLink(datasetId, accessibleByLink);
+
+ return Ok(dataset.accessibleByLink);
+ }
+
+ [HttpPut("UpdateIsPublic/{datasetId}")]
+ [Authorize(Roles = "User")]
+ public ActionResult UpdateIsPublic(string datasetId, [FromBody] bool isPublic)
+ {
+ string uploaderId = getUserId();
+
+ Dataset dataset = _datasetService.GetOneDataset(datasetId);
+
+ if (uploaderId != dataset.uploaderId)
+ return Unauthorized();
+
+ _datasetService.UpdateIsPublic(datasetId, isPublic);
+
+ return Ok(dataset.isPublic);
+ }
}
} \ No newline at end of file
diff --git a/backend/api/api/Controllers/ModelController.cs b/backend/api/api/Controllers/ModelController.cs
index c574de28..c7dfe89c 100644
--- a/backend/api/api/Controllers/ModelController.cs
+++ b/backend/api/api/Controllers/ModelController.cs
@@ -312,6 +312,38 @@ namespace api.Controllers
}
+ [HttpPut("UpdateAccessibleByLink/{modelId}")]
+ [Authorize(Roles = "User")]
+ public ActionResult UpdateAccessibleByLink(string modelId, [FromBody] bool accessibleByLink)
+ {
+ string uploaderId = getUserId();
+
+ Model model = _modelService.GetOneModel(modelId);
+
+ if (uploaderId != model.uploaderId)
+ return Unauthorized();
+
+ _modelService.UpdateAccessibleByLink(modelId, accessibleByLink);
+
+ return Ok(model.accessibleByLink);
+ }
+
+ [HttpPut("UpdateIsPublic/{modelId}")]
+ [Authorize(Roles = "User")]
+ public ActionResult UpdateIsPublic(string modelId, [FromBody] bool isPublic)
+ {
+ string uploaderId = getUserId();
+
+ Model model = _modelService.GetOneModel(modelId);
+
+ if (uploaderId != model.uploaderId)
+ return Unauthorized();
+
+ _modelService.UpdateIsPublic(modelId, isPublic);
+
+ return Ok(model.isPublic);
+ }
+
}
public class TrainModelObject
diff --git a/backend/api/api/Controllers/PredictorController.cs b/backend/api/api/Controllers/PredictorController.cs
index 6ff7746a..56095553 100644
--- a/backend/api/api/Controllers/PredictorController.cs
+++ b/backend/api/api/Controllers/PredictorController.cs
@@ -21,7 +21,7 @@ namespace api.Controllers
private readonly IHubContext<ChatHub> _ichat;
private readonly IModelService _modelService;
- public PredictorController(IPredictorService predictorService, IConfiguration configuration, IJwtToken Token, IMlConnectionService mlConnectionService, IExperimentService experimentService,IUserService userService, IHubContext<ChatHub> ichat,IModelService modelService)
+ public PredictorController(IPredictorService predictorService, IConfiguration configuration, IJwtToken Token, IMlConnectionService mlConnectionService, IExperimentService experimentService, IUserService userService, IHubContext<ChatHub> ichat, IModelService modelService)
{
_predictorService = predictorService;
jwtToken = Token;
@@ -78,7 +78,7 @@ namespace api.Controllers
//public ActionResult<List<Predictor>> Search(string name)
//{
// string username = getUsername();
-
+
// if (username == null)
// return BadRequest();
@@ -138,7 +138,7 @@ namespace api.Controllers
List<Predictor> lista = _predictorService.SortPredictors(userId, ascdsc, latest);
- if(latest == 0)
+ if (latest == 0)
return lista;
else
{
@@ -155,19 +155,23 @@ namespace api.Controllers
[HttpPost("add")]
public async Task<ActionResult<Predictor>> Post([FromBody] Predictor predictor)
{
- var user=_userService.GetUserById(predictor.uploaderId);
+ var user = _userService.GetUserById(predictor.uploaderId);
predictor.dateCreated = DateTime.Now.ToUniversalTime();
var model = _modelService.GetOneModel(predictor.modelId);
- if (model == null || user==null)
+ if (model == null || user == null)
return BadRequest("Model not found or user doesnt exist");
- Predictor p=_predictorService.Exists(predictor.modelId, predictor.experimentId);
- if (p == null)
+ Predictor p = _predictorService.Exists(predictor.modelId, predictor.experimentId);
+
+ if (p == null) {
_predictorService.Create(predictor);
- else
+ }
+ else {
+ predictor._id = p._id;
_predictorService.Update(p._id, predictor);
+ }
if (ChatHub.CheckUser(user._id))
foreach(var connection in ChatHub.getAllConnectionsOfUser(user._id))
- await _ichat.Clients.Client(connection).SendAsync("NotifyPredictor", predictor._id,model.name);
+ await _ichat.Clients.Client(connection).SendAsync("NotifyPredictor", predictor._id, model._id);
return CreatedAtAction(nameof(Get), new { id = predictor._id }, predictor);
}
diff --git a/backend/api/api/Interfaces/IDatasetService.cs b/backend/api/api/Interfaces/IDatasetService.cs
index 2f7d0010..5a91c82b 100644
--- a/backend/api/api/Interfaces/IDatasetService.cs
+++ b/backend/api/api/Interfaces/IDatasetService.cs
@@ -19,5 +19,8 @@ namespace api.Services
public void Update(Dataset dataset);
string GetDatasetId(string fileId);
//bool CheckDb();
+
+ public void UpdateAccessibleByLink(string datasetId, bool accessibleByLink);
+ public void UpdateIsPublic(string datasetId, bool isPublic);
}
}
diff --git a/backend/api/api/Interfaces/IModelService.cs b/backend/api/api/Interfaces/IModelService.cs
index 41cd279c..949c7278 100644
--- a/backend/api/api/Interfaces/IModelService.cs
+++ b/backend/api/api/Interfaces/IModelService.cs
@@ -19,6 +19,9 @@ namespace api.Services
void Delete(string userId, string name);
bool CheckHyperparameters(int inputNeurons, int hiddenLayerNeurons, int hiddenLayers, int outputNeurons);
bool CheckDb();
+
+ public void UpdateAccessibleByLink(string modelId, bool accessibleByLink);
+ public void UpdateIsPublic(string modelId, bool isPublic);
}
}
diff --git a/backend/api/api/Models/Model.cs b/backend/api/api/Models/Model.cs
index bbbf201e..6278cf8a 100644
--- a/backend/api/api/Models/Model.cs
+++ b/backend/api/api/Models/Model.cs
@@ -44,7 +44,7 @@ namespace api.Models
{
- public Layer(int layerNumber, string activationFunction, int neurons, string regularisation, float regularisationRate)
+ public Layer(int layerNumber, string activationFunction, int neurons, string regularisation, string regularisationRate)
{
this.layerNumber = layerNumber;
this.activationFunction = activationFunction;
@@ -57,7 +57,7 @@ namespace api.Models
public string activationFunction { get; set; }
public int neurons { get; set; }
public string regularisation { get; set; }
- public float regularisationRate { get; set; }
+ public string regularisationRate { get; set; }
}
}
diff --git a/backend/api/api/Services/DatasetService.cs b/backend/api/api/Services/DatasetService.cs
index 0b84721e..cd27f275 100644
--- a/backend/api/api/Services/DatasetService.cs
+++ b/backend/api/api/Services/DatasetService.cs
@@ -75,7 +75,7 @@ namespace api.Services
public Dataset GetOneDataset(string userId, string id)
{
- return _dataset.Find(dataset => dataset.uploaderId == userId && dataset._id == id && dataset.isPreProcess).FirstOrDefault();
+ return _dataset.Find(dataset => (dataset.uploaderId == userId || dataset.isPublic || dataset.accessibleByLink) && dataset._id == id && dataset.isPreProcess).FirstOrDefault();
}
public Dataset GetOneDatasetN(string userId, string name)
{
@@ -104,6 +104,22 @@ namespace api.Services
return dataset._id;
}
-
+
+ public void UpdateAccessibleByLink(string datasetId, bool accessibleByLink)
+ {
+ Dataset dataset = _dataset.Find(dataset => dataset._id == datasetId).FirstOrDefault();
+ dataset.accessibleByLink = accessibleByLink;
+
+ _dataset.ReplaceOne(dataset => dataset._id == datasetId, dataset);
+ }
+
+ public void UpdateIsPublic(string datasetId, bool isPublic)
+ {
+ Dataset dataset = _dataset.Find(dataset => dataset._id == datasetId).FirstOrDefault();
+ dataset.isPublic = isPublic;
+
+ _dataset.ReplaceOne(dataset => dataset._id == datasetId, dataset);
+ }
+
}
}
diff --git a/backend/api/api/Services/FileService.cs b/backend/api/api/Services/FileService.cs
index 6ef74ca1..e5b7945f 100644
--- a/backend/api/api/Services/FileService.cs
+++ b/backend/api/api/Services/FileService.cs
@@ -28,7 +28,7 @@ namespace api.Services
public string GetFilePath(string id, string uploaderId)
{
FileModel file;
- if (_dataset.Find(x=>x.fileId==id && x.isPublic==true).FirstOrDefault()!=null)
+ if (_dataset.Find(x=>x.fileId==id && (x.isPublic==true ||x.accessibleByLink==true)).FirstOrDefault()!=null)
file = _file.Find(x => x._id == id).FirstOrDefault();
else
file = _file.Find(x => x._id == id && x.uploaderId == uploaderId).FirstOrDefault();
diff --git a/backend/api/api/Services/FillAnEmptyDb.cs b/backend/api/api/Services/FillAnEmptyDb.cs
index cd35dc78..c74de67d 100644
--- a/backend/api/api/Services/FillAnEmptyDb.cs
+++ b/backend/api/api/Services/FillAnEmptyDb.cs
@@ -117,10 +117,10 @@ namespace api.Services
model.outputNeurons = 0;
model.layers = new[]
{
- new Layer ( 0,"sigmoid", 3,"l1", 1f ),
- new Layer ( 1,"sigmoid", 3,"l1", 1f ),
- new Layer ( 2,"sigmoid", 3,"l1", 1f ),
- new Layer ( 3,"sigmoid", 3,"l1", 1f ),
+ new Layer ( 0,"sigmoid", 3,"l1", "0" ),
+ new Layer ( 1,"sigmoid", 3,"l1", "0" ),
+ new Layer ( 2,"sigmoid", 3,"l1", "0" ),
+ new Layer ( 3,"sigmoid", 3,"l1", "0" ),
};
model.outputLayerActivationFunction = "sigmoid";
model.metrics = new string[] { };
@@ -281,11 +281,11 @@ namespace api.Services
model.outputNeurons = 0;
model.layers = new[]
{
- new Layer ( 0,"softmax", 3,"l1", 3f ),
- new Layer ( 1,"softmax", 3,"l1", 3f ),
- new Layer ( 2,"softmax", 3,"l1", 3f ),
- new Layer ( 3,"softmax", 3,"l1", 3f ),
- new Layer ( 4,"softmax", 3,"l1", 3f )
+ new Layer ( 0,"softmax", 3,"l1", "0" ),
+ new Layer ( 1,"softmax", 3,"l1", "0" ),
+ new Layer ( 2,"softmax", 3,"l1", "0" ),
+ new Layer ( 3,"softmax", 3,"l1", "0" ),
+ new Layer ( 4,"softmax", 3,"l1", "0" )
};
model.outputLayerActivationFunction = "softmax";
model.metrics = new string[] { };
@@ -435,9 +435,9 @@ namespace api.Services
model.outputNeurons = 0;
model.layers = new[]
{
- new Layer ( 0,"relu", 3,"l1", 1f ),
- new Layer ( 1,"relu", 3,"l1", 1f ),
- new Layer ( 2,"relu", 3,"l1", 1f )
+ new Layer ( 0,"relu", 3,"l1", "0" ),
+ new Layer ( 1,"relu", 3,"l1", "0" ),
+ new Layer ( 2,"relu", 3,"l1", "0" )
};
model.outputLayerActivationFunction = "relu";
model.metrics = new string[] { };
@@ -593,10 +593,10 @@ namespace api.Services
model.outputNeurons = 0;
model.layers = new[]
{
- new Layer ( 0,"sigmoid", 3,"l1", 1f ),
- new Layer ( 1,"sigmoid", 3,"l1", 1f ),
- new Layer ( 2,"sigmoid", 3,"l1", 1f ),
- new Layer ( 3,"sigmoid", 3,"l1", 1f )
+ new Layer ( 0,"sigmoid", 3,"l1", "0" ),
+ new Layer ( 1,"sigmoid", 3,"l1", "0" ),
+ new Layer ( 2,"sigmoid", 3,"l1", "0" ),
+ new Layer ( 3,"sigmoid", 3,"l1", "0" )
};
model.outputLayerActivationFunction = "sigmoid";
model.metrics = new string[] { };
@@ -748,8 +748,8 @@ namespace api.Services
model.outputNeurons = 0;
model.layers = new[]
{
- new Layer ( 0,"relu", 3,"l1", 1f ),
- new Layer ( 1,"relu", 3,"l1", 1f )
+ new Layer ( 0,"relu", 3,"l1", "0" ),
+ new Layer ( 1,"relu", 3,"l1", "0" )
};
model.outputLayerActivationFunction = "relu";
model.metrics = new string[] { };
diff --git a/backend/api/api/Services/ModelService.cs b/backend/api/api/Services/ModelService.cs
index 71db6340..07581fc9 100644
--- a/backend/api/api/Services/ModelService.cs
+++ b/backend/api/api/Services/ModelService.cs
@@ -67,7 +67,7 @@ namespace api.Services
public Model GetOneModelById(string userId, string id)
{
- return _model.Find(model => model.uploaderId == userId && model._id == id).FirstOrDefault();
+ return _model.Find(model => (model.uploaderId == userId || model.isPublic || model.accessibleByLink) && model._id == id).FirstOrDefault();
}
public Model GetOneModel(string id)
@@ -106,5 +106,21 @@ namespace api.Services
return true;
}
+
+ public void UpdateAccessibleByLink(string modelId, bool accessibleByLink)
+ {
+ Model model = _model.Find(model => model._id == modelId).FirstOrDefault();
+ model.accessibleByLink = accessibleByLink;
+
+ _model.ReplaceOne(model => model._id == modelId, model);
+ }
+
+ public void UpdateIsPublic(string modelId, bool isPublic)
+ {
+ Model model = _model.Find(model => model._id == modelId).FirstOrDefault();
+ model.isPublic = isPublic;
+
+ _model.ReplaceOne(model => model._id == modelId, model);
+ }
}
}
diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py
index c82634a2..bc8c17a0 100644
--- a/backend/microservice/api/controller.py
+++ b/backend/microservice/api/controller.py
@@ -1,3 +1,4 @@
+from asyncio.windows_events import NULL
from cmath import log
from dataclasses import dataclass
from distutils.command.upload import upload
@@ -112,12 +113,12 @@ def train():
"metricsMse":histMetrics[6],
"metricsValMse":histMetrics[7]
}
- #print(predictor)
+ print(predictor)
url = config.api_url + "/Predictor/add"
r = requests.post(url, json=predictor).text
- #print(r)
+ print(r)
return r
@app.route('/predict', methods = ['POST'])
diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py
index 99e3cae5..943e18a1 100644
--- a/backend/microservice/api/newmlservice.py
+++ b/backend/microservice/api/newmlservice.py
@@ -1,3 +1,4 @@
+from cmath import nan
from enum import unique
from itertools import count
import os
@@ -374,13 +375,15 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback):
- classifier.compile(loss =paramsModel["lossFunction"] , optimizer =opt, metrics = ['accuracy','mae','mse'])
+ classifier.compile(loss =paramsModel["lossFunction"] , optimizer =opt, metrics = ['accuracy'])
history=classifier.fit( x=x_train, y=y_train, epochs = paramsModel['epochs'],batch_size=int(paramsModel['batchSize']),callbacks=callback(x_test, y_test,paramsModel['_id']),validation_data=(x_val, y_val))
hist=history.history
#plt.plot(hist['accuracy'])
- #plt.show()
+ plt.plot(history.history['loss'])
+ plt.plot(history.history['val_loss'])
+ plt.show()
y_pred=classifier.predict(x_test)
y_pred=np.argmax(y_pred,axis=1)
@@ -410,7 +413,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback):
#from ann_visualizer.visualize import ann_viz;
#ann_viz(classifier, title="My neural network")
- return filepath,[hist['loss'],hist['val_loss'],hist['accuracy'],hist['val_accuracy'],hist['mae'],hist['val_mae'],hist['mse'],hist['val_mse']]
+ return filepath,[hist['loss'],hist['val_loss'],hist['accuracy'],hist['val_accuracy'],[],[],[],[]]
elif(problem_type=='binarni-klasifikacioni'):
#print('*************************************************************************binarni')
@@ -444,7 +447,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback):
classifier.add(tf.keras.layers.Dense(units=1, activation=paramsModel['outputLayerActivationFunction']))#izlazni sloj
- classifier.compile(loss =paramsModel["lossFunction"] , optimizer =opt , metrics = ['accuracy','mae','mse'])
+ classifier.compile(loss =paramsModel["lossFunction"] , optimizer =opt , metrics = ['accuracy'])
history=classifier.fit( x=x_train, y=y_train, epochs = paramsModel['epochs'],batch_size=int(paramsModel['batchSize']),callbacks=callback(x_test, y_test,paramsModel['_id']),validation_data=(x_val, y_val))
hist=history.history
@@ -468,7 +471,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback):
logloss = float(sm.log_loss(y_test, y_pred))
"""
- return filepath,[hist['loss'],hist['val_loss'],hist['accuracy'],hist['val_accuracy'],hist['mae'],hist['val_mae'],hist['mse'],hist['val_mse']]
+ return filepath,[hist['loss'],hist['val_loss'],hist['accuracy'],hist['val_accuracy'],[],[],[],[]]
elif(problem_type=='regresioni'):
reg=paramsModel['layers'][0]['regularisation']