eshangj/stackoverflow_q_and_a_sample huggingface dataset:
Question: My input is df :  COLUMN_1 COLUMN_2 COLUMN_3 COLUMN_4 0 0 1 0 2 1 1 1 2 3 2 1 2 3 2 3 1 2 4 5 4 4 5 8 8  And I wish I can hide (horizontally, from left to the non inclusive right) monotonic sequences with a difference equal to 1. For example if in a row we have [4, 5, 8, 8] (like in the last one), the concerned sequence is [4, 5). So, we need to hide the number 4 with an emty string. My expected output is this :  COLUMN_1 COLUMN_2 COLUMN_3 COLUMN_4 0 1 0 2 1 1 3 2 3 2 3 2 5 4 5 8 8  Explanation :  I tried with the code below but I'm not in the right track since I get a weird boolean dataframe. df.diff(axis=1).eq(1).iloc[:, ::-1].cummax(axis=1).replace(True, '').iloc[:, ::-1] 

Answer: You need to use a negative period in diff, combined with mask: out = df.mask(df.diff(-1, axis=1).eq(-1), '')  or, for in place modification: df[df.eq(df.shift(-1, axis=1)-1)] = ''  Variant with shift: out = df.mask(df.eq(df.shift(-1, axis=1)-1), '')  Output:  COLUMN_1 COLUMN_2 COLUMN_3 COLUMN_4 0 1 0 2 1 1 3 2 3 2 3 2 5 4 5 8 8  Intermediates: # df.diff(-1, axis=1) COLUMN_1 COLUMN_2 COLUMN_3 COLUMN_4 0 -1 1 -2 NaN 1 0 -1 -1 NaN 2 -1 -1 1 NaN 3 -1 -2 -1 NaN 4 -1 -3 0 NaN # df.shift(-1, axis=1) COLUMN_1 COLUMN_2 COLUMN_3 COLUMN_4 0 1 0 2 NaN 1 1 2 3 NaN 2 2 3 2 NaN 3 2 4 5 NaN 4 5 8 8 NaN
Question: I want to run a docker login from python3 without asking for user input. I have three global variables REGISTRY_URL, USERNAME, PASSWORD. I want to run: os.system(f"echo '{PASSWORD}' | docker login {REGISTRY_URL} -u {USERNAME} --password-stdin")  The problem is that my three global variables are user controllable which can lead to Remote Code Execution. How can I run this command securely with subprocess.run ? (NB: I do not want to use -p option of docker because it is not secure as per docker recommandation)

Answer: You can supply the password using the input argument to subprocess.run: import subprocess def docker_login(registry_url, username, password): command = ["docker", "login", registry_url, "-u", username, "--password-stdin"] completed_process = subprocess.run(command, input=password.encode() + b'\n', capture_output=True) if completed_process.returncode == 0: print("Docker login successful!") else: print("Docker login failed. Error message:") print(completed_process.stderr.decode()) docker_login(REGISTRY_URL, USERNAME, PASSWORD)
Question: I have some trouble writing a snakemake rule to change the name of my samples. After demultiplexing with Porechop and some basic trimming with Filtlong, I would like to change the names of my samples from e.g. BC01_trimmed.fastq.gz to E_coli_trimmed.fastq.gz. The idea is that in my config file there is a dictionary where each sample is linked to the used barcode. Based on this previously asked question, I wrote this piece of example code. mydictionary = { 'BC01': 'bacteria_A', 'BC02': 'bacteria_B' } rule all: input: expand('{bacteria}_trimmed.fastq.gz', bacteria=mydictionary.values()) rule changeName: input: '{barcode}_trimmed.fastq.gz' params: value=lambda wcs: mydictionary[wcs.bacteria] output: '{params.value}_trimmed.fastq.gz' shell: "mv {input} {output}"  But I receive the error: WildcardError in rule changeName in file Snakefile: Wildcards in input files cannot be determined from output files: 'barcode'  Thanks in advance

