Skip to content

Next/patch#171

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

Next/patch#171
PStange merged 3 commits intomainfrom
next/patch

Conversation

@FBumann
Copy link
Member

@FBumann FBumann commented Mar 5, 2025

No description provided.

@FBumann FBumann requested a review from PStange March 5, 2025 20:15
@FBumann
Copy link
Member Author

FBumann commented Mar 6, 2025

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

Copy link
Collaborator

@PStange PStange left a comment

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 main Mar 7, 2025
8 checks passed
@PStange
Copy link
Collaborator

PStange commented Jun 12, 2025

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
Member Author

FBumann commented Jun 12, 2025

Kannst du ein minimalbeispiel erstellen?

@FBumann
Copy link
Member Author

FBumann commented Jun 12, 2025

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
Collaborator

PStange commented Jun 13, 2025

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

@FBumann
Copy link
Member Author

FBumann commented Jun 14, 2025

Das läuft bei mir mit beiden optionen

flixopt == 2.1.1

import numpy as np
import pandas as pd
import xarray as xr
import flixopt as fx

def test_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.5
    flow_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()=}')

    return calculation

if __name__ == '__main__':
    test_cases(1)
    test_cases(0)

@PStange
Copy link
Collaborator

PStange commented Jun 16, 2025

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
Copy link
Collaborator

PStange commented Jun 16, 2025

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).

import flixOpt as fx
datetime_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
Copy link
Member Author

FBumann commented Jun 16, 2025

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

import flixopt

Das alte mit

import flixOpt

(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
Collaborator

PStange commented Jun 17, 2025

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

@PStange
Copy link
Collaborator

PStange commented Jun 17, 2025

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 free to 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