Skip to main content

Mathematical modeling tool for optimization problem

Project description

JijModeling

PyPI version shields.io PyPI pyversions PyPI implementation PyPI format PyPI license PyPI download month

JijModeling is a Python package designed to intuitively write mathematical optimization models. Its main features are:

  • Allows writing models without specific instance data, leading to quicker verification of the model and easy reuse. Instance size does not affect the performance of writing and manipulating the model.
  • Works as a common interface for different kinds of optimization problems, including Linear Programming, Mixed Integer Programming, or Non-Linear Programming, and so on.
  • Models can be manipulated programmatically, allowing building up a model piece-by-piece and more complex logic in constraint construction.
  • Supports outputting to LaTeX. Mixed with Jupyter notebooks, this allows quick interactive feedback to check that your model fits what you expect.

JijModeling is a tool for writing models using Python code, it does not evaluate or solve the models. The main motivation is to focus on the algebraic structure of the models, so that they can be reasoned about, verified and more nimbly altered regardless of the instance data, while still serving as a step towards generating the input formats the solvers expect.

To be used with solvers, it needs to be paired with the actual instance data and converted into the specific solver’s input format by another tool, such as our internal JijZept services, or with the freely available jijmodeling-transpiler.

Installation

If you use pip, you can install JijModeling with:

pip install jijmodeling

Note that JijModeling requires Python 3.9 or higher.

Quickstart example

To get a better idea of how to use jijmodeling, we’ll go over a basic example, starting with writing a simple model, converting it, then executing it with a solver. For the first two sections, jijmodeling is all you need, but we recommend using a Jupyter notebook to easily check LaTeX output.

For the third section, we will be using JijModelingTranspiler and OpenJij. Note that jijmodeling models are also usable with our paid JijZept services. JijMdelingTranspiler and OpenJij can be installed as usual through pip:

pip install jijmodeling-transpiler openjij

Overview

Working with JijModeling should feel natural to anyone familiar with mathematical optimization models.

We represent various mathematical expressions by combining various classes, like BinaryVar and Placeholder using basic mathematical operations. ___Var classes refer to different kinds of decision variables. Placeholder represents just about any kind of constant or value to be specified later. That is, they’re something we want to abstract away from the model and mark as part of instance-specific data. You can also use number literals, of course.

import jijmodeling as jm

x = jm.BinaryVar("x")
y = jm.IntegerVar("y", lower_bound=1, upper_bound=10)
n = jm.Placeholder("n")
exp = x * (y ** 2) * n

The placeholder and variables above are zero-dimensional (scalars), but we can also represent arrays/multi-dimensional variables and constants using these classes, as we’ll see later on.

In JijModeling, we build up a model by adding expressions like this to a Problem object, representing our model as a whole. Constraints are defined by the Constraint class wrapping around some comparison expression. (Note that only <=, ==, and >= are supported in Constraints).

a = jm.IntegerVar("a", lower_bound=5, upper_bound=20)
b = jm.IntegerVar("b", lower_bound=1, upper_bound=20)
c = jm.IntegerVar("c", lower_bound=20, upper_bound=30)
n = jm.Placeholder("n")

problem = jm.Problem("my problem")
problem += n * (a + b + c)
problem += jm.Constraint("c1", 2 * (b + c) <= 75)
problem += jm.Constraint("c2", a + b <= 40)
problem

The above should output a model like this: (in a Jupyter notebook you’ll also see a description of the decision variables, omitted here for brevity)

$$ \begin{array}{cccc}\text{Problem:} & \text{my problem} & & \ & & \min \quad \displaystyle n \cdot \left(a + b + c\right) & \ \text{{s.t.}} & & & \ & \text{c1} & \displaystyle 2 \cdot \left(b + c\right) \leq 75 & \ & \text{c2} & \displaystyle a + b \leq 40 \ \end{array} $$

Writing a model

Let’s see how we would model a generic Knapsack problem.

In this problem, we have $N$ valuable items. We want to take as many items as possible, but we can only carry so much with us, determined by a weight limit $W$. We’ll be representing the decision to take some item $i$ with the binary variable $x_{i}$. That item’s weight is $w_i$ and its value $v_i$.

Let’s first define these values:

