How to validate multiple rule inputs in DMN camunda - decision-model-notation

Assume that I have two inputs (input1, input2), I can define DMN rule condition as follows:
input1 > 10 or input2 <= 10.
However, I would like to define a condition with multiple inputs:
input1 + input2 > 10
How can I do this using DMN?

Solution found as follows:
<inputEntry id="id" expressionLanguage="juel"> <text>(input1 + input2) > 1.0</text>
</inputEntry>

Related

How to replace values to binary(0-1) in Pandas for Network data?

I have 75 columns, and 300k captured network traffic CSV file.
I am playing with data to apply ML. I need to convert IP addresses to 1 and 0 according to internal and external.
So if it is
10.0.2.* > 0
others > 1
Is there an easy way to do this?
I was doing the manually replace method.
df['SrcAddr'] = df['SrcAddr'].replace(['10.0.2.15','10.0.2.2'],[0,0,0])
IIUC, you can use:
df['SrcAddr'] = df['SrcAddr'].str.startswith('10.0.2.').rsub(1)
or with a regex:
df['SrcAddr'] = df['SrcAddr'].str.fullmatch('10\.0\.2\.').rsub(1)
How it works: for each match this returns True, using rsub(1) we compute 1-True -> 0 and for each non-match 1-False -> 1
Alternative with np.where for using any value:
df['SrcAddr'] = np.where(df['SrcAddr'].str.startswith('10.0.2.'), 0, 1)
example (as new column):
SrcAddr SrcAddr2
0 10.0.2.42 0
1 8.8.8.8 1

Problem with decision variabile when there are more choices

I have a series of jobs. For each job I have a series of operations and each operation requires a machine. But there are some operations that have the ability to choose multiple machines.
Ex:
job 1: operation 1 machine 4
operation 2 machine 2
operation 3 (machine 2 or machine 3)
I have a binary decision variable Y (ijm) where i is the operation, j the job and m the machine.
What must happen is that Y(114) = 1, Y (212) = 1 but for operation 3 we have two choices Y(312) = 0 and Y(313) = 1 or the opposite.
How can I implement it on Cplex? I can't find a way.
You could use a logical constraint like this in OPL:
((x==2) && (y==1)) || ((x==1) && (y==2));
But you could also have a look at CPOptimizer within CPLEX because your model looks like a scheduling problem.
A simple way to model your requirement that Y(312) = 0 and Y(313) = 1 or the opposite would be to add a constraint that the sum of the alternatives must be 1, i.e. in your case add a constraint:
Y(312) + Y(313) = 1
Then if the variables are binary or integer then this will achieve your aim.

chain/dependency of some rules by wildcards

I have a particular use case for which I have not found the solution in the Snakemake documentation.
Let's say in a given pipeline I have a portion with 3 rules a, b and c which will run for N samples.
Those rules handle large amount of data and for reasons of local storage limits I do not want those rules to execute at the same time. For instance rule a produces the large amount of data then rule c compresses and export the results.
So what I am looking for is a way to chain those 3 rules for 1 sample/wildcard, and only then execute those 3 rules for the next sample. All of this to make sure the local space is available.
Thanks
I agree that this is problem that Snakemake still has no solution for. However you may have a workaround.
rule all:
input: expand("a{sample}", sample=[1, 2, 3])
rule a:
input: "b{sample}"
output: "a{sample}"
rule b:
input: "c{sample}"
output: "b{sample}"
rule c:
input:
lambda wildcards: f"a{wildcards.sample-1}"
output: "c{sample}"
That means that the rule c for sample 2 wouldn't start before the output for rule a for sample 1 is ready. You need to add a pseudo output a0 though or make the lambda more complicated.
So building on Dmitry Kuzminov's answer, the following can work (both with numbers as samples and strings).
The execution order will be a3 > b3 > a1 > b1 > a2 > b2.
I used a different sample order to show it can be made different from the sample list.
samples = [1, 2, 3]
sample_order = [3, 1, 2]
def get_previous(wildcards):
if wildcards.sample != sample_order[0]: # if different from a3 in this case
previous_sample = sample_order[sample_order.index(wildcards.sample) - 1]
return f'b_out_{previous_sample}'
else: # if is the first sample in the order i.e. a3
return #here put dummy file always present e.g. the file containing those rules or the Snakemake
rule all:
expand("b_out_{S}", S=sample)
rule a:
input:
"a_in_{sample}",
get_previous
output:
"a_out_{sample}"
rule b:
input:
"a_out_{sample}"
output:
"b_out_{sample}"

