diff --git a/invokeai/app/invocations/math.py b/invokeai/app/invocations/math.py index 0bc8b7b950..e3da88e4bf 100644 --- a/invokeai/app/invocations/math.py +++ b/invokeai/app/invocations/math.py @@ -1,21 +1,32 @@ # Copyright (c) 2023 Kyle Schouviller (https://github.com/kyle0654) import numpy as np +from typing import Literal -from invokeai.app.invocations.primitives import IntegerOutput +from invokeai.app.invocations.primitives import IntegerOutput, FloatOutput from .baseinvocation import BaseInvocation, FieldDescriptions, InputField, InvocationContext, invocation @invocation("add", title="Add Integers", tags=["math", "add"], category="math", version="1.0.0") class AddInvocation(BaseInvocation): - """Adds two numbers""" + """Adds two integer numbers""" a: int = InputField(default=0, description=FieldDescriptions.num_1) b: int = InputField(default=0, description=FieldDescriptions.num_2) def invoke(self, context: InvocationContext) -> IntegerOutput: return IntegerOutput(value=self.a + self.b) + +@invocation("add_float", title="Add Floats", tags=["math", "add", "float"], category="math", version="1.0.0") +class AddFloatInvocation(BaseInvocation): + """Adds two float numbers""" + + a: float = InputField(default=0, description=FieldDescriptions.num_1) + b: float = InputField(default=0, description=FieldDescriptions.num_2) + + def invoke(self, context: InvocationContext) -> FloatOutput: + return FloatOutput(value=self.a + self.b) @invocation("sub", title="Subtract Integers", tags=["math", "subtract"], category="math", version="1.0.0") @@ -27,6 +38,16 @@ class SubtractInvocation(BaseInvocation): def invoke(self, context: InvocationContext) -> IntegerOutput: return IntegerOutput(value=self.a - self.b) + +@invocation("sub_float", title="Subtract Floats", tags=["math", "subtract", "float"], category="math", version="1.0.0") +class SubtractFloatInvocation(BaseInvocation): + """Subtracts two float numbers""" + + a: float = InputField(default=0, description=FieldDescriptions.num_1) + b: float = InputField(default=0, description=FieldDescriptions.num_2) + + def invoke(self, context: InvocationContext) -> FloatOutput: + return FloatOutput(value=self.a - self.b) @invocation("mul", title="Multiply Integers", tags=["math", "multiply"], category="math", version="1.0.0") @@ -39,6 +60,16 @@ class MultiplyInvocation(BaseInvocation): def invoke(self, context: InvocationContext) -> IntegerOutput: return IntegerOutput(value=self.a * self.b) +@invocation("mul_float", title="Multiply Floats", tags=["math", "multiply", "float"], category="math", version="1.0.0") +class MultiplyFloatInvocation(BaseInvocation): + """Multiplies two float numbers""" + + a: float = InputField(default=0, description=FieldDescriptions.num_1) + b: float = InputField(default=0, description=FieldDescriptions.num_2) + + def invoke(self, context: InvocationContext) -> FloatOutput: + return FloatOutput(value=self.a * self.b) + @invocation("div", title="Divide Integers", tags=["math", "divide"], category="math", version="1.0.0") class DivideInvocation(BaseInvocation): @@ -50,6 +81,16 @@ class DivideInvocation(BaseInvocation): def invoke(self, context: InvocationContext) -> IntegerOutput: return IntegerOutput(value=int(self.a / self.b)) +@invocation("div_float", title="Divide Floats", tags=["math", "divide", "float"], category="math", version="1.0.0") +class DivideFloatInvocation(BaseInvocation): + """Divides two float numbers""" + + a: float = InputField(default=0, description=FieldDescriptions.num_1) + b: float = InputField(default=0, description=FieldDescriptions.num_2) + + def invoke(self, context: InvocationContext) -> FloatOutput: + return FloatOutput(value=self.a / self.b) + @invocation("rand_int", title="Random Integer", tags=["math", "random"], category="math", version="1.0.0") class RandomIntInvocation(BaseInvocation): @@ -60,3 +101,49 @@ class RandomIntInvocation(BaseInvocation): def invoke(self, context: InvocationContext) -> IntegerOutput: return IntegerOutput(value=np.random.randint(self.low, self.high)) + + +@invocation("float_to_int", title="Float to Integer", tags=["math", "convert"], category="math", version="1.0.0") +class FloatToIntInvocation(BaseInvocation): + """Converts a float to an integer.""" + + value: float = InputField(default=0, description="The float value") + method: Literal["Floor", "Ceiling"] = InputField(default="round", description="The method to use for conversion") + + def invoke(self, context: InvocationContext) -> IntegerOutput: + if self.method == "Floor": + return IntegerOutput(value=np.floor(self.value)) + else: + return IntegerOutput(value=np.ceil(self.value)) + + +@invocation("round", title="Round Float", tags=["math", "round"], category="math", version="1.0.0") +class RoundInvocation(BaseInvocation): + """Rounds a float to a specified number of decimal places.""" + + value: float = InputField(default=0, description="The float value") + decimals: int = InputField(default=0, description="The number of decimal places") + + def invoke(self, context: InvocationContext) -> FloatOutput: + return FloatOutput(value=round(self.value, self.decimals)) + + +@invocation("abs", title="Absolute Value", tags=["math", "abs"], category="math", version="1.0.0") +class AbsoluteValueInvocation(BaseInvocation): + """Returns the absolute value of a number.""" + + value: float = InputField(default=0, description="The float value") + + def invoke(self, context: InvocationContext) -> FloatOutput: + return FloatOutput(value=abs(self.value)) + + +@invocation("mod", title="Modulus", tags=["math", "modulus"], category="math", version="1.0.0") +class ModulusInvocation(BaseInvocation): + """Returns the modulus of two numbers.""" + + a: int = InputField(default=0, description=FieldDescriptions.num_1) + b: int = InputField(default=0, description=FieldDescriptions.num_2) + + def invoke(self, context: InvocationContext) -> IntegerOutput: + return IntegerOutput(value=self.a % self.b) \ No newline at end of file