Showcase: PC Configurator

Our configurator is evolving, both in the front- and in the back-end! Our compiler supports ever more complex symbolic models. We are proud to present the PC-Configurator that we wished we had when buying hardware ourselves! Check out this article to see how it works. This configurator does not yet calculate the price of the PC, which is a feature we are tackling soon.

The PC-Configurator

The PC-Configurator combines a few common pain points when dealing with more complex products with interlocking requirements:

Our symbolic configurator solves all these issues and offers a user-friendly authoring process on-top! Other configurators burden users with early choices about their preferred Mainboard / their preferred processor, before being able to decide e.g. the available memory - even though the memory is constrained by their earlier choice. Our configurator directly presents all choices, enabling users to input their requirements without needing to worry about internal constraints.

Authoring Process

Flowchart of configurator process, from Python via the Symbolic Platform to our internal representation and then to the live configurator.

As a configurator author, you don’t have to worry about the complex logical representation of the configurator. You encode it in a linear format you are used to and the symbolic platform computes the rest from there. The linear format can be Python code (as you see below) or an even more user-friendly option based on visual programming:

Visual representation of the Python code below using Google's Blockly

Full Python-Code of the Configurator

The configurator is built from Python-code. The code is processed by our symbolic platform into a logical representation of all constraints. These encode the linear relations between all separate rules and respect overriden variables like the configurator author would expect their behavior.

from ok import choice

class PC:
    def cpu_intel(self):
        self.cpu = choice("intel-3", "intel-5", "intel-7")
        self.pcie_lanes = "16"

        if self.cpu == "intel-3":
            self.psu = choice("low", "medium")
            self.memory_slots = "2"
            self.gpu = "integrated"
        elif self.cpu == "intel-5":
            self.gpu = "dedicated"
            self.psu = choice("medium", "high")
            self.memory_slots = choice("2", "4")
        elif self.cpu == "intel-7":
            self.gpu = "dedicated"
            self.psu = "high"
            self.memory_slots = "4"
            self.pcie_lanes = "22"

    def cpu_amd(self):
        self.cpu = choice("ai", "ai-360")
        self.pcie_lanes = "18"
        self.memory_slots = "4"
        self.gpu = "integrated"

        if self.cpu == "ai":
            self.psu = choice("low", "medium", "high")
        elif self.cpu == "ai-360":
            self.psu = "high"
            self.pcie_lanes = "20"

    def memory(self):
        if self.memory_slots == "2":
            self.ram = choice("8 GB", "16 GB")
        elif self.memory_slots == "4":
            self.ram = choice("32 GB", "64 GB")

    def gpu(self):
        # This will improve greatly once integer support lands.
        if self.gpu == "integrated":
            if self.pcie_lanes == "20" or self.pcie_lanes == "22":
                self.gpu = choice("rtx5070", "rtx5080", "rtx5090", "integrated")
            else:
                self.gpu = choice("rtx5070", "integrated")
        else:
            if self.pcie_lanes == "20" or self.pcie_lanes == "22":
                self.gpu = choice("rtx5070", "rtx5080", "rtx5090")
            else:
                self.gpu = "rtx5070"

        if self.gpu == "rtx5080":
            assert self.psu == "medium" or self.psu == "high"
        elif self.gpu == "rtx5090":
            assert self.psu == "high"
        elif self.gpu == "rtx5070":
            assert self.psu == "low" or self.psu == "medium" or self.psu == "high"

    def configure(self):
        self.cpu_brand = choice("intel", "amd")

        if self.cpu_brand == "intel":
            self.cpu_intel()
        elif self.cpu_brand == "amd":
            self.cpu_amd()

        self.memory()

        self.gpu()

Contact us if you want to configure your systems with our technology!