in snakemake, for two inputs, expand pairwise combination of a vector

I am new to Snakemake and have a problem in Snakemake expand function.
First, I need to have a group of combinations and use them as base to expand another vector upon them with pair-wise elements combinations of it.
Lets say the set for the pairwise combination is
setC=["A","B","C","D"]
I get the partial group as follows:
part_group1 = expand("TEMPDIR/{setA}_{setB}_", setA = config["setA"], setB = config["setB"]
Then, (if that is OK), I used this partial group, to expand another set with its pairwise combinations. But I am not sure how to expand pairwise combinations of setC as seen below. It is obviously not correct; just written to clarify the question. Also, how to input the name of the expanded estimator from shell?
rule get_performance:
input:
xdata1 = TEMPDIR + part_group1 +"{setC}.rda"
xdata2 = TEMPDIR + part_group1 +"{setC}.rda"
estimator1= {estimator}
output:
results = TEMPDIR + "result_" + part_group1 +{estimator}_{setC}_{setC}.txt"
params:
Rfile = FunctionDIR + "function.{estimator}.R"
shell:
"Rscript {params.Rfile} {input.xdata1} {input.xdata12} {input.estimator1} "
"{output.results}"
The expand function will return a list of the product of the variables used. For example, if
setA=["A","B"]
setB=["C","D"]
then
expand("TEMPDIR/{setA}_{setB}_", setA = config["setA"], setB = config["setB"]
will give you:
["TEMPDIR/A_C_","TEMPDIR/A_D_","TEMPDIR/B_C_","TEMPDIR/B_D_"]
Your question is not very clear on what you want to achieve but I'll have a guess.
If you want to make pairwise combinations of setC:
import itertools
combiC=list(itertools.combinations(setC, 2))
combiList=list()
for c in combiC:
combiList.append(c[0]+"_"+c[1])
the you (probably) want the files:
rule all:
input: expand(TEMPDIR + "/result_{A}_{B}_estim{estimator}_combi{C}.txt",A=setA, B=setB, estimator=estimators, C=combiList)
I'm putting some words like "estim" and "combi" not to confuse the wildcards here. I do not know what the list or set "estimators" is supposed to be but I suppose you have declared it above.
Then your rule get_performance:
rule get_performance:
input:
xdata1 = TEMPDIR + "/{A}_{B}_{firstC}.rda",
xdata2 = TEMPDIR + "/{A}_{B}_{secondC}.rda"
output:
TEMPDIR + "/result_{A}_{B}_estim{estimator}_combi{firstC}_{secondC}.txt"
params:
Rfile = FunctionDIR + "/function.{estimator}.R"
shell:
"Rscript {params.Rfile} {input.xdata1} {input.xdata2} {input.estimator} {output.results}"
Again, this is a guess since you haven't defined all the necessary items.

What does + operator do in this line?

I am trying to modify a method in an existing module to adapt functionality.
What does + operator do in this line?
for line in payment.move_line_ids + expense_sheet.account_move_id.line_ids:
Hello M.E.,
Solution
operator of use is concatenation/combine of two List/String/Tupple.
Example
Plus(+) Operator use with two List
a = [1,2,3]
b = [4,5]
print a + b
output = [1,2,3,4,5]
+ operator use with two String
a = "Vora"
b = " mayur"
print a + b
output = "vora mayur"
+ operator use with two tupple
a = (1,2,3)
b = (4,5)
print a + b
output = (1,2,3,4,5)
It concatenates account.move.line records from payment.move_line_ids and expense_sheet.account_move_id.line_ids into a single recordset, which is then iterated over. Please note that the result of the __add__ (+) operation might contain duplicates if the same account.move.line is present in both operands. If you want to avoid duplicates, use the | (OR) operator.