Se rendre au contenu

Envoyez n'importe quel problème d'optimisation. Recevez une seule réponse.

Tournées, ordonnancement, planning, conditionnement, allocation, et tout autre problème qui a des décisions, des contraintes et un coût. Décrivez le problème une fois, nommez un solveur ou un méta-solveur, et payez à la seconde de résolution avec un plafond de coût strict sur chaque exécution.

POST /solve/v1/problems 201 Created prb_9f3c…

            {
            "api_version": "1",
            "problem": {
            "variables": [
            {"name": "chairs", "lower": 0},
            {"name": "tables", "lower": 0}
            ],
            "constraints": [
            {"expr": "4*chairs + 8*tables <= 160", "name": "machine_hours"},
            {"expr": "2*chairs + 3*tables <= 75", "name": "material"}
            ],
            "objective": {"sense": "max", "expr": "45*chairs + 80*tables"}
            },
            "solver": "highs",
            "options": {"compute_preset": "cpu-standard", "time_limit_seconds": 5, "tags": ["quickstart"]}
            }
        
"solver": "highs","compute_preset": "cpu-standard","time_limit_seconds": 5
Afficher toute l'enveloppe

            {
            "api_version": "1",
            "problem": {
            "variables": [
            {"name": "chairs", "lower": 0},
            {"name": "tables", "lower": 0}
            ],
            "constraints": [
            {"expr": "4*chairs + 8*tables <= 160", "name": "machine_hours"},
            {"expr": "2*chairs + 3*tables <= 75", "name": "material"}
            ],
            "objective": {"sense": "max", "expr": "45*chairs + 80*tables"}
            },
            "solver": "highs",
            "options": {"compute_preset": "cpu-standard", "time_limit_seconds": 5, "tags": ["quickstart"]}
            }
        
objective
1750
hold
réglé
wall_seconds
0.4
solver_used
highs
outcome
solved
termination_status
OPTIMAL
chairs
30
tables
5
GET /problems/{id}/result solution
Le démarrage rapide de la documentation, tel qu'il tourne. Optimum 30 chaises, 5 tables, objectif 1750.
Le problème

L'optimisation est difficile à acheter

Les mathématiques ont quatre-vingts ans derrière elles. C'est leur mise en production qui bloque les équipes, parce que le paysage des solveurs est fragmenté.

Chaque solveur est différent

API, format de modèle et licences propres. L'expertise sur l'un se transfère mal au suivant.

API, format, licence

Les contraintes se reformulent

Natif pour un moteur, refait pour un autre. Les résultats reviennent sous autant de formes qu'il y a de solveurs.

n solveurs, n formats

Toutes les contraintes ne sont pas gérées

Une exigence peut tomber hors de ce que votre moteur accepte. Vous déplacez alors tout le modèle, ou vous l'approchez de loin, et le modèle cesse de coller au problème réel.

une contrainte, un nouveau moteur

Les moteurs demandent du matériel différent

Certains tournent sur CPU, d'autres réclament un GPU. Choisir un moteur, c'est désormais provisionner la machine qui le fait tourner, avant de savoir s'il l'emporte.

CPU ou GPU, selon le moteur

Le choix, c'est l'expertise

Savoir quel moteur convient à vos contraintes est en soi une question de recherche. Y répondre correctement demande un spécialiste d'un domaine qui n'est pas le vôtre.

le choix est le travail

Le meilleur moteur ne cesse de changer

Les solveurs publient des versions, et celui qui l'emportait sur vos instances l'an dernier ne l'emporte peut-être plus. Personne dans votre équipe n'est payé pour refaire ce banc d'essai.

chaque version rebat les cartes

Les modèles de données se soudent aux éditeurs

Engagez-vous sur un solveur et votre schéma s'engage aussi, en silence. En sortir, c'est défaire la soudure sous pression.

une seule enveloppe à la place

Ce que nous prenons en charge

Écrivez le modèle. Nous faisons tourner tout ce qu'il y a dessous.

Rien dans cette liste ne concerne votre métier. Tout cela est de la mécanique, et la mécanique est à nous.

Trois choses que vous faites
  • Écrire le modèle : les décisions, les contraintes, l'objectif.
  • Fixer une échéance et un plafond de coût pour l'exécution.
  • Lire la réponse, toujours sous la même forme.
Sept choses que vous arrêtez de faire
  • Apprendre une nouvelle API, un nouveau format de modèle et une nouvelle licence pour chaque moteur.
  • Reformuler les mêmes contraintes pour le moteur suivant.
  • Abandonner une exigence parce que le moteur ne la prend pas.
  • Provisionner une machine GPU pour une exécution d'une minute.
  • Décider quel moteur convient au problème que vous avez devant vous.
  • Refaire les bancs d'essai à chaque nouvelle version de solveur.
  • Laisser le schéma d'un éditeur entrer dans votre base de données.

Ajoutez une contrainte le trimestre prochain : votre modèle change, rien d'autre.

L'enveloppe

Une enveloppe, versionnée

Quatre parties. Nous possédons et validons l'emballage. Le problème à l'intérieur est le vôtre.

