@eagleoutice/flowr-dev
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
77 lines • 3.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataFrameDomain = void 0;
const positive_interval_domain_1 = require("../domains/positive-interval-domain");
const product_domain_1 = require("../domains/product-domain");
const set_range_domain_1 = require("../domains/set-range-domain");
/**
* The data frame abstract domain as product domain of a column names domain, column count domain, and row count domain.
*/
class DataFrameDomain extends product_domain_1.ProductDomain {
create(value) {
return new DataFrameDomain(value);
}
/**
* The current abstract value of the column names domain.
*/
get colnames() {
return this.value.colnames;
}
/**
* The current abstract value of the column count domain.
*/
get cols() {
return this.value.cols;
}
/**
* The current abstract value of the row count domain.
*/
get rows() {
return this.value.rows;
}
static bottom(maxColNames) {
return new DataFrameDomain({
colnames: set_range_domain_1.SetRangeDomain.bottom(maxColNames),
cols: positive_interval_domain_1.PosIntervalDomain.bottom(),
rows: positive_interval_domain_1.PosIntervalDomain.bottom()
});
}
static top(maxColNames) {
return new DataFrameDomain({
colnames: set_range_domain_1.SetRangeDomain.top(maxColNames),
cols: positive_interval_domain_1.PosIntervalDomain.top(),
rows: positive_interval_domain_1.PosIntervalDomain.top()
});
}
reduce(value) {
if (value.colnames.isValue() && value.cols.isValue()) {
const minColNames = value.colnames.must.size;
const maxColNames = value.colnames.isFinite() ? value.colnames.must.size + value.colnames.may.size : Infinity;
if (minColNames >= value.cols.upper) {
value = {
...value,
colnames: value.colnames.create({ must: value.colnames.must, may: new Set() })
};
}
else if (value.colnames.isFinite() && value.colnames.may.size > 0 && maxColNames <= value.cols.lower) {
value = {
...value,
colnames: value.colnames.create({ must: value.colnames.upper(), may: new Set() })
};
}
}
if (value.colnames.isValue() && value.cols.isValue()) {
const minColNames = value.colnames.must.size;
const maxColNames = value.colnames.isFinite() ? value.colnames.must.size + value.colnames.may.size : Infinity;
if ((minColNames > value.cols.lower || maxColNames < value.cols.upper) && Math.max(minColNames, value.cols.lower) <= Math.min(maxColNames, value.cols.upper)) {
value = {
...value,
cols: value.cols.create([Math.max(minColNames, value.cols.lower), Math.min(maxColNames, value.cols.upper)])
};
}
}
return value;
}
}
exports.DataFrameDomain = DataFrameDomain;
//# sourceMappingURL=dataframe-domain.js.map