Answer: Let's try again... I would reverse the dictionary since in your input function you want to retrieve the barcode given a sample name. (You can reverse key-values using python code, of course). To resolve the cyclic dependency or similar errors, I think you need to either constraint the wildcard values to the ones you have in your dictionary, i.e. you need to effectively disable the regex matching, or you can output the renamed files to a different directory. (I really like snakemake, but I find this behaviour quite confusing). I use the wildcard_constraints pattern as below quite liberally for any wildcard to avoid this issue. So: mydictionary = { 'bacteria_A': 'BC01', 'bacteria_B': 'BC02' } wildcard_constraints: bacteria='|'.join([re.escape(x) for x in mydictionary.keys()]), rule all: input: expand('{bacteria}_trimmed.fastq.gz', bacteria=mydictionary.keys()) rule changeName: input: lambda wcs: '%s_trimmed.fastq.gz' % mydictionary[wcs.bacteria], output: '{bacteria}_trimmed.fastq.gz' shell: "mv {input} {output}"
Question: I tried using ipython to create a class method with the class method decorator. When I press enter I get the following error:  I tried using the same decorator in a normal python script and it worked. Why can't I do the same in Ipython?

Answer: Upgrade your ipython package to the latest version, e.g. $ python3 -m pip install -U ipython  It works fine for ipython==8.1.0 (released Feb 25, 2022) or later: $ ipython Python 3.11.4 (main, Jun 20 2023, 16:52:35) [Clang 13.0.0 (clang-1300.0.29.30)] Type 'copyright', 'credits' or 'license' for more information IPython 8.1.0 -- An enhanced Interactive Python. Type '?' for help. In [1]: class Test: ...: @classmethod ...: def test(): ...: pass ...: In [2]:  I could reproduce the issue for the previous version of ipython, 8.0.1: $ ipython Python 3.11.4 (main, Jun 20 2023, 16:52:35) [Clang 13.0.0 (clang-1300.0.29.30)] Type 'copyright', 'credits' or 'license' for more information IPython 8.0.1 -- An enhanced Interactive Python. Type '?' for help. In [1]: class Test: ...: @classmethod Input In [1] @classmethod ^ SyntaxError: incomplete input
Question: scipy.optimize.minimize function with method="BFGS" (based on this) doesn't seem to use parallelization when computing the cost function or numerical gradient. However, when I run an optimization on a Macbook Air 8 core Apple M1 (see below for minimal reproducible example), using top command I get 750% to 790% CPU usage, suggesting all 8 cores are used. This isn't always the case. On a supercomputer where each node has 40 cores I got 100% to 200% CPU usage, suggesting only 2 cores are used.  Does scipy.optimize.minimize use parallelization when computing the cost function/numerical gradient? If so, how do I get scipy.optimize.minimize to use all cores?   # basic optimization of the variational functional for a random symmetric matrix import numpy as np from numpy.random import uniform from scipy.optimize import minimize # generate random symmetric matrix to compute minimal eigenvalue of N = 1000 H = uniform(-1, 1, [N,N]) H = H + H.T # variational cost function def cost(x): return (x @ H @ x) / (x @ x) x0 = uniform(-0.1, 0.1, N) # minimize variational function with BFGS minimize(cost, x0, method='BFGS') 

