Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/deploy-on-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -322,11 +322,11 @@ jobs:
if [[ "${{ matrix.py }}" == "3.8" ]]; then
echo "Setting macos_archs as: macos_archs='x86_64'"
echo "macos_archs=x86_64" >> $GITHUB_OUTPUT
echo "macos_deployment_target=10.15" >> $GITHUB_OUTPUT
echo "macos_deployment_target=14" >> $GITHUB_OUTPUT
else
echo "Setting macos_archs as: macos_archs='x86_64 arm64'"
echo 'macos_archs=x86_64 arm64' >> $GITHUB_OUTPUT
echo "macos_deployment_target=11.0" >> $GITHUB_OUTPUT
echo "macos_deployment_target=14" >> $GITHUB_OUTPUT
fi
else
echo "Setting macos_archs as: macos_archs='x86_64'"
Expand Down
7 changes: 6 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,19 @@

cmake_minimum_required(VERSION 3.18.0)

set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15 CACHE STRING "Minimum OS X deployment version.")
set(CMAKE_OSX_DEPLOYMENT_TARGET 14 CACHE STRING "Minimum OS X deployment version.")
Comment thread
agarny marked this conversation as resolved.

set(PROJECT_NAME libCellML)
set(PROJECT_URL https://libcellml.org)
set(_PROJECT_VERSION 0.6.3)
set(PROJECT_DEVELOPER_VERSION)
project(${PROJECT_NAME} VERSION ${_PROJECT_VERSION} LANGUAGES CXX)

# Set the C++ standard to be used for all targets.
set(CMAKE_CXX_STANDARD 20)
Comment thread
agarny marked this conversation as resolved.
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Set policies that affect the build.
set(NEW_POLICIES CMP0056 CMP0063 CMP0074 CMP0078 CMP0086 CMP0092)
foreach(NEW_POLICY ${NEW_POLICIES})
Expand Down
293 changes: 170 additions & 123 deletions src/analyser.cpp

Large diffs are not rendered by default.

16 changes: 9 additions & 7 deletions src/analyser_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ limitations under the License.
#include "libcellml/generatorprofile.h"
#include "libcellml/issue.h"

#include <unordered_set>

#include "analysermodel_p.h"
#include "internaltypes.h"
#include "logger_p.h"
Expand Down Expand Up @@ -96,9 +98,12 @@ struct AnalyserInternalEquation
ComponentPtr mComponent;

AnalyserInternalVariablePtrs mVariables;
std::unordered_set<AnalyserInternalVariable *> mVariablesSet;
AnalyserInternalVariablePtrs mStateVariables;
std::unordered_set<AnalyserInternalVariable *> mStateVariablesSet;
AnalyserInternalVariablePtrs mAllVariables;
AnalyserInternalVariablePtrs mUnknownVariables;
std::unordered_set<AnalyserInternalVariable *> mUnknownVariablesSet;

size_t mNlaSystemIndex = MAX_SIZE_T;
AnalyserInternalEquationWeakPtrs mNlaSiblings;
Expand Down Expand Up @@ -160,12 +165,13 @@ class Analyser::AnalyserImpl: public Logger::LoggerImpl
AnalyserExternalVariablePtrs mExternalVariables;

AnalyserInternalVariablePtrs mInternalVariables;
std::unordered_map<Variable *, AnalyserInternalVariablePtr> mInternalVariableCache;
AnalyserInternalEquationPtrs mInternalEquations;

GeneratorProfilePtr mGeneratorProfile = GeneratorProfile::create();

std::map<std::string, UnitsPtr> mStandardUnits;
std::map<AnalyserEquationAstPtr, UnitsPtr> mCiCnUnits;
std::unordered_map<std::string, UnitsPtr> mStandardUnits;
std::unordered_map<AnalyserEquationAstPtr, UnitsPtr> mCiCnUnits;

AnalyserImpl();

Expand All @@ -181,10 +187,6 @@ class Analyser::AnalyserImpl: public Logger::LoggerImpl
void analyseComponent(const ComponentPtr &component);
void analyseComponentVariables(const ComponentPtr &component);

void equivalentVariables(const VariablePtr &variable,
VariablePtrs &equivalentVariables) const;
VariablePtrs equivalentVariables(const VariablePtr &variable) const;

void analyseEquationAst(const AnalyserEquationAstPtr &ast);

void updateUnitsMapWithStandardUnit(const std::string &unitsName,
Expand Down Expand Up @@ -251,7 +253,7 @@ class Analyser::AnalyserImpl: public Logger::LoggerImpl
static bool isExternalVariable(const AnalyserInternalVariablePtr &variable);

bool isStateRateBased(const AnalyserEquationPtr &analyserEquation,
AnalyserEquationPtrs &checkedEquations);
std::unordered_set<AnalyserEquation *> &checkedEquations);

void addInvalidVariableIssue(const AnalyserInternalVariablePtr &variable,
Issue::ReferenceRule referenceRule);
Expand Down
12 changes: 8 additions & 4 deletions src/analyserequation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ std::vector<AnalyserEquationPtr> AnalyserEquation::dependencies() const
{
std::vector<AnalyserEquationPtr> res;

res.reserve(mPimpl->mDependencies.size());

for (const auto &dependency : mPimpl->mDependencies) {
res.push_back(dependency.lock());
}
Expand Down Expand Up @@ -123,6 +125,8 @@ std::vector<AnalyserEquationPtr> AnalyserEquation::nlaSiblings() const
{
std::vector<AnalyserEquationPtr> res;

res.reserve(mPimpl->mNlaSiblings.size());

for (const auto &nlaSibling : mPimpl->mNlaSiblings) {
res.push_back(nlaSibling.lock());
}
Expand All @@ -149,7 +153,7 @@ size_t AnalyserEquation::stateCount() const
return mPimpl->mStates.size();
}

std::vector<AnalyserVariablePtr> AnalyserEquation::states() const
const std::vector<AnalyserVariablePtr> &AnalyserEquation::states() const
{
return mPimpl->mStates;
}
Expand All @@ -168,7 +172,7 @@ size_t AnalyserEquation::computedConstantCount() const
return mPimpl->mComputedConstants.size();
}

std::vector<AnalyserVariablePtr> AnalyserEquation::computedConstants() const
const std::vector<AnalyserVariablePtr> &AnalyserEquation::computedConstants() const
{
return mPimpl->mComputedConstants;
}
Expand All @@ -187,7 +191,7 @@ size_t AnalyserEquation::algebraicVariableCount() const
return mPimpl->mAlgebraicVariables.size();
}

