If this helps your analysis, consider the following fact (*).
model = Model(HiGHS.Optimizer)
# set_silent(model)
@variable(model, x[1:nr, 1:ng, turni ], Bin)
@variable(model,0<=s[1:nr]<=nr, Int)
@constraints(model, begin
# each day must have exactly one Ti or one Fi
fer1[k in union(t_feriali,t_card_urg), g in g_feriali], sum(x[:,g,k]) == 1
fer2[k in t_festivi, g in g_feriali], sum(x[:,g,k]) == 0
fest1[k in t_festivi, g in g_festivi], sum(x[:,g,k]) == 1
fest2[k in union(t_feriali, t_card_urg), g in g_festivi], sum(x[:,g,k]) == 0
# range of N and NF for row for month
[r in ops_lim], sum(x[r,j,"N"]+x[r,j,"NF"] for j in 1:ng) <= 4
[r in ops_lim], sum(x[r,j,"N"]+x[r,j,"NF"] for j in 1:ng) >= 3
[r in ops_lim], sum(x[r,j,"N"] for j in 1:ng) <= 3
[r in ops_lim], sum(x[r,j,"N"] for j in 1:ng) >= 1
# # NF==2 ==> N<=1
[r in ops_lim], s[r] == sum(x[r,:,"NF"])-2
[r in ops_lim], !s[r] --> {sum(x[r,:,"N"]) <= 1}
...
# many other constraints
end
...
solution_summary(; result = 1, verbose = false)
β solver_name : HiGHS
β Termination
β β termination_status : INFEASIBLE
β β result_count : 1
β β raw_status : kHighsModelStatusInfeasible
β β objective_bound : 0.00000e+00
β Solution (result = 1)
β β primal_status : NO_SOLUTION
β β dual_status : INFEASIBILITY_CERTIFICATE
β β objective_value : 0.00000e+00
β β dual_objective_value : 6.00000e+00
β β relative_gap : Inf
model = Model(HiGHS.Optimizer)
# set_silent(model)
@variable(model, x[1:nr, 1:ng, turni ], Bin)
@variable(model, z[1:nr, 1:ng], Bin)
@constraints(model, begin
# each day must have exactly one Ti or one Fi
fer1[k in union(t_feriali,t_card_urg), g in g_feriali], sum(x[:,g,k]) == 1
fer2[k in t_festivi, g in g_feriali], sum(x[:,g,k]) == 0
fest1[k in t_festivi, g in g_festivi], sum(x[:,g,k]) == 1
fest2[k in union(t_feriali, t_card_urg), g in g_festivi], sum(x[:,g,k]) == 0
# range of N and NF for row for month
[r in ops_lim], sum(x[r,j,"N"]+x[r,j,"NF"] for j in 1:ng) <= 4
[r in ops_lim], sum(x[r,j,"N"]+x[r,j,"NF"] for j in 1:ng) >= 3
[r in ops_lim], sum(x[r,j,"N"] for j in 1:ng) <= 3
[r in ops_lim], sum(x[r,j,"N"] for j in 1:ng) >= 1
# # NF==2 ==> N<=1
[r in ops_lim], sum(x[r,:,"NF"]) == sum(i * z[r, i] for i in 1:ng)
[r in ops_lim], z[r,2] --> {sum(x[r, :, "N"]) <= 1}
[r in ops_lim], sum(z[r,:]) <= 1
...
Solving report
Status Optimal
Primal bound 0
Dual bound 0
Gap 0% (tolerance: 0.01%)
P-D integral 0
Solution status feasible
0 (objective)
0 (bound viol.)
0 (int. viol.)
0 (row viol.)
(*)
I tried to apply one of your suggestions to my case, but Iβm not entirely sure if I did it right
PS
The following form also passes the parser checks and provides results consistent with the intended purpose of the constraint
# # NF==2 ==> N<=1 for r in ops_lim
s[ops_lim] .== sum(x[ops_lim,:,"NF"])-2
[r in ops_lim], !s[r] --> {sum(x[r,:,"N"]) <= 1}
The following form, however, gives an unfeasible result
# NF==2 ==> N<=1 for r in ops_lim
[r in ops_lim], s[r] == sum(x[r,:,"NF"])-2
[r in ops_lim], !s[r] --> {sum(x[r,:,"N"]) <= 1}