Skip to content

Next/patch - #171

Merged
PStange merged 3 commits into
mainfrom
next/patch
Mar 7, 2025
Merged

Next/patch#171
PStange merged 3 commits into
mainfrom
next/patch

Conversation

@FBumann

Copy link
Copy Markdown
Member

No description provided.

@FBumann
FBumann requested a review from PStangeMarch 5, 2025 20:15
@FBumann

Copy link
Copy Markdown
MemberAuthor

@PStange Hier ist der Bugfix von fixed relative profile.
Wäre gut wenn du nochmal drüber schaust.
Liebe Grüße

@PStangePStange left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bug fixed

@PStange
PStange merged commit fab9368 into mainMar 7, 2025
@PStange

Copy link
Copy Markdown
Collaborator

Das Problem scheint wieder aufzutreten. Ich habe in einem Beispiel verschiedene Lastgänge gegeben, aus welchen er einen auswählen soll. fixed_size=1 im Kombination mit fixed_relative_profile führt trotz optional=True nur zu der zulässigen Lösung, dass alle Lastgänge gewählt werden.

Beispiel:

for k in zeitreihen:

Lastgang.append(fx.Sink(label = k ,
sink=fx.Flow('Q_th', bus=Waerme, size=fx.InvestParameters(fix_effects={Gesamtkosten: 1, Sanierung:1},
specific_effects=0,
fixed_size=1,
optional=True),
fixed_relative_profile=zeitreihen[k],
)))

@FBumann

Copy link
Copy Markdown
MemberAuthor

Kannst du ein minimalbeispiel erstellen?

@FBumann

Copy link
Copy Markdown
MemberAuthor

Schau mal in #248
In 2.2.0 müsste es auch schon laufen.
Aber ich teste gern in allen Versionen wenn du mir ein lauffähiges minimalbeispiel gibst

@PStange

Copy link
Copy Markdown
Collaborator

Ich dächte auch, dass Du das schonmal gefixt hattest. Ich stelle noch ein Beispiel zusammen.

@FBumann

FBumann commented Jun 14, 2025

Copy link
Copy Markdown
MemberAuthor

Das läuft bei mir mit beiden optionen

flixopt == 2.1.1

importnumpyasnpimportpandasaspdimportxarrayasxrimportflixoptasfxdeftest_cases(case: int):
timesteps=pd.date_range('2020-01-01', periods=10, freq='h', name='time')
flow_system=fx.FlowSystem(timesteps)
profile=np.sin(np.linspace(0, 2*np.pi, len(timesteps))) *0.5+0.5flow_system.add_elements(
fx.Effect('Costs', '€', 'Kosten', is_standard=True, is_objective=True),
fx.Bus('Fernwärme'),
fx.Sink(
'Sink',
sink=fx.Flow(
'Wärme',
bus='Fernwärme',
size=fx.InvestParameters(fixed_size=1, optional=True),
fixed_relative_profile=xr.DataArray(profile, coords=(timesteps,)),
)
)
)
calculation=fx.FullCalculation('GenericName', flow_system)
calculation.do_modeling()
calculation.model.add_constraints(calculation.model.variables['Sink(Wärme)|size'] ==case)
calculation.solve(fx.solvers.HighsSolver(0, 20))
print(f'{calculation.results.solution['Sink(Wärme)|size'].item()=}')
returncalculationif__name__=='__main__':
test_cases(1)
test_cases(0)

@PStange

Copy link
Copy Markdown
Collaborator

Bin noch nicht dazu gekommen, ein abgespecktes Beispiel zu bauen. Dieses hier bringt bei mir zunächst erstmal Fehlermeldungen: typing_extensions fehlt als moduleund danach xarray has no attribute DataTree. Ich teste das in einer virtuellen environment in Pycharm mit der aktuellen flixopt Version 2.1.2 (installiert per pip). Was funktionieren soll, ist, dass er die sink nicht nutzt. Dazu gibts ja keinen Grund in Deinem Beispiel (verursacht keine Kosten) und die ist bestimmt im Ergebnis dabei, oder?

@PStange

PStange commented Jun 16, 2025

Copy link
Copy Markdown
Collaborator

Hier ist ein Beispiel (relativ kompakt). Aufgrund desEffects Sanierung, darf nur eine sink ausgewählt werden. Das führt zu einem Fehler. Grund dafür ist, dass fixed_size ungleich Null und fixed_relative_profile meiner Meinung nach das Investment erzwingen, auch wenn optional=True. Setzt man die obere Grenze im Sanierungseffekt auf >2 läuft es (da dann beide sinks genutzt werden dürfen).

importflixOptasfxdatetime_series=fx.create_datetime_array('2023-01-01', 2, freq='h')
Waerme=fx.Bus('Waerme')
Gesamtkosten=fx.Effect('costs', '€', 'Kosten', is_standard=True, is_objective=True)
Sanierung=fx.Effect('Sanierungsvariante', '-', 'Wahl_der_Sanierung', minimum_invest=0.9, maximum_invest=2.1)
Sanierung1=fx.Sink('San1',
sink=fx.Flow('Q_th',
bus=Waerme,
size=fx.InvestParameters(fix_effects={Gesamtkosten: 200, Sanierung:1},
fixed_size=1,
optional=True),
fixed_relative_profile=[1, 1],
)
)
Sanierung2=fx.Sink('San2',
sink=fx.Flow('Q_th',
bus=Waerme,
size=fx.InvestParameters(fix_effects={Gesamtkosten: 300, Sanierung:1},
fixed_size=1,
optional=True),
fixed_relative_profile=[2, 2],
)
)
Waermebezug=fx.Source('Waer',
source=fx.Flow('Q_th',
bus=Waerme,
size=100,
effects_per_flow_hour=0.15))
flow_system=fx.FlowSystem(datetime_series)
flow_system.add_effects(Gesamtkosten,Sanierung)
flow_system.add_components(Sanierung1,Sanierung2,Waermebezug)
calculation=fx.FullCalculation('fullModel', flow_system, 'pyomo')
calculation.do_modeling()
calculation.solve(fx.solvers.HighsSolver(time_limit_seconds=3600,mip_gap=0.05))
results=fx.results.CalculationResults(calculation.name, folder='results')

@FBumann

FBumann commented Jun 16, 2025

Copy link
Copy Markdown
MemberAuthor

Hallo @PStange,

Irgendwas ist mit deiner installation falsch.
Ich vermute du hast jetzt das neue flixopt parallel zu v1.x.y
Das neue nutzt man mit

importflixopt

Das alte mit

importflixOpt

(großes O)

Auch

fx.create_datetime_array() 

und

add_effects()

gibt es nicht mehr.

Schick mal was bei pip freeze zurückkommt

@PStange

Copy link
Copy Markdown
Collaborator

dieses blöde "O" -> jetzt habe ich erstmal ganz andere Probleme

@PStange

Copy link
Copy Markdown
Collaborator

Ich bekomme mein Mini-Beispiel gerade nicht zum Laufen mit flixopt 2.1.1, aber wenn ich in deinem Test fix_effects in der Senke einfüge, müsste er diese doch eigentlich nicht nutzen, oder?

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@FBumann@PStange