envelope.json
{
  "api_version": "1",
  "problem": {
    "variables": [
      {"name": "chairs", "lower": 0},
      {"name": "tables", "lower": 0}
    ],
    "constraints": [
      {"expr": "4*chairs + 8*tables <= 160",
       "name": "machine_hours"},
      {"expr": "2*chairs + 3*tables <= 75",
       "name": "material"}
    ],
    "objective": {
      "sense": "max",
      "expr": "45*chairs + 80*tables"
    }
  },
  "solver": "highs",
  "options": {
    "compute_preset": "cpu-standard",
    "time_limit_seconds": 5,
    "tags": ["quickstart"]
  }
}
api_version
La version du protocole. Toujours "1" aujourd'hui.
problem
Votre modèle : variables, contraintes, un objectif. Opaque pour nous, validé par le solveur.
solver
Un nom de solveur concret, ou un nom de méta-solveur : un ensemble nommé de moteurs membres, dont n'importe lequel peut prendre le travail.
options
time_limit_seconds, compute_preset, webhook, idempotency_key, tags. Tous facultatifs.

Nous traitons le corps de votre problème comme opaque. Le manager valide l'enveloppe et mesure le calcul, mais ne lit jamais votre modèle.

Soumettre, suivre, récupérer

La soumission renvoie aussitôt un identifiant et un statut queued. Enregistrez un webhook signé et la réponse vous parvient d'elle-même, ou gardez une requête ouverte sur l'appel wait jusqu'à la fin du problème. Récupérez la solution en un appel.

solved
une solution optimale ou dans la tolérance
no_solution
infaisable ou non borné, prouvé et facturé, parce que la preuve est le produit
limit
un budget a arrêté la résolution ; la solution courante est renvoyée s'il en existe une
error
le moteur a cassé sur ce modèle ; pas de réessai, choisissez un autre solveur ou reformulez

Conçu pour des solveurs qui plantent et des réseaux qui coupent

Une résolution plantée ou bloquée est détectée et remise en file, puis reprise. Vous êtes facturé une seule fois, pour la tentative réussie. Les webhooks terminaux sont réessayés avec temporisation croissante, puis versés dans un journal dead-letter que vous pouvez inspecter et rejouer.

Une enveloppe, deux tentatives, une facture

Taille de l'enveloppe
jusqu'à 20 Mo
Limite de temps
300 s par défaut, 6 h au maximum
Soumission par lot
jusqu'à 100 enveloppes en un appel
Relances des webhooks
1 min, 5 min, 25 min, 2 h, puis dead-letter
Signature
X-Solve-Signature, HMAC SHA-256 sur le corps brut
Facturation après un plantage
une seule fois, uniquement la tentative réussie
Annulé en file
gratuit, réserve libérée
Limitation de débit
429 avec Retry-After
Moteurs

Chaque moteur que nous exécutons, et s'il répond en ce moment

Aucun moteur n'est publié sur ce site pour l'instant.

Les moteurs ouverts tournent chez nous. Les moteurs commerciaux tournent sous votre propre licence. Un méta-solveur est un ensemble nommé de moteurs membres, pas une boîte noire, et le moteur utilisé et son prix sont indiqués sur chaque résultat.

Tarifs

Mesuré comme du calcul, chiffré avant l'exécution

cost = base_fee + ceil(seconds × effective_rate)

Chaque moteur a des frais de base publiés et un tarif par seconde du calcul qu'il réserve, et chaque profil de calcul multiplie ce tarif. Le coût maximum découle du moteur, du profil et de la durée que vous fixez, et il est réservé sur votre solde avant le démarrage de la résolution. Vous payez les secondes utilisées. Annulez quand vous voulez et payez ces secondes, jamais plus. Crédits offerts à l'inscription, sans carte.

API

Une API REST qui se lit d'une traite

Des points de terminaison versionnés, des erreurs structurées qui nomment le champ fautif, des webhooks signés avec un journal de livraison visible, et un flux d'événements quand vous ne pouvez pas les recevoir. Chaque intégration fait les trois mêmes gestes : soumettre, suivre, récupérer.

jumpy, notre SDK Python

Écrivez le modèle en Python et lisez la solution sous forme d'objets. La soumission, l'appel wait, la vérification des webhooks et les réessais idempotents sont déjà emballés. Le Studio l'exécute dans le navigateur, sans rien installer.

Sécurité

Clés cantonnées, secrets hachés, sortie réseau contrôlée

Clés

Les clés nommées ne fonctionnent que sur l'API d'optimisation et se révoquent une par une : vous en faites tourner une sans toucher aux autres.

Secrets

Stockés uniquement sous forme de hachages. Le secret brut est affiché une fois et jamais plus.

Sortie des webhooks

Les cibles sont vérifiées face aux plages privées et de métadonnées avant que nous nous connections : une URL détournée ne peut pas atteindre de services internes.

Conservation

Les charges utiles sont purgées selon un calendrier publié, 90 jours par défaut. Les métadonnées restent pour votre piste d'audit.

Les questions que les ingénieurs posent vraiment

Puis-je forcer un solveur précis ?

Oui. Nommez un solveur concret dans l'enveloppe et il est respecté à la lettre. Un méta-solveur, c'est pour quand vous préférez ne pas choisir.

Quelles classes de problème sont prises en charge ?

Tout ce que les moteurs connectés résolvent : LP, MIP, NLP, CP, ordonnancement et tournées. L'enveloppe est agnostique quant à la classe de problème, par conception.

Que se passe-t-il si une résolution plante en cours ?

Elle est détectée et remise en file automatiquement, puis reprise. Vous la voyez dans l'historique des tentatives, et vous êtes facturé une seule fois, pour la tentative réussie.

Combien de temps conservez-vous les données de mon problème ?

Les charges utiles sont purgées selon un calendrier publié, 90 jours par défaut. Les métadonnées restent pour votre piste d'audit. Après la purge, une récupération renvoie 410 purged.

Votre première résolution est à cinq minutes

Lancez un vrai modèle sur un vrai solveur, dans le navigateur. Sans compte, sans carte bancaire.