Skip to content

Commit

Permalink
Fixed error throwing on standard library functionalities.
Browse files Browse the repository at this point in the history
  • Loading branch information
nthnn committed Oct 31, 2024
1 parent 188d5a5 commit 37b9faa
Show file tree
Hide file tree
Showing 4 changed files with 233 additions and 131 deletions.
89 changes: 48 additions & 41 deletions lib/zhvlib/IO.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

#include "zhvlib/IO.hpp"

#include <zhivo/ast/TerminativeSignal.hpp>

#include <chrono>
#include <exception>
#include <filesystem>
Expand Down Expand Up @@ -84,10 +86,10 @@ ZHIVO_FUNC(io_readBoolean) {

ZHIVO_FUNC(io_fileRead) {
if(args.size() != 1)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 1 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject fileName = args.at(0);
Expand All @@ -112,10 +114,10 @@ ZHIVO_FUNC(io_fileRead) {

ZHIVO_FUNC(io_fileWrite) {
if(args.size() != 2)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 2 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject fileName = args.at(0),
Expand All @@ -131,10 +133,10 @@ ZHIVO_FUNC(io_fileWrite) {

ZHIVO_FUNC(io_fileSize) {
if(args.size() != 1)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 1 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject fileName = args.at(0);
Expand All @@ -157,10 +159,10 @@ ZHIVO_FUNC(io_fileSize) {

ZHIVO_FUNC(io_filePerms) {
if(args.size() != 1)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 1 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject fileName = args.at(0);
Expand Down Expand Up @@ -212,10 +214,10 @@ ZHIVO_FUNC(io_filePerms) {

ZHIVO_FUNC(io_fileCreationDate) {
if(args.size() != 1)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 1 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject fileName = args.at(0);
Expand All @@ -240,15 +242,17 @@ ZHIVO_FUNC(io_fileCreationDate) {
));
}

return DynamicObject(std::make_shared<std::vector<DynamicObject>>(returnValues));
return DynamicObject(std::make_shared<std::vector<DynamicObject>>(
returnValues
));
}

ZHIVO_FUNC(io_fileDelete) {
if(args.size() != 1)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 1 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject fileName = args.at(0);
Expand Down Expand Up @@ -290,10 +294,10 @@ ZHIVO_FUNC(io_fileDelete) {

ZHIVO_FUNC(io_folderCreate) {
if(args.size() != 1)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 1 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject folderName = args.at(0);
Expand Down Expand Up @@ -322,10 +326,10 @@ ZHIVO_FUNC(io_folderCreate) {

ZHIVO_FUNC(io_folderSize) {
if(args.size() != 1)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 1 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject folderName = args.at(0);
Expand Down Expand Up @@ -354,10 +358,10 @@ ZHIVO_FUNC(io_folderSize) {

ZHIVO_FUNC(io_folderCreationDate) {
if(args.size() != 1)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 1 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject folderName = args.at(0);
Expand Down Expand Up @@ -387,10 +391,10 @@ ZHIVO_FUNC(io_folderCreationDate) {

ZHIVO_FUNC(io_folderDelete) {
if(args.empty() || args.size() >= 2)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 1 or 2 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject folderName = args.at(0);
Expand All @@ -415,10 +419,10 @@ ZHIVO_FUNC(io_folderDelete) {

ZHIVO_FUNC(io_isFile) {
if(args.size() != 1)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 1 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject fileName = args.at(0);
Expand All @@ -432,10 +436,10 @@ ZHIVO_FUNC(io_isFile) {

ZHIVO_FUNC(io_isFolder) {
if(args.size() != 1)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 1 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject fileName = args.at(0);
Expand All @@ -449,10 +453,10 @@ ZHIVO_FUNC(io_isFolder) {

ZHIVO_FUNC(io_listAllFiles) {
if(args.size() != 1)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 1 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject fileName = args.at(0);
Expand All @@ -476,7 +480,10 @@ ZHIVO_FUNC(io_exit) {

DynamicObject exitCode = args.at(0);
if(!exitCode.isNumber())
throw std::runtime_error("Exit code is not a number.");
throw TerminativeThrowSignal(
std::move(address),
"Exit code is not a number."
);

exit(static_cast<int>(exitCode.getNumber()));
return {};
Expand Down
93 changes: 67 additions & 26 deletions lib/zhvlib/ML.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,40 @@

#include "zhvlib/ML.hpp"

#include <zhivo/ast/TerminativeSignal.hpp>

#include <cmath>
#include <exception>
#include <vector>

static inline std::vector<double> arrayToDoubleVector(std::vector<DynamicObject> array) {
static inline std::vector<double> arrayToDoubleVector(
std::shared_ptr<Token> address,
std::vector<DynamicObject> array
) {
std::vector<double> values(array.size());

#pragma omp parallel for
for(size_t i = 0; i < array.size(); i++) {
if(!array[i].isNumber())
throw std::runtime_error("Value from array is not a number");
throw TerminativeThrowSignal(
std::move(address),
"Value from array is not a number"
);

values[i] = array[i].getNumber();
}

return values;
}

static inline double calculateMean(std::vector<DynamicObject> array) {
std::vector<double> values = arrayToDoubleVector(array);
static inline double calculateMean(
std::shared_ptr<Token> address,
std::vector<DynamicObject> array
) {
std::vector<double> values = arrayToDoubleVector(
std::move(address),
array
);
size_t arraySize = array.size();
double sum = 0.0;

Expand All @@ -50,26 +64,32 @@ static inline double calculateMean(std::vector<DynamicObject> array) {

ZHIVO_FUNC(ml_trendline_calculate) {
if(args.size() != 2)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 2 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject xObj = args.at(0),
yObj = args.at(1);

if(!xObj.isArray() || !yObj.isArray())
throw std::runtime_error("Parameter x and y must be both number array");
throw TerminativeThrowSignal(
std::move(address),
"Parameter x and y must be both number array"
);

std::vector<DynamicObject> xObjArray = *xObj.getArray();
std::vector<DynamicObject> yObjArray = *yObj.getArray();

if(xObjArray.size() != yObjArray.size())
throw std::runtime_error("Data set size of x and y did not match");
throw TerminativeThrowSignal(
std::move(address),
"Data set size of x and y did not match"
);

double x = calculateMean(xObjArray),
y = calculateMean(yObjArray),
double x = calculateMean(std::move(address), xObjArray),
y = calculateMean(std::move(address), yObjArray),
numerator = 0.0,
denominator = 0.0;

Expand All @@ -95,10 +115,10 @@ ZHIVO_FUNC(ml_trendline_calculate) {

ZHIVO_FUNC(ml_trendline_calculateRmse) {
if(args.size() != 3)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 3 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject xObj = args.at(0),
Expand All @@ -107,16 +127,25 @@ ZHIVO_FUNC(ml_trendline_calculateRmse) {
std::vector<DynamicObject> regModel = *model.getArray();

if(!model.isArray() || regModel.size() != 2)
throw std::runtime_error("Invalid linear regression model");
throw TerminativeThrowSignal(
std::move(address),
"Invalid linear regression model"
);

if(!xObj.isArray() || !yObj.isArray())
throw std::runtime_error("Parameter x and y must be both number array");
throw TerminativeThrowSignal(
std::move(address),
"Parameter x and y must be both number array"
);

std::vector<DynamicObject> xObjArray = *xObj.getArray();
std::vector<DynamicObject> yObjArray = *yObj.getArray();

if(xObjArray.size() != yObjArray.size())
throw std::runtime_error("Data set size of x and y did not match");
throw TerminativeThrowSignal(
std::move(address),
"Data set size of x and y did not match"
);

double sumSquaredErrs = 0.0;
size_t paramSize = xObjArray.size();
Expand All @@ -133,8 +162,11 @@ ZHIVO_FUNC(ml_trendline_calculateRmse) {
));
params.emplace_back(xObjArray[i]);

double yPred = ml_trendline_predict(symtab, params)
.getNumber();
double yPred = ml_trendline_predict(
std::move(address),
symtab,
params
).getNumber();
double error = yObjArray[i].getNumber() - yPred;

sumSquaredErrs += error * error;
Expand All @@ -145,27 +177,36 @@ ZHIVO_FUNC(ml_trendline_calculateRmse) {

ZHIVO_FUNC(ml_trendline_predict) {
if(args.size() != 2)
throw std::runtime_error(
throw TerminativeThrowSignal(
std::move(address),
"Expecting 3 argument, got " +
std::to_string(args.size()) +
"."
std::to_string(args.size())
);

DynamicObject model = args.at(0),
value = args.at(1);
std::vector<DynamicObject> regModel = *model.getArray();

if(!model.isArray() || regModel.size() != 2)
throw std::runtime_error("Invalid linear regression model");
throw TerminativeThrowSignal(
std::move(address),
"Invalid linear regression model"
);

if(!value.isNumber())
throw std::runtime_error("Cannot predict linear regression value for non-numbers");
throw TerminativeThrowSignal(
std::move(address),
"Cannot predict linear regression value for non-numbers"
);

DynamicObject slope = regModel.at(0),
intercept = regModel.at(1);

if(!slope.isNumber() || !intercept.isNumber())
throw std::runtime_error("Linear regression model's slope and intercept must be a number");
throw TerminativeThrowSignal(
std::move(address),
"Linear regression model's slope and intercept must be a number"
);

return DynamicObject(
slope.getNumber() *
Expand Down
Loading

0 comments on commit 37b9faa

Please sign in to comment.