std::vector<AnalyserVariablePtr> AnalyserEquation::algebraicVariables() const
const std::vector<AnalyserVariablePtr> &AnalyserEquation::algebraicVariables() const
{
return mPimpl->mAlgebraicVariables;
}
Expand All @@ -206,7 +210,7 @@ size_t AnalyserEquation::externalVariableCount() const
return mPimpl->mExternalVariables.size();
}

std::vector<AnalyserVariablePtr> AnalyserEquation::externalVariables() const
const std::vector<AnalyserVariablePtr> &AnalyserEquation::externalVariables() const
{
return mPimpl->mExternalVariables;
}
Expand Down
2 changes: 1 addition & 1 deletion src/analyserequationast.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ void AnalyserEquationAst::setType(Type type)
mPimpl->mType = type;
}

std::string AnalyserEquationAst::value() const
const std::string &AnalyserEquationAst::value() const
{
return mPimpl->mValue;
}
Expand Down
6 changes: 3 additions & 3 deletions src/analyserexternalvariable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ std::vector<VariablePtr>::iterator AnalyserExternalVariable::AnalyserExternalVar
const std::string &componentName,
const std::string &variableName)
{
return std::find_if(mDependencies.begin(), mDependencies.end(), [=](const auto &v) {
return std::find_if(mDependencies.begin(), mDependencies.end(), [&](const auto &v) {
return (owningModel(v) == model)
&& (owningComponent(v)->name() == componentName)
&& (v->name() == variableName);
Expand All @@ -40,7 +40,7 @@ std::vector<VariablePtr>::iterator AnalyserExternalVariable::AnalyserExternalVar

std::vector<VariablePtr>::iterator AnalyserExternalVariable::AnalyserExternalVariableImpl::findDependency(const VariablePtr &variable)
{
return std::find_if(mDependencies.begin(), mDependencies.end(), [=](const auto &v) {
return std::find_if(mDependencies.begin(), mDependencies.end(), [&](const auto &v) {
return v == variable;
});
}
Expand Down Expand Up @@ -155,7 +155,7 @@ VariablePtr AnalyserExternalVariable::dependency(const ModelPtr &model,
nullptr;
}

std::vector<VariablePtr> AnalyserExternalVariable::dependencies() const
const std::vector<VariablePtr> &AnalyserExternalVariable::dependencies() const
{
return mPimpl->mDependencies;
}
Expand Down
39 changes: 27 additions & 12 deletions src/analysermodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ limitations under the License.

namespace libcellml {

static const std::vector<AnalyserEquationPtr> NO_ANALYSER_EQUATION;
static const std::vector<AnalyserVariablePtr> NO_ANALYSER_VARIABLE;

AnalyserModelPtr AnalyserModel::AnalyserModelImpl::create(const ModelPtr &model)
{
return std::shared_ptr<AnalyserModel> {new AnalyserModel(model)};
Expand Down Expand Up @@ -104,10 +107,10 @@ size_t AnalyserModel::stateCount() const
return mPimpl->mStates.size();
}

std::vector<AnalyserVariablePtr> AnalyserModel::states() const
const std::vector<AnalyserVariablePtr> &AnalyserModel::states() const
{
if (!isValid()) {
return {};
return NO_ANALYSER_VARIABLE;
}

return mPimpl->mStates;
Expand All @@ -132,10 +135,10 @@ size_t AnalyserModel::constantCount() const
return mPimpl->mConstants.size();
}

std::vector<AnalyserVariablePtr> AnalyserModel::constants() const
const std::vector<AnalyserVariablePtr> &AnalyserModel::constants() const
{
if (!isValid()) {
return {};
return NO_ANALYSER_VARIABLE;
}

return mPimpl->mConstants;
Expand All @@ -159,10 +162,10 @@ size_t AnalyserModel::computedConstantCount() const
return mPimpl->mComputedConstants.size();
}

std::vector<AnalyserVariablePtr> AnalyserModel::computedConstants() const
const std::vector<AnalyserVariablePtr> &AnalyserModel::computedConstants() const
{
if (!isValid()) {
return {};
return NO_ANALYSER_VARIABLE;
}

return mPimpl->mComputedConstants;
Expand All @@ -186,10 +189,10 @@ size_t AnalyserModel::algebraicVariableCount() const
return mPimpl->mAlgebraicVariables.size();
}

std::vector<AnalyserVariablePtr> AnalyserModel::algebraicVariables() const
const std::vector<AnalyserVariablePtr> &AnalyserModel::algebraicVariables() const
{
if (!isValid()) {
return {};
return NO_ANALYSER_VARIABLE;
}

return mPimpl->mAlgebraicVariables;
Expand All @@ -213,10 +216,10 @@ size_t AnalyserModel::externalVariableCount() const
return mPimpl->mExternalVariables.size();
}

std::vector<AnalyserVariablePtr> AnalyserModel::externalVariables() const
const std::vector<AnalyserVariablePtr> &AnalyserModel::externalVariables() const
{
if (!isValid()) {
return {};
return NO_ANALYSER_VARIABLE;
}

return mPimpl->mExternalVariables;
Expand All @@ -237,8 +240,20 @@ AnalyserVariablePtr AnalyserModel::analyserVariable(const VariablePtr &variable)
return {};
}

// Check the cache first.

auto analyserVariableIt = mPimpl->mAnalyserVariables.find(variable.get());

if (analyserVariableIt != mPimpl->mAnalyserVariables.end()) {
return analyserVariableIt->second;
}

// Not in the cache, so do the equivalence-based search.

for (const auto &analyserVariable : analyserVariables(shared_from_this())) {
if (areEquivalentVariables(variable, analyserVariable->variable())) {
mPimpl->mAnalyserVariables.emplace(variable.get(), analyserVariable);

return analyserVariable;
}
}
Expand All @@ -255,10 +270,10 @@ size_t AnalyserModel::analyserEquationCount() const
return mPimpl->mAnalyserEquations.size();
}

std::vector<AnalyserEquationPtr> AnalyserModel::analyserEquations() const
const std::vector<AnalyserEquationPtr> &AnalyserModel::analyserEquations() const
{
if (!isValid()) {
return {};
return NO_ANALYSER_EQUATION;
}

return mPimpl->mAnalyserEquations;
Expand Down
2 changes: 2 additions & 0 deletions src/analysermodel_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ struct AnalyserModel::AnalyserModelImpl
}
};

mutable std::unordered_map<Variable *, AnalyserVariablePtr> mAnalyserVariables;

struct VariableKeyPairHash
{
size_t operator()(const VariableKeyPair &pair) const
Expand Down
2 changes: 2 additions & 0 deletions src/analyservariable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ std::vector<AnalyserEquationPtr> AnalyserVariable::analyserEquations() const

std::vector<AnalyserEquationPtr> res;

res.reserve(mPimpl->mAnalyserEquations.size());

for (const auto &analyserEquation : mPimpl->mAnalyserEquations) {
res.push_back(analyserEquation.lock());
}
Expand Down
Loading
Loading