Answer: No, but the function being evaluated can use parallelization. You might think that you're not using parallelization in this program. And you're not - at least not explicitly. However, many NumPy operations call out to your platform's BLAS library. Matrix multiplication is one of the operations that can be parallelized by BLAS. Some profiling shows that this program spends roughly 80% of its time doing matrix multiplies inside of the cost() function. You can check this possibility using the library threadpoolctl. Example: from threadpoolctl import ThreadpoolController controller = ThreadpoolController() for i in range(1, 5): t0 = time.time() with controller.limit(limits=i, user_api='blas'): print(minimize(cost, x0, method='BFGS')) t = time.time() print(f"Threads {i}, Duration: {t - t0:.3f}")  By using htop, I confirmed that restricting BLAS parallelism also restricts the number of cores this program uses. Under the tests I did, this is not parallelizing particularly well. This suggests that most of the extra CPU usage is being wasted. Threads 1, Duration: 4.561 Threads 2, Duration: 3.631 Threads 3, Duration: 3.462 Threads 4, Duration: 4.019  (Results are only a rough guide, and will depend on your particular CPU and BLAS library. Benchmark this on your own hardware.) Note: Although 80% of the time is spent inside your cost function, SciPy also seems to be using some BLAS parallelism, as moving the with controller.limit(limits=i, user_api='blas'): line inside the cost function resulted in some amount of parallelism. Most likely, this is from inverting the Hessian, which is the most expensive step of BFGS, ignoring computing the cost function itself. Note: One of the reasons this is so slow is that no Jacobian is provided for this function. If no Jacobian is provided, it must be estimated numerically by calling the function cost() once for every dimension in the problem. In this case, it requires an extra thousand calls for each step.
Question: I have a dataframe with a column containing a set of durations, like 5m, 15m, etc... df = pl.DataFrame({ "duration_m": [5, 15, 30] }) df = df.with_columns( duration = pl.duration( minutes = pl.col("duration_m")) ) df shape: (3, 2) ┌────────────┬──────────────┐ │ duration_m ┆ duration │ │ --- ┆ --- │ │ i64 ┆ duration[ns] │ ╞════════════╪══════════════╡ │ 5 ┆ 5m │ │ 15 ┆ 15m │ │ 30 ┆ 30m │ └────────────┴──────────────┘  I want to filter this dataframe to return only rows that are 5m or 15m using is_in(). However, when I do this: my_durations = [pl.duration(minutes=5), pl.duration(minutes=15)] df.filter(pl.col("duration").is_in(my_durations))  I get:  InvalidOperationError: 'is_in' cannot check for Object("object", Some(object-registry)) values in Duration(Microseconds) data  This has no error (but is obviously not what I want to do): df.filter(pl.col("duration").is_in(pl.duration(minutes=5)))  Thanks

Answer: I'm not sure why, even though pl.duration is an Expr and .is_in accepts expressions that it errors out. My best guess is that it sees a python list first so it assumes away getting an expression. From there it doesn't get a python type that it knows what to do with and just sees an object. Causes aside, you have two ways to get around this. The first: If you wrap your list in a pl.concat_list then you still have an expression instead of a python list but that won't be enough because it doesn't broadcast that to the whole df so you'll get an error about size mismatch which you can also fix by wrapping that in pl.repeat like this: df.filter(pl.col('duration') .is_in(pl.repeat(pl.concat_list(my_durations), pl.count())) ) shape: (2, 2) ┌────────────┬──────────────┐ │ duration_m ┆ duration │ │ --- ┆ --- │ │ i64 ┆ duration[ns] │ ╞════════════╪══════════════╡ │ 5 ┆ 5m │ │ 15 ┆ 15m │ └────────────┴──────────────┘  That's awfully clunky, better to just use the second method. The second: Just use timedelta instead of duration when you're not setting it with the values in a df like this: from datetime import timedelta my_durations = [timedelta(minutes=5), timedelta(minutes=15)] df.filter(pl.col("duration").is_in(my_durations))  As an aside... if you start with my_durations = [pl.duration(minutes=5), pl.duration(minutes=15)]  then you can get the same timedelta list by doing: [pl.select(x).item() for x in my_durations]
Question: could someone please explain to me how to get an element from shadow DOM in Selenium4 in Python? I want to element.click() to Accept the cookies - but I fail at the very first step! I've tried driver.find_element(By.CSS_SELECTOR, '#shadow_host') ... driver.find_element(By.CSS_SELECTOR, '#shadow_root') Every time "no such element: Unable to locate element". Bye Michael 

Answer: To get element's shadow-root, you should first get it's host and then get property shadowRoot. In your case, host tag is cmm-cookie-banner. So, you get this element and then execute JS script on it. def get_shadow_root(element): return driver.execute_script('return arguments[0].shadowRoot', element) shadow_host = driver.find_element(By.TAG_NAME, 'cmm-cookie-banner') button = get_shadow_root(shadow_host).find_element(By.CSS_SELECTOR, '[data-test=handle-accept-all-button]')
Question: I am using numba 0.57.1 and I would like to exploit the native CPU popcount in my code. My existing code is too slow as I need to run it hundreds of millions of times. Here is a MWE: import numba as nb @nb.njit(nb.uint64(nb.uint64)) def popcount(x): b=0 while(x > 0): x &= x - nb.uint64(1) b+=1 return b print(popcount(43))  The current speed is: %timeit popcount(255) 148 ns ± 0.369 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)  I believe that it should be possible to use the native CPU popcount (_mm_popcnt_u64 as a C intrinsic) instruction using numba intrinsics but this area is new to me. The llvm intrinsic I need to use is, I think, ctpop. Assuming this is right, how can I do this?

