diff --git a/go.mod b/go.mod index 4ae99a9..6565a26 100644 --- a/go.mod +++ b/go.mod @@ -6,4 +6,4 @@ toolchain go1.23.9 require gonum.org/v1/gonum v0.16.0 -require github.com/MatProGo-dev/SymbolicMath.go v0.3.1 +require github.com/MatProGo-dev/SymbolicMath.go v0.3.2-0.20251017032605-a7dee10c22bf diff --git a/go.sum b/go.sum index 526c9ae..76f4778 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,4 @@ -github.com/MatProGo-dev/SymbolicMath.go v0.3.1 h1:WM5lVAySD4mQDvq3RABUmJgSGkSYHT0CC+ZJXeTTJRg= -github.com/MatProGo-dev/SymbolicMath.go v0.3.1/go.mod h1:tW8thj4pkaTV9lFNU3OCKmwQ3mZ2Eim6S4JpHRDfRvU= +github.com/MatProGo-dev/SymbolicMath.go v0.3.2-0.20251017032605-a7dee10c22bf h1:fvHlqO39XHb/TfMm979zsnrcvZDSAFU7PW61g1UQCW8= +github.com/MatProGo-dev/SymbolicMath.go v0.3.2-0.20251017032605-a7dee10c22bf/go.mod h1:tW8thj4pkaTV9lFNU3OCKmwQ3mZ2Eim6S4JpHRDfRvU= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= diff --git a/problem/optimization_problem.go b/problem/optimization_problem.go index 89bd6bf..adf89be 100644 --- a/problem/optimization_problem.go +++ b/problem/optimization_problem.go @@ -54,11 +54,12 @@ func (op *OptimizationProblem) AddRealVariable() symbolic.Variable { func (op *OptimizationProblem) AddVariableClassic(lower, upper float64, vtype symbolic.VarType) symbolic.Variable { id := uint64(len(op.Variables)) newVar := symbolic.Variable{ - ID: id, - Lower: lower, - Upper: upper, - Type: vtype, - Name: fmt.Sprintf("x_%v", id), + ID: id, + Lower: lower, + Upper: upper, + Type: vtype, + Name: fmt.Sprintf("x_%v", id), + Environment: op, } op.Variables = append(op.Variables, newVar) return newVar @@ -100,11 +101,12 @@ func (op *OptimizationProblem) AddVariableVectorClassic( vs := make([]symbolic.Variable, num) for i := range vs { vs[i] = symbolic.Variable{ - ID: stID + uint64(i), - Lower: lower, - Upper: upper, - Type: vtype, - Name: fmt.Sprintf("x_%v", stID+uint64(i)), + ID: stID + uint64(i), + Lower: lower, + Upper: upper, + Type: vtype, + Name: fmt.Sprintf("x_%v", stID+uint64(i)), + Environment: op, } } @@ -127,14 +129,7 @@ func (op *OptimizationProblem) AddVariableMatrix( // environment as well as upper and lower bounds. // Create variables - vmOut := symbolic.NewVariableMatrix(rows, cols) - - // Add variables to the problem - for i := 0; i < rows; i++ { - for j := 0; j < cols; j++ { - op.Variables = append(op.Variables, vmOut[i][j]) - } - } + vmOut := symbolic.NewVariableMatrix(rows, cols, op) return vmOut } @@ -235,10 +230,12 @@ func From(inputModel optim.Model) (*OptimizationProblem, error) { // problem object. for ii, variable := range inputModel.Variables { newOptimProblem.Variables = append(newOptimProblem.Variables, symbolic.Variable{ - ID: uint64(ii), - Lower: variable.Lower, - Upper: variable.Upper, - Type: symbolic.VarType(variable.Vtype), + ID: uint64(ii), + Lower: variable.Lower, + Upper: variable.Upper, + Type: symbolic.VarType(variable.Vtype), + Name: fmt.Sprintf("x_%v", ii), + Environment: newOptimProblem, }) } @@ -1042,3 +1039,45 @@ func (op *OptimizationProblem) String() string { return objString + constraintsString } + +/* +GetName +Description: + + Returns the name of the optimization problem. + (Necessary for implementing the symbolic.Environment interface). +*/ +func (op *OptimizationProblem) GetName() string { + return op.Name +} + +/* +TrackVariable +Description: + + Adds the given variable to the optimization problem if it is not already present. + Returns true if the variable was added, false if it was already present. +*/ +func (op *OptimizationProblem) TrackVariable(v symbolic.Variable) bool { + // Check if the variable is already present + for _, variable := range op.Variables { + if variable.ID == v.ID { + return false + } + } + + // Add the variable to the problem + op.Variables = append(op.Variables, v) + return true +} + +/* +AllTrackedVariables +Description: + + Returns a slice of all variables that are tracked by the optimization problem. + (Necessary for implementing the symbolic.Environment interface). +*/ +func (op *OptimizationProblem) AllTrackedVariables() []symbolic.Variable { + return op.Variables +}