W = jm.Placeholder("W") # The maximum weight we can carry
# The values and weights of each items can represented as
# one-dimensional Placeholders.
values = jm.Placeholder("v", ndim=1) 
weights = jm.Placeholder("w", ndim=1) 
# We can define N in relation to the size of our placeholders,
# so it's calculated automatically based on the instance data.
# The optional "latex" parameter lets us define how this is
# displayed in the LaTeX output.
N = values.len_at(0, latex="N")

# we have N decision variables, which we represent with a 
# one-dimensional BinaryVar. We must specify that it has N elements.
x = jm.BinaryVar("x", shape=(N,))

# an index we'll use for summations
i = jm.Element("i", (0,N))

At the end we create an Element. These are used as indices. With jijmodeling.sum, this allows us to write summations in a style similar to Sigma notation. Here we define that this index goes from 0 (inclusive) to $N$ (non-inclusive). It can feel strange to write these ahead of time, but doing so allows us to reuse it and is more convenient overall.

For this problem we want to maximize our total value, while making sure the total weight is within our limit. We can write that like this:

problem = jm.Problem("knapsack", sense = jm.ProblemSense.MAXIMIZE)
problem += jm.sum(i, values[i] * x[i])
problem += jm.Constraint("weight limit", jm.sum(i, weights[i] * x[i]) <= W)
problem

This gives us the model we’d expect:

$$ \begin{array}{cccc}\text{Problem:} & \text{knapsack} & & \ & & \max \quad \displaystyle \sum_{i = 0}^{N - 1} v_{i} \cdot x_{i} & \ \text{{s.t.}} & & & \ & \text{weight limit} & \displaystyle \sum_{i = 0}^{N - 1} w_{i} \cdot x_{i} \leq W & \ \text{{where}} & & & \ & x & 1\text{-dim binary variable}\ \end{array} $$

As a reminder, JijModeling expressions can be stored in variables like regular python objects. When working with larger problems, complex expressions can be built up from smaller ones, which can be easier to understand and modify later. For a problem this small this is not that useful, but just to illustrate, the previous code snippet could be rewritten like this:

chosen_v = values[i] * x[i]
chosen_w = weights[i] * x[i]
sum_of_values = jm.sum(i, chosen_v)
sum_of_weights = jm.sum(i, chosen_w)
weight_below_limit = sum_of_weights <= W

problem = jm.Problem("knapsack", sense = jm.ProblemSense.MAXIMIZE)
problem += sum_of_values
problem += jm.Constraint("weight limit", weight_below_limit)
problem

These two models are equivalent. How you write the model is a matter of preference and convenience.

Using the model

Now we have our model, though not much can be done with it by itself other than exporting it to LaTeX. We can pair it with instance data to generate the input for an optimization solver. To demonstrate, let’s see how we’d use it with the freely available JijModelingTranspiler to convert it, and OpenJij to solve the model. Note that our tooling provided with JijZept also accepts JijModeling models as input.

This is meant as a quick demonstration, not a full introduction to JijModelingTranspiler and OpenJij features. You can check their documentation for more information.

With JijModelingTranspiler, we can pass along our instance data to create an intermediary representation that can be converted to different formats quickly, but in our case we'll just convert it to QUBO.

from jijmodeling_transpiler.core import compile_model
from jijmodeling_transpiler.core.pubo import transpile_to_pubo

data = {
 "W": 100,
 "v": [100, 90, 80, 70, 60, 50, 40, 30],
 "w": [1, 5, 10, 20, 30, 40, 50, 60, 70],
}

compiled = compile_model(problem, data)
qubo, _ = transpile_to_pubo(compiled).get_qubo_dict()
qubo

We now have a QUBO dictionary, which is valid input for certain optimization solvers. Writing out this kind of dictionary by hand would be very prone to error, but thankfully we just had to write out the model in a human-friendly way which is easier to verify. We can now use this dictionary with openjij to actually solve the problem:

import openjij as oj

sampler = oj.SASampler()
response = sampler.sample_qubo(qubo, num_reads=1)
response.first

This is using openjij's simulated annealing sampler, with the num_reads parameter saying we want to just sample it once. We can increase that to sample the solver multiple times, and then the response object would allow us to explore the different results. But for a problem of this size, all samples will just reach the optimal solution anyway, so here we’ve done a single sample and are looking at just the “best” solution found. It’s an object that looks like:

Sample(sample={0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 0, 7: 0}, energy=-5.501111111111113, num_occurrences=1)

The sample dictionary gives us the value the solver figured out for each of the decision variables. There’s a lot more that can be done here with Transpiler and OpenJij to better process and visualize the results, or reuse the same model for different purposes, but for that you should check out their respective documentation pages.