Answer: Try: import numba as nb from numba import types from numba.cpython import mathimpl from numba.extending import intrinsic @intrinsic def popcnt(typingctx, src): sig = types.uint64(types.uint64) def codegen(context, builder, signature, args): return mathimpl.call_fp_intrinsic(builder, "llvm.ctpop.i64", args) return sig, codegen @nb.njit(nb.uint64(nb.uint64)) def popcount(x): return popcnt(x) print(popcount(43))  Prints: 4
Question:  I was using this autotrain collab and when i labbelled and put my images into images folder and tried to run it , It says this error how do i solve this ? to reproduce :  click link of ipynb  make a new folder name images  add some images and replace the prompt to something which describes your images  go to runtime and run all   ipynb link

Answer: This is happening due to the newer version of diffusers library. At the very start, run pip install diffusers==0.20.2 and then execute the cells.
Question: I have the following MWE: import numba as nb @nb.njit(nb.uint64(nb.uint64)) def popcount(x): b=0 while(x > 0): x &= x - 1 b+=1 return b print(popcount(43))  It fails with: numba.core.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend) No implementation of function Function(<built-in function iand>) found for signature: >>> iand(float64, float64) There are 8 candidate implementations: - Of which 4 did not match due to: Overload of function 'iand': File: <numerous>: Line N/A. With argument(s): '(float64, float64)': No match. - Of which 2 did not match due to: Operator Overload in function 'iand': File: unknown: Line unknown. With argument(s): '(float64, float64)': No match for registered cases: * (bool, bool) -> bool * (int64, int64) -> int64 * (int64, uint64) -> int64 * (uint64, int64) -> int64 * (uint64, uint64) -> uint64 - Of which 2 did not match due to: Overload in function 'gen_operator_impl.<locals>._ol_set_operator': File: numba/cpython/setobj.py: Line 1508. With argument(s): '(float64, float64)': Rejected as the implementation raised a specific error: TypingError: All arguments must be Sets, got (float64, float64) raised from /home/user/python/mypython3.10/lib/python3.10/site-packages/numba/cpython/setobj.py:108 During: typing of intrinsic-call at /home/user/python/popcount.py (7) File "popcount.py", line 7: def popcount(x): <source elided> while(x > 0): x &= x - 1 ^  What is wrong with using uint64 for this?  The code fails with the same message even if I use: print(popcount(nb.uint64(43)) 

Answer: At first, I thought this was NumPy uint64 awkwardness. Turns out it's slightly different Numba uint64 awkwardness. By NumPy dtype rules, a standard Python int is handled as numpy.int_ dtype, which is signed. There's no integer dtype big enough to hold all values of both uint64 dtype and a signed dtype, so in mixed uint64/int operations, NumPy converts both operands to float64! You can't use & with floating-point dtypes, so that's where the error would come from with NumPy type handling. It turns out Numba uses different type handling, though. Under Numba rules, an operation on a uint64 and a signed integer produces int64, not float64. But then the assignment: x &= x - 1  tries to assign an int64 value to a variable that initially held a uint64 value. This is the part where Numba gets awkward. By Numba type inference rules,  A type variable holds the type of each variable (in the Numba IR). Conceptually, it is initialized to the universal type and, as it is re-assigned, it stores a common type by unifying the new type with the existing type. The common type must be able to represent values of the new type and the existing type. Type conversion is applied as necessary and precision loss is accepted for usability reason.  Rather than converting to uint64 or keeping int64, the Numba compiler tries to unify uint64 and int64 to find a new type to use. This is the part where Numba accepts precision loss and converts this version of the x variable to float64. Then you get the error about & not working on float64.
Question: I need to carry out a very simple operation in Polars, but the documentation and examples I have been finding are super convoluted. I simply have a date, and I would like to create a range running from the first day in the following month until the first day of a month twelve months later. I have a date: date = 2023-01-15 I want to find these two dates: range_start = 2023-02-01 range_end = 2024-02-01 How is this done in Polars? In datetime in Python from datetime import datetime from dateutil import relativedelta my_date = datetime.fromisoformat("2023-01-15") start = my_date.replace(day=1) + relativedelta.relativedelta(months=1) end = start + relativedelta.relativedelta(months=12)  Polars? # The format of my date import polars as pl my_date_pl = pl.lit(datetime.fromisoformat("2023-01-15")) ???? 

Answer: You can use dt.offset_by For example pl.select(pl.lit(datetime.fromisoformat("2023-01-15")).dt.offset_by("1mo")).item()  To avoid that error you can suffix "_saturating" to the offset like this... pl.select(pl.lit(datetime.fromisoformat("2023-01-31")).dt.offset_by("1mo_saturating")).item()  It'll produce an error if the next month doesn't have the same date for example Jan 31 + 1 month will error.
Question: python3 is a system wide program, just as pip3 is. I want to install IPython on Debian 12 (Bookworm). (This information is also relevant to newer Ubuntu versions, since these are derived directly from Debian and contain the same policy change.) I would probably expect this to also be a system-wide available program, just like python3 and pip3. Please correct me if that no longer makes sense, given the recent changes which prevent (by default) users from installing pip3 packages system wide, instead encouraging the use of venvs. Previously I would have run pip3 install ipython. What should I now do instead? Error message when attempting to run pip3 install ipython. error: externally-managed-environment × This environment is externally managed ╰─> To install Python packages system-wide, try apt install python3-xyz, where xyz is the package you are trying to install. If you wish to install a non-Debian-packaged Python package, create a virtual environment using python3 -m venv path/to/venv. Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make sure you have python3-full installed. If you wish to install a non-Debian packaged Python application, it may be easiest to use pipx install xyz, which will manage a virtual environment for you. Make sure you have pipx installed. See /usr/share/doc/python3.11/README.venv for more information. note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages. hint: See PEP 668 for the detailed specification. 

Answer: The actual solution I used, thanks to others for directing me to venv. python3 -m venv .venv source .venv/bin/activate # do this every time to use the venv created above pip3 install ipython  FYI for convenience one can also do ln -s .venv/bin/activate . . activate
Question: I'm trying to write a script in Polars that would flatten a list of prices per date and minute. The catch is I want to incrementally aggregate into columns and zero out values in the future. For example. Idea is to make this solution vectorized if possible to make it performant. df = pl.DataFrame({ "date": ["2022-01-01", "2022-01-01", "2022-01-02", "2022-01-02", "2022-01-02", "2022-01-03", "2022-01-03", "2022-01-03"], "minute": [1, 2, 1, 2, 3, 1, 2, 3], "price": [10, 20, 15, 10, 20, 30, 60, 70] })  Should build the following dataframe. shape: (8, 5) ┌────────────┬────────┬─────────┬─────────┬───────────┐ │ date ┆ minute ┆ 1_price ┆ 2_price ┆ 3_price │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞════════════╪════════╪═════════╪═════════╪═══════════╡ │ 2022-01-01 ┆ 1 ┆ 10 ┆ 0 ┆ 0 │ │ 2022-01-01 ┆ 2 ┆ 10 ┆ 20 ┆ 0 │ │ 2022-01-02 ┆ 1 ┆ 15 ┆ 0 ┆ 0 │ │ 2022-01-02 ┆ 2 ┆ 15 ┆ 10 ┆ 0 │ │ 2022-01-02 ┆ 3 ┆ 15 ┆ 10 ┆ 20 │ │ 2022-01-03 ┆ 1 ┆ 30 ┆ 0 ┆ 0 │ │ 2022-01-03 ┆ 2 ┆ 30 ┆ 60 ┆ 0 │ │ 2022-01-03 ┆ 3 ┆ 30 ┆ 60 ┆ 70 │ └────────────┴────────┴─────────┴─────────┴───────────┘ 

Answer: This seems to work df.join( df.pivot('minute', index='date'), on='date') \ .select("date", "minute", **{f"{x}_price":pl.when(pl.lit(x)<=pl.col('minute')) .then(pl.col(f"{x}")) .otherwise(0) for x in df['minute'].unique().sort()}) shape: (8, 5) ┌────────────┬────────┬─────────┬─────────┬─────────┐ │ date ┆ minute ┆ 1_price ┆ 2_price ┆ 3_price │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞════════════╪════════╪═════════╪═════════╪═════════╡ │ 2022-01-01 ┆ 1 ┆ 10 ┆ 0 ┆ 0 │ │ 2022-01-01 ┆ 2 ┆ 10 ┆ 20 ┆ 0 │ │ 2022-01-02 ┆ 1 ┆ 15 ┆ 0 ┆ 0 │ │ 2022-01-02 ┆ 2 ┆ 15 ┆ 10 ┆ 0 │ │ 2022-01-02 ┆ 3 ┆ 15 ┆ 10 ┆ 20 │ │ 2022-01-03 ┆ 1 ┆ 30 ┆ 0 ┆ 0 │ │ 2022-01-03 ┆ 2 ┆ 30 ┆ 60 ┆ 0 │ │ 2022-01-03 ┆ 3 ┆ 30 ┆ 60 ┆ 70 │ └────────────┴────────┴─────────┴─────────┴─────────┘  What your example shows is more than just flattening but it seems what you're looking for is that the x_price column should be 0 whenever the x is greater than whatever is in the minute column. That's what this does through a pivot, self join, and when/then/otherwise.
Question: I am currently trying to achieve a polars group_by while keeping other columns than the ones in the group_by function. Here is an example of an input data frame that I have. df = pl.from_repr(""" ┌─────┬─────┬─────┬─────┐ │ SRC ┆ TGT ┆ IT ┆ Cd │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ f64 │ ╞═════╪═════╪═════╪═════╡ │ 1 ┆ 1 ┆ 2 ┆ 3.0 │ │ 2 ┆ 1 ┆ 2 ┆ 4.0 │ │ 3 ┆ 1 ┆ 2 ┆ 3.0 │ │ 3 ┆ 2 ┆ 1 ┆ 8.0 │ └─────┴─────┴─────┴─────┘ """)  I want to group by ['TGT', 'IT'] using min('Cd'), which is the following code : df.group_by('TGT', 'IT').agg(pl.col('Cd').min()) With this code line, I obtain the following dataframe. ┌─────┬─────┬─────┐ │ TGT ┆ IT ┆ Cd │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ f64 │ ╞═════╪═════╪═════╡ │ 1 ┆ 2 ┆ 3.0 │ │ 2 ┆ 1 ┆ 8.0 │ └─────┴─────┴─────┘  And here is the dataframe I would rather want ┌─────┬─────┬─────┬─────┐ │ SRC ┆ TGT ┆ IT ┆ Cd │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ f64 │ ╞═════╪═════╪═════╪═════╡ │ 1 ┆ 1 ┆ 2 ┆ 3.0 │ │ 3 ┆ 2 ┆ 1 ┆ 8.0 │ └─────┴─────┴─────┴─────┘  I thing I could achieve this by joining the first dataframe on the grouped one using ['TGT', 'IT', 'Cd'], and then delete the doubled rows, as I only want one (and any) 'SRC' for each ('TGT', 'IT') couple. But I wanted to know if there is a more straightforward way to do it, especially by keeping the 'SRC' column during the group_by Thanks by advance

Answer: # Your data data = { "SRC": [1, 2, 3, 3], "TGT": [1, 1, 1, 2], "IT": [2, 2, 2, 1], "Cd": [3.0, 4.0, 3.0, 8.0] } df = pl.DataFrame(data) # Perform the group_by and aggregation result = ( df.group_by('TGT', 'IT', maintain_order=True) .agg( pl.col('SRC').first(), pl.col('Cd').min() ) .select('SRC', 'TGT', 'IT', 'Cd') # to reorder columns ) print(result)