Next Steps

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

jijmodeling-1.8.0-cp311-none-win_amd64.whl (3.0 MB view details)

Uploaded CPython 3.11 Windows x86-64

jijmodeling-1.8.0-cp311-cp311-manylinux_2_28_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.28+ x86-64

jijmodeling-1.8.0-cp311-cp311-manylinux_2_28_aarch64.whl (3.3 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.28+ ARM64

jijmodeling-1.8.0-cp311-cp311-macosx_13_0_x86_64.macosx_13_0_arm64.macosx_13_0_universal2.whl (6.2 MB view details)

Uploaded CPython 3.11 macOS 13.0+ ARM64 macOS 13.0+ universal2 (ARM64, x86-64) macOS 13.0+ x86-64

jijmodeling-1.8.0-cp311-cp311-macosx_12_0_x86_64.macosx_12_0_arm64.macosx_12_0_universal2.whl (6.2 MB view details)

Uploaded CPython 3.11 macOS 12.0+ ARM64 macOS 12.0+ universal2 (ARM64, x86-64) macOS 12.0+ x86-64

jijmodeling-1.8.0-cp311-cp311-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl (6.1 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64 macOS 11.0+ universal2 (ARM64, x86-64) macOS 11.0+ x86-64

jijmodeling-1.8.0-cp311-cp311-macosx_10_16_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.11 macOS 10.16+ x86-64

jijmodeling-1.8.0-cp310-none-win_amd64.whl (3.0 MB view details)

Uploaded CPython 3.10 Windows x86-64

jijmodeling-1.8.0-cp310-cp310-manylinux_2_28_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.28+ x86-64

jijmodeling-1.8.0-cp310-cp310-manylinux_2_28_aarch64.whl (3.3 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.28+ ARM64

jijmodeling-1.8.0-cp310-cp310-macosx_13_0_x86_64.macosx_13_0_arm64.macosx_13_0_universal2.whl (6.2 MB view details)

Uploaded CPython 3.10 macOS 13.0+ ARM64 macOS 13.0+ universal2 (ARM64, x86-64) macOS 13.0+ x86-64

jijmodeling-1.8.0-cp310-cp310-macosx_12_0_x86_64.macosx_12_0_arm64.macosx_12_0_universal2.whl (6.2 MB view details)

Uploaded CPython 3.10 macOS 12.0+ ARM64 macOS 12.0+ universal2 (ARM64, x86-64) macOS 12.0+ x86-64

jijmodeling-1.8.0-cp310-cp310-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl (6.1 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64 macOS 11.0+ universal2 (ARM64, x86-64) macOS 11.0+ x86-64

jijmodeling-1.8.0-cp310-cp310-macosx_10_16_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.10 macOS 10.16+ x86-64

jijmodeling-1.8.0-cp39-none-win_amd64.whl (3.0 MB view details)

Uploaded CPython 3.9 Windows x86-64

jijmodeling-1.8.0-cp39-cp39-manylinux_2_28_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.28+ x86-64

jijmodeling-1.8.0-cp39-cp39-manylinux_2_28_aarch64.whl (3.3 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.28+ ARM64

jijmodeling-1.8.0-cp39-cp39-macosx_13_0_x86_64.macosx_13_0_arm64.macosx_13_0_universal2.whl (6.2 MB view details)

Uploaded CPython 3.9 macOS 13.0+ ARM64 macOS 13.0+ universal2 (ARM64, x86-64) macOS 13.0+ x86-64

jijmodeling-1.8.0-cp39-cp39-macosx_12_0_x86_64.macosx_12_0_arm64.macosx_12_0_universal2.whl (6.2 MB view details)

Uploaded CPython 3.9 macOS 12.0+ ARM64 macOS 12.0+ universal2 (ARM64, x86-64) macOS 12.0+ x86-64

jijmodeling-1.8.0-cp39-cp39-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl (6.1 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64 macOS 11.0+ universal2 (ARM64, x86-64) macOS 11.0+ x86-64

jijmodeling-1.8.0-cp39-cp39-macosx_10_16_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.9 macOS 10.16+ x86-64

File details

Details for the file jijmodeling-1.8.0-cp311-none-win_amd64.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 aefdeae1c5e799ad585d87774df4a190e7f5175f5c4e289ac3f055096a3d9f06
MD5 275fadc54c2be1cd8c5c9f5a72cc07b0
BLAKE2b-256 72338e2a477a9376953bdb0b23917f21fd7f37b801e5239f0d000ac1ba7a812c

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a8b52699aca495314c99f819265807493dceed3a0d549aa06babeee8ac0d92e9
MD5 a980170858c907c4e519bbb4b1e288ba
BLAKE2b-256 ac9eb71b4a48dcd947a476d4d68fe846778f54bd4dfd6b6eb1d2ca4b5ce83155

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 997f78cf054c72e594342bae8e0cd39cb073afb4879cff7a064f4a40fa56b7cd
MD5 3dd32d7755cb5a6e62cf52eafed0beec
BLAKE2b-256 f733844ead1745236637cb13b397ada49c3dd2fd4c9b2b4411074402e2812271

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp311-cp311-macosx_13_0_x86_64.macosx_13_0_arm64.macosx_13_0_universal2.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp311-cp311-macosx_13_0_x86_64.macosx_13_0_arm64.macosx_13_0_universal2.whl
Algorithm Hash digest
SHA256 62d5e1b4332717c98093bc90b73d9bd89b4c2ae450815e1eb23a250daa2b5128
MD5 f5d06e2345a8595bba7a67bcf569a15b
BLAKE2b-256 ae326f4e85864df41d76699a6fdd90b600c96194cbf08871f4d728cfb8579315

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp311-cp311-macosx_12_0_x86_64.macosx_12_0_arm64.macosx_12_0_universal2.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp311-cp311-macosx_12_0_x86_64.macosx_12_0_arm64.macosx_12_0_universal2.whl
Algorithm Hash digest
SHA256 12af0ab059404cc9277008336545c584be15e828a0c9f3c136bb2c05d7bc2537
MD5 02819ebf9a3965d515ce5aec10263be7
BLAKE2b-256 dc2c554f13a660cd23b3ad0e7fd6d065c3c145370c9191a5ce0a3fad49e15577

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp311-cp311-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp311-cp311-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9c99a8ad88018a914cf51adc446528b5f49f9f65ee04851e2e8e6aeef9e2bc12
MD5 38b10fb3d17ff20e26ea830217bf8e15
BLAKE2b-256 7c2af34876b9d646c845de1bacacf49a6eeef873e1488f34f2b24e0e887ab136

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp311-cp311-macosx_10_16_x86_64.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp311-cp311-macosx_10_16_x86_64.whl
Algorithm Hash digest
SHA256 b97d049f22004e26afc2417bc101c463ee012c19c213e5757d33f603a7ef4a3f
MD5 d4c7eab2f368e8190a6d0bf3579690e5
BLAKE2b-256 6c1f5563d46967b722807904a900b6ecf4663855309672f8ef2ec65859d98772

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp310-none-win_amd64.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 678ecd45ef4723402badc96d052524033317321b34146b4c7bfc83a9b36cffb7
MD5 bded97aa55a021b61d933efb380c34e9
BLAKE2b-256 ddaeda8e9004adf4dd0dfcf6a6c41f9e135d4b3e14646c4fa9fd428c114f608b

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8311e68ee10c6086a69ba246a8b63e275b5edfdc2dcccbb930f801c069783e4d
MD5 7dc699c8116ec7dd79cb567985b0ede4
BLAKE2b-256 d48d4141e025dfeb6dd847d592631eea8ca9679cc8570b1b0bd8aacd262ace0b

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 44ce540465f52f7a18a5290f8e91ec5368a0e84a3b6494be73328ca77d4c964b
MD5 9c6fbe7774c1b636ac95d9aa7d92f40c
BLAKE2b-256 ac0a73774469784b5374b1a045f8be3e5f89b8b385658547887dfdd7d2061d94

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp310-cp310-macosx_13_0_x86_64.macosx_13_0_arm64.macosx_13_0_universal2.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp310-cp310-macosx_13_0_x86_64.macosx_13_0_arm64.macosx_13_0_universal2.whl
Algorithm Hash digest
SHA256 74959221c4ad00dfdc866e65065c776dc22a24a0c15e44d1eacebaae20465033
MD5 ff588152b21ae032099ce47b66b5809c
BLAKE2b-256 72d37248ebfa7210bbe09b7c3ac8d83c5b8e637b0edc469780183e05209c86e6

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp310-cp310-macosx_12_0_x86_64.macosx_12_0_arm64.macosx_12_0_universal2.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp310-cp310-macosx_12_0_x86_64.macosx_12_0_arm64.macosx_12_0_universal2.whl
Algorithm Hash digest
SHA256 fd8f9405be3910c55f199844c02c41e2979aae660c4f283f2deb1078c51a9ce2
MD5 4f68f66a6b23124c6db8af124c0c7eff
BLAKE2b-256 fe4f028ff5eb27690bec449c972e99e2cacd6d6ca4d92a82bcb65923883d3f7d

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp310-cp310-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp310-cp310-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 d974c5f1c12e6307730392f11c3ef565117fcf6696d69483c2eacaa1fcd88c2c
MD5 c14541d3f2cf7561670a742dc3e83169
BLAKE2b-256 d67596bd5ed1dbc8f4dfa53e7fb5d35c1da23dea4e3e202d25b3764d0cef49de

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp310-cp310-macosx_10_16_x86_64.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp310-cp310-macosx_10_16_x86_64.whl
Algorithm Hash digest
SHA256 f89d76620be61625915c5c8da46d90f4738f9592dc4698682e7a9ffc6e059cb9
MD5 e4a0506ad8a8df0f0edb348ce7a1345d
BLAKE2b-256 109b84c1a4394c9063d9bf1aa3270b2c8d6b0ffd902415f5496dac93fb63f52c

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp39-none-win_amd64.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 218eda5f3063c22cd17b1ebb87285e8cc20a009b096c1c51ada9ef80345f9e48
MD5 11d7f71a6bad1be019f7a1f5b65484e5
BLAKE2b-256 d121532498bc990de3af133e5321bbc77545cbc42b450bf909069a0fd4ea81d1

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp39-cp39-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 13323973ddfff1a9101d9c7cff6d6842db219af86ed107ab1a11d07d80a166ef
MD5 42efce9efb9385e714331a035916d755
BLAKE2b-256 92e8f4e43917fe7fb688e5b40b6ddf8187c73e455ad69d5a83d8ff382c8dfb96

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp39-cp39-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6eeb7b3181acfcc686d4617424dbeb7c301e63a37f6dbcac184084d7ff2391aa
MD5 750720ceca78ae42cd1733e29d662914
BLAKE2b-256 c136920d9c21fe0d143c9c8f8055478ad20d5d63704d7a28697cb35ec4c5eaa2

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp39-cp39-macosx_13_0_x86_64.macosx_13_0_arm64.macosx_13_0_universal2.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp39-cp39-macosx_13_0_x86_64.macosx_13_0_arm64.macosx_13_0_universal2.whl
Algorithm Hash digest
SHA256 7becd08ad73346fb527ac9d8f52564d8845d9968bc254087bc65ded0c9d11dba
MD5 f1447c34707216e8f964265194ea14f7
BLAKE2b-256 bf01555f64494716b3bfec58106578c593b26b94996533a8c1dd04a8859d1964

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp39-cp39-macosx_12_0_x86_64.macosx_12_0_arm64.macosx_12_0_universal2.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp39-cp39-macosx_12_0_x86_64.macosx_12_0_arm64.macosx_12_0_universal2.whl
Algorithm Hash digest
SHA256 a33401cd57604f2c4291709fc18463b975c64778bffb2c57cc01a8ee8329ec90
MD5 761cbce593027776a8cddc3dba619b1c
BLAKE2b-256 cea0befa769b0b606c5984126be20ffd82ff585aa5897d9fcf2bcd61c371e783

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp39-cp39-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp39-cp39-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 19e7ad7c0b8447317200c405b7c74e70b3a7eda5e6454159a43e3e2112c7b282
MD5 e3eece09aa93154e11e427f9cbca268a
BLAKE2b-256 19f20a61187ced083a2c9f4025a1ae710c41070b9e60159cf50816243e216266

See more details on using hashes here.

File details

Details for the file jijmodeling-1.8.0-cp39-cp39-macosx_10_16_x86_64.whl.

File metadata

File hashes

Hashes for jijmodeling-1.8.0-cp39-cp39-macosx_10_16_x86_64.whl
Algorithm Hash digest
SHA256 0e4a87ffd9337af2c79bcdc22da9632c018139ab7dde24311b4a38c4321b491e
MD5 f9bc8f70f1f8a25512f0db66a1162f80
BLAKE2b-256 c09bfeaa16bb01480fca491fd3da1a756b23d975a76870900cb5d34203